Zum Inhalt springen

aufgabe mit fscanf, malloc und insertion sort


Empfohlene Beiträge

Geschrieben

hallo zusammen. ziel der aufgabe steht ja im titel.

ich habe also angefangen ersteinmal ohne malloc zu programmieren.

mein erstes ziel ist die erfolgreiche ausgabe einer ausgelesenen datei mit fscanf.

in der test text datei steht 5555;552

es sollen natürlich nur die zahlen ausgelesen werden.

hier mein bisheriger code:


static int i[6000];

	int zeichen,anzahl=0;


	FILE*datei = fopen (/*argv[1]*/ "c:\\test.txt","r");


	if (datei == NULL)

	{

		printf("Error");

	}



	do

	{

		zeichen = fscanf(datei,"%d",&i);


		if (zeichen == 1)

		{

			anzahl++;

		}

		else

		{

			fseek(datei,1L,SEEK_CUR);

		}


		printf("%d ",i);



	}while(!feof(datei));


	fclose(datei);

ich habe da anscheinend großen mist gebaut. wer kann mir helfen, oder verbessern?

mfg

voldemort

Geschrieben

ok. ich habe meinen fehler so weit schonmal gefunden. ich habe irgendwie schon probiert malloc einzubauen, obwohl ich es ja erstmal nicht wollte :old

die ausgabe ist nun da, jedoch wiederholt sich die letzte zahl nochmals und ich komme nicht drauf warum


        int i;

	int zeichen,anzahl=0;


	FILE*datei = fopen ("c:\\test.txt","r");


	if (datei == NULL)

	{

		printf("Error");

	}



	do

	{

		zeichen = fscanf(datei,"%d",&i);

		if (zeichen == 1)

		{

			fseek (datei, 1, SEEK_CUR);

		} 

		printf("%d ",i);



	}while(!feof(datei));


	fclose(datei);

Geschrieben (bearbeitet)

hab natürlich währendessen mal weiter gemacht und es auch so weit geschafft das nun keine fehlermeldung mehr erscheint. mit meiner testdatei funktioniert das ganze auch noch.


int i,k,l,tmp;

	int zeichen,anzahl=0,zahl=0,*speicher;


	FILE*datei = fopen (/*argv[1]*/ "c:\\zahlen.csv" ,"r");


	if (datei == NULL)

	{

		printf("Error");

	}



	do

	{

		zeichen = fscanf(datei,"%d",&i);

		if (zeichen == 1)

		{

			fseek (datei, 1, SEEK_CUR);

			anzahl++;

		} 



	}while(!feof(datei));


	speicher = (int*) malloc (anzahl * sizeof (int) );


	fseek (datei, 0L, SEEK_SET);


	do

	{

		zeichen = fscanf(datei,"%d",&i);

		if (zeichen == 1)

		{

			fseek (datei, 1, SEEK_CUR);

			speicher[zahl]=i;

			zahl++;

		} 

	}while(!feof(datei));


	fclose(datei);


	for (k = 0; k < anzahl; k++)

	{

		for (l = 1+k; l < anzahl; l++)

		{

			if (speicher [k] > speicher [l])

			{

				tmp = speicher [l];

				speicher [l] = speicher [k];

				speicher [k] = tmp;

			}

		}

	}


	for (l = 0; l < anzahl; l++)

	{

		printf ("%d \n", speicher[l]);

	}

wenn ich nun aber eine datei nehme welche die zahlen von 1 bis 9999 durcheinander geworfen hat öffnet sich zwar das ausgabefenster, aber das einizige was man sieht ist der cursor.

habe ich da irgendwo einen fehler?

Bearbeitet von voldemort
Geschrieben (bearbeitet)

kannst du da evtl noch konkreter drauf eingehen?

was meinst du mit casten? der ausdruck ist mir leider nicht geläufig.

---------------------------------------------------

edit: casten in sinne von typecase?

haben wir aber so gelernt.warum sollte man denn nicht umwandeln?

Bearbeitet von voldemort
Geschrieben
kannst du da evtl noch konkreter drauf eingehen?
Schau dir doch genau an, was du tust: Wenn du erfolgreich einliest, überspringst du ein Zeichen und machst weiter. Wenn das Einlesen aber fehlschlägt, versuchst du es an derselben Stelle nochmal. Kann ja nicht gehen.

was meinst du mit casten? der ausdruck ist mir leider nicht geläufig.
Ein Cast ist eine explizite Typumwandlung.

Wie hier:

speicher = (int*) malloc (anzahl * sizeof (int) );

Das (int*) ist hier überflüssig und kann unter bestimmten Umständen Fehler verbergen.

Geschrieben

dann versteh ich aber nicht warum das programm mit meiner testdatei funktioniert. ich habe nun auch versucht ein bisschen zu tüfteln und hab mir auch explizit die schleifen und abfragen angeschaut.

wenn ich nun den schritt weiter vor die abfrage stelle funktioniert das ganze programm nicht mir.

ist zwar nicht meine art, aber könntest du denn bitte mal den code korregieren?

nun möchte ich echt wissen woran es genau liegt. meistens ist es ja nur ne kleinigkeit

Geschrieben
dann versteh ich aber nicht warum das programm mit meiner testdatei funktioniert.
Vermutlich, weil deine Testdatei einen anderen Aufbau hat. Zeig doch mal die erste Zeile dieser Datei.

wenn ich nun den schritt weiter vor die abfrage stelle funktioniert das ganze programm nicht mir.
Welchen Schritt vor welche Abfrage?
Geschrieben (bearbeitet)

schritt weiter = fseek ; also gehe ein zeichen weiter

in der testdatei steht 5555;552

die große datei ist genau so aufgebaut nur das sie aus den zahlen 1 - 9999 besteht. das semikolon ist natürlich hier das trennzeichen.

hab nun auch mal die erste zeile aus der großen datei in meine testdatei kopiert und siehe, wird auch gelesen und sortiert

hab nun die abfragen in so weit geändert das wenn zeichen=1 nur anzahl++ ansonsten fseek.

auf deutsch, nur ein zeichen weiter gehen wenn ein anderes zeichen als eine zahl gelesen wird.

ich denke mal das du das gemeint hast, aber ändert leider immer noch nichts am problem

Bearbeitet von voldemort
Geschrieben
hab nun auch mal die erste zeile aus der großen datei in meine testdatei kopiert und siehe, wird auch gelesen und sortiert
Das heißt, die große Datei hat mehrere Zeilen, und deine Testdatei nur eine? Dann ist der Aufbau wohl doch nicht gleich.
Geschrieben (bearbeitet)

durch kopieren der zeile hab ich zwei zeilen um genau zu sein

jetzt seh ich wo das problem ist. am ende der datei steht ;;

nun versteh ich das aber nicht mehr da ich doch durch fseek ein zeichen weiter gehe wenn es keine zahl ist,oder?

Bearbeitet von voldemort
Geschrieben (bearbeitet)

so statt den fseek befehl verwende ich nun auf tipp eines kollegen

weiter = fgetc (datei);

aber es muss doch auch mit fseek möglich sein,oder?

hier der jetzige code


        int i,k,l=0,tmp;

	int zeichen,anzahl=0,zahl=0,*speicher;

	char weiter;

	FILE*datei = fopen (/*argv[1]*/ "c:\\zahlen.csv" ,"r");


	if (datei == NULL)

	{

		printf("Error");

	}



	do

	{

		zeichen = fscanf(datei,"%d",&i);

		weiter = fgetc (datei);

		if (zeichen == 1)

		{

			anzahl++;

		} 

	}while(!feof(datei));


	speicher = (int*) malloc (anzahl * sizeof (int) );


	fseek (datei, 0L, SEEK_SET);


	do

	{

		zeichen = fscanf(datei,"%d",&i);

		weiter = fgetc (datei);

		speicher[zahl]=i;

                zahl++;

	}while(!feof(datei));


	fclose(datei);


	for (k = 0; k < anzahl; k++)

	{

		for (zahl = 1+k; zahl < anzahl; zahl++)

		{

			if (speicher [k] > speicher [zahl])

			{

				tmp = speicher [k];

				speicher [k] = speicher [zahl];

				speicher [zahl] = tmp;

			}

		}

	}


	for (k = 0; k < anzahl; k++)

	{

		printf ("%d \n", speicher[k]);

	}


Bearbeitet von voldemort
Geschrieben

also du meinst einmal einlesen, dann nach semikolon und zeilenumbruch abfragen und erst dann ein zeichen weitergehen. bis dahin verstanden, aber die funktion atoi ist mit unbekannt. kann leider nicht etwas einbauen was wir noch nicht durchgenommen haben.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...