Datei lesen (keyword:value)
-
Hallo,
Ich versuche mit folgendem C Code, Daten (zwei Links) aus der Datei (in Linux) ./1/2/test.txt auszulesen :
# include <stdio.h> # include <stdlib.h> main () { FILE *data_file=NULL; char *link_1; char *link_2; char buff; data_file=fopen("./1/2/test.txt","r"); while (fscanf(data_file,"%c",&buff)==1) /* Datei Zeichen für Zeichen durchgehen */ { if (buff=='\n') /* Nach jedem gelesenen Zeilenumbruch prüfen */ { if (fscanf("Link1 : %s\n",link_1)==1) /* Wenn in der nächsten Zeile die gesuchte Angabe steht, diese (inklusive Zeilenumbruch) auslesen */ { printf("Gefunden (1).\n"); /* Testausgabe 1 */ fflush(stdout); fscanf("Link2 : %s\n",link_2); /* Die nächste Zeile auslesen */ printf("Gefunden (2).\n"); /* Testausgabe 2 */ fflush(stdout); break; /* while Schleife verlassen */ } } } printf("Fertig.\n"); /* Testausgabe 3 */ fflush(stdout); printf("%s\n",link_1); /* Testausgabe 4 */ printf("%s\n",link_2); fflush(stdout); }
Die Datei test.txt sieht so aus :
# Testdatei # Der Block Link1 : ... \nLink2 : ... soll an beliebiger Stelle stehen können Link1 : 123 Link2 : 456
Leider funktioniert das Ganze nicht : Die Datei wird erfolgreich geöffnet, das erste "Gefunden" wird ausgegeben, aber danach passiert einfach garnichts mehr (Fehlermeldungen zur Laufzeit werden bei mir nicht angezeigt). Wenn ich das zweite fscanf rausnehme, geht er bis zum Ende und gibt für den ersten Link auch das richtige aus. Ich vermute, es liegt irgendwie an der Definition oder Initialisierung meiner 'string'variablen, aber ich kenne mich da nicht so aus. Jemand eine Idee?
-
probier mal "\r\n" im scanf. wenn das nicht hilft, probiere das nach jedem scanf:
int c; while ((c = getchar()) != EOF && c != '\n');
-
prefect schrieb:
...Ich vermute, es liegt irgendwie an der Definition oder Initialisierung meiner 'string'variablen, aber ich kenne mich da nicht so aus. Jemand eine Idee?
So ist es, fscanf() erwartet einen char ptr, der auf einen ausreichenden Speicherplatz verweist. Folglich muss es also z.B. heißen:
char link_1[100]; char link_2[100];
sonst zeigen link_1 und link_2 auf nicht definierte Speicherbereiche
Ich würde allerdings einfach komplette Eingabezeilen einlesen mittels fgets() oder gets(), aber das ist Geschmacksache... Achtung: fgets() packt auch das \n mit in den Eingabepuffer. Mal so als Idee und ungetestet:
char line[1024]; /* Annahme: max. Zeilenlänge < 1024 */ char link_1[100]; /* Annahme: maximale Länge < 100 Zeichen */ char link_2[100]; int pos; int len; link_1[0] = (char) 0; /* zur Vorsicht: mit Leerstring initialisieren */ link_2[0] = (char) 0; /* zur Vorsicht: mit Leerstring initialisieren */ ... while (fgets(line,sizeof(line),data_file) != NULL) { len = strlen(line); if (line[len-1] == (char) 0x0a) /* fgets() fuegt \n == 0x0a an! */ line[len-1] = (char) 0; if (strncmp(line,"Link1 : ",sizeof("Link1 : ")-1) == 0) { pos = sizeof("Link1 : ") - 1; strcpy(link_1,&line[pos]); } else if (strncmp(line,"Link2 : ",sizeof("Link2 : ")-1) == 0) { pos = sizeof("Link2 : ") - 1; strcpy(link_2,&line[pos]); } }
-
und gets() schreibt gerne ueber den puffer hinaus, was genauso schlimm wie "char *link_1" ist.
nimm fgets().