Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

aufgabe mit fscanf, malloc und insertion sort

Empfohlene Antworten

Veröffentlicht

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

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);

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

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

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.

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

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?

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

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

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

gibt es denn da nicht eine saubere lösung als die meine um das zu umgehen?

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.