Undo fgets
-
Hallo,
sagen wir ich habe eine Textdatei mit folgendem Aufbau:
A 2
EXT 33
EXT
EXT2
B 4
EXT2 4
EXT2
A 454
EXT 43
EXT2
F 43
EXT2 354
EXT2
EXT2
B 36
EXT 7
...ich lese die Datei Zeile fuer Zeile mit einer Schleife ein:
while (fgets(line_buf, 1024, fptr)) { sscanf(line_buf, "%s%i", tag, &id) }
Der Aufbau ist also immer: Eine Zeile beginnent mit einer Zahl, danach N Zeilen die mit EXT oder EXT2 beginnen.
Das Problem ist nun: Ich muss mir in einem Struct Array alle Buchstaben mit dazugehoeriger Zahl (also B und 4, F und 43 etc) merken, aber NUR wenn ALLE folgenden Zeile (bis zum naechsten Buchstaben) mit EXT2 beginnen.
Im Beispiel muesst ich mir also nur B 4 und F 43 speichern.
Da die noetige Info erst in der naechsten Zeile steht, weiss ich beim lesen eines Buchstabens ja noch nicht, ob ich ihn speichern soll (immer wenn ich einen Buchstaben speichern soll, muss ich sofort mit malloc gewisse Strukturen erzeugen).
Ich dachte mir vielleicht sowas: Wenn ich einen Buchstaben lese, mach ich mein malloc zeugs. Jetzt lese ich in einer Schleife solange Zeilen, bis ich wieder auf einen Buchstaben treffe. Begannen alle gelesenen Zeilen mit EXT2, dann passts. Ansonsten mach ich free auf den Speicher. Aber dann hab ich ja schon den naechsten Buchstaben gelesen. Sollte ich vielleicht nach dem fgets() mit fseek() oder so den Zeiger zuruecksetzen?Bin fuer jede Idee dankbar!
-
Ich nehme einmal an, dass du dich halbwegs in C auskennst und daher den Grundgedanken aus meinen ungetesteten und fehlerhaften Codebruchstück herauslesen kannst
char letter='\0'; int info; while (fgets (line_buf, 1024, fptr)) { if (strncmp (line_buf, "EXT", 3)) { if (letter) save (letter, info); letter = line_buf[0]; info = atoi (line_buf + 2); } else if (line_buf[3] != '2') letter = '\0'; } if (letter) save (letter, info);
Eine andere Möglichkeit (je nach Anwendungszweck noch einfacher), wäre, den letzten fehlerhaften Eintrag wieder zu löschen.
-
int i=0,flag=1,dummy; char **merker=0,zeile[100]; FILE *f=fopen("datei.txt","rt"); while( fgets(zeile,100,f) ) if( 1==sscanf(zeile,"%*c %u",&dummy) ) { if(flag) merker=realloc(merker,++i*sizeof*merker),merker[i-1]=malloc(100); strcpy(merker[i-1],zeile); flag=1; } else if(strncmp(zeile,"EXT2",4)) flag=0; fclose(f); if(!flag&&i) free(merker[--i]); while(i--) puts(merker[i]),free(merker[i]); free(merker);
Einfache String/Zeigerverarbeitung, mit ein bisschen Übung schafft das jeder.
-
Wutz schrieb:
Einfache String/Zeigerverarbeitung, mit ein bisschen Übung schafft das jeder.
Dann musst du offenbar noch viel üben..