C Datei mit fscanf zeilenweise lesen

( ^_^) /

Cadet 1st Year
Registriert
März 2014
Beiträge
12
Hallo,

eine kurze Frage an die Experten hier...

Folgender Code:
Code:
#include <stdio.h>

int main()
{
	FILE *file;
	char *arr[10];
	char buf[10];
	int dec;
	file = fopen("test.txt", "r");

	while (fscanf(file, "%i %s", &dec, buf) == 2)
	{
		arr[dec] = buf;
		printf("%d %s\n", dec, arr[dec]);	// 1. Durchlauf: "1 eins"
							// 2. Durchlauf: "2 zwei"
	}
	printf("1 %s\n", arr[1]);			// "1 zwei" <-- wieso?
	printf("2 %s\n", arr[2]);			// "2 zwei"

	return 0;
}

Und test.txt:
Code:
1 eins
2 zwei

Unabhängig von der Tatsache, dass man statt fscanf auch etwas anderes verwenden könnte, wieso wird denn in der Schleife scheinbar arr[1] überschrieben? :confused_alt:
Es muss irgendwie an *char[] liegen, denn mit int[] funktioniert das ganze.

Danke falls jemand eine Erklärung kennt. :)
 
( ^_^) / schrieb:
Code:
#include <stdio.h>n 

int main()
{
	char *arr[10];
	char buf[10];
...
	arr[dec] = buf;

"arr" ist bei dir ein Feld von zehn Pointern und diesen weist du immer die gleiche Adresse das char-array "buf" zu.
Wenn du jetzt irgendwas abragst bekommst du immer das was aktuell in "buf" steht.

Du unterliegst anscheinend dem Irrtum das mit "arr[dec] = buf;" irgendwas kopiert wird...
 
Code:
#include <stdio.h>

int main()
{
	FILE *file;
	char arr[10][10];
	char buf[10];
	int dec;
	file = fopen("test.txt", "r");

	while (fscanf(file, "%i %s", &dec, buf) == 2)
	{
		//arr[dec] = buf;
		sprintf(arr[dec],"%d %s\n", dec, buf);	

	}
	printf("1 %s\n", arr[1]);			// "1 zwei" <-- wieso?
	printf("2 %s\n", arr[2]);			// "2 zwei"

	return 0;
}


Nicht probiert, sollte so laufen...
 
Zuletzt bearbeitet:
Nein, nein, nein und nochmal nein zu fscanf und %s. Ebenso zu sprintf und %s.
Wenn du unter einem POSIX-kompatiblen System bist, schau dir mal getline(3) an. Sonst schau dir fgets(3) an.
Wenn du ein Tutorial o.ä. liest, das fscanf mit %s vorgeschlagen hat zum Lösen dieser Aufgabe, schmeiß es ganz schnell weg.
 
Zuletzt bearbeitet:
Ja, danke euch.
Ich habe auch noch gemerkt, dass ich da nur den Pointer kopiere...

Und wegen fgets muss ich nochmal schauen, der Fehler wäre in diesem Fall ja der gleiche. :)
Jetzt, wo es geklärt ist, kann man das verbessern.
 
Du solltest noch mehr verbessern: Wie bereits gesagt, keinesfalls fscanf mit %s nutzen. Außerdem: Niemals einen Arrayindex einlesen und ungeprüft nutzen. Außerdem brauchst du "buf" eigentlich gar nicht, was den initialen Fehler ausgelöst hat. Wieso nicht gleicht ins Array einlesen?
 
Zurück
Oben