fseek Problem
-
{ datei = fopen ("PFAD", "r"); while (!feof(datei)) { i=-1; do { i++; Name[i] = fgetc(datei); }while(Name[i] != ';'); Name[i]='\0'; i=-1; do { i++; Vorname[i] = fgetc(datei); }while(Vorname[i] != ';'); Vorname[i]='\0'; i=-1; do { i++; Strasse[i] = fgetc(datei); }while(Strasse[i] != ';'); Strasse[i]='\0'; i=-1; do { i++; PLZ[i] = fgetc(datei); }while(PLZ[i] != ';'); PLZ[i]='\0'; i=-1; do { i++; Ort[i] = fgetc(datei); }while(Ort[i] != ';'); Ort[i]='\0'; printf ("%s %s\n%s\n%s %s\n\n", Name, Vorname, Strasse, PLZ, Ort); if (fgetc(datei)+1 == NULL) { exit; } fseek(datei, -1, SEEK_CUR); } fflush(stdin); getchar(); fclose(datei); }
In der Datei habe ich im moment zwei Adressen...
Wenn ich nur eine Adresse habe funktioniert es Problem los...
Sobald ich zwei oder mehrere habe, schneidet es mir ,ab der zweiten, immer den Ersten BUchstaben ab....
Das liegt wahrscheinlich daran, dass ich in Zeile 46 ein Zeichen einlese.....
Darum habe ich versucht mit fseek den Cursor um eins zurück zusetzen, was nicht recht funktionieren will...Problem Nr. 1
Anstatt aufzuhören, wenn alle Adressen ausgelesen sind, liest es weiter und füllt mir den Array Name mit sinnlosen Zeichen....Problem Nr. 2
Wäre froh über Hilfe...
mfg 08mmarte
-
^^ist das nicht zu umständlich so?
hol die .csv-datei doch zeilenweise ab (mit fgets z.b.) und dann zerhack' die zeilen immer da, wo ein trennzeichen (;) ist.
-
Es ist eben keine .csv datei sondern eine .txt datei...
Aber ich würde trotzdem gerne wissen wo hier der Fehler ist...
-
csv = comma separated values
Eine .txt-Datei kann also durchaus eine CSV-Datei sein, solange sie Daten enthält, die durch Komma getrennt sind. Man benutzt den Begriff aber durchaus auch für Daten, die durch Semikola o.ä. getrennt sind.
-
aha....wieder mal etwas neues gelernt
-
Probier das mal:
FILE *datei; char Name[1024]; char Vorname[1024]; char Strasse[1024]; char PLZ[1024]; char Ort[1024]; char line[2048]; char sep[]=";"; char *token; datei = fopen("c:\\myTemp\\mmarte.txt", "r"); while (!feof(datei)) { fgets(line,2048,datei); token=strtok(line,sep); strcpy(Name,token); token=strtok(NULL,sep); strcpy(Vorname,token); token=strtok(NULL,sep); strcpy(Strasse,token); token=strtok(NULL,sep); strcpy(PLZ,token); token=strtok(NULL,sep); strcpy(Ort,token); printf ("%s %s\n%s\n%s %s\n\n", Name, Vorname, Strasse, PLZ, Ort); } fclose(datei);
Den Dateinamen-String natürlich durch deinen ersetzen...
-
Danke deine Methode funktioniert einwandfrei...
Leider nicht ganz das was ichmir vorgestellt habe, wahrscheinlich besser und schneller...
-
Es ist plötzlich eine Fehlermeldung aufgetaucht
[code]Unbehandelte Ausnahme bei 0x102af683 (msvcr80d.dll) in AdV.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.[code]Obwohl ich nur den Pfad geändert habe
-
08mmarte schrieb:
Es ist plötzlich eine Fehlermeldung aufgetaucht
[code]Unbehandelte Ausnahme bei 0x102af683 (msvcr80d.dll) in AdV.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.[code]Obwohl ich nur den Pfad geändert habe
In was denn? Existiert die Datei? Du musst eigentlich auch checken, ob fopen erfolgreich war. Wenn NULL zurückgegeben wird, ist was schiefgelaufen und du musst abbrechen.
-
_matze schrieb:
In was denn? Existiert die Datei? Du musst eigentlich auch checken, ob fopen erfolgreich war. Wenn NULL zurückgegeben wird, ist was schiefgelaufen und du musst abbrechen.
Es gibt mir beide Adressen zurück, aber sofort danach kommt die Fehlermeldung...
-
Welche beiden Adressen? Willst du 2 Dateien öffnen? Fragst du mittlerweile datei auf NULL ab?
EDIT: Zur Not poste deinen ganzen Code einfach nochmal.
-
Sorry wenn es ein Missverständnis gibt...
im Moment sind in meiner Datei zwei Adressen...Name Vorname etc.Ja ich frage auf null ab...
-
Ach so, ich dachte du meinst 2 FILE-Pointer.
Also meine Testdatei sieht so aus:
Hans;Wurst;Wurststr. 6;12345;Ortstadt; Reiner;Unsinn;Blödenstr. 12;54321;Dummdorf;
Mit der Datei und meinem Code stürzt nix ab. Siehst du irgendwelche Unterschiede? Sonst poste nochmal deinen Code und deine Datei.
-
Einen bzw. zwei Unterschiede sehe ich....
Meine Adressen werden nicht mit einem Semikolon abgeschlossen sondern nur mit '\n'...könnte das der Fehler sein??EDIT:
Habs getestet ist nicht der Fehler...
-
08mmarte schrieb:
Einen bzw. zwei Unterschiede sehe ich....
Meine Adressen werden nicht mit einem Semikolon abgeschlossen sondern nur mit '\n'...könnte das der Fehler sein??EDIT:
Habs getestet ist nicht der Fehler...
Nein, das Problem ist, dass meine letzte Zeile nicht mit CR/LF abgeschlossen war. Bei dir ist das der Fall, so dass er noch ein drittes Mal in die Schleife geht...
EDIT: Hab jetzt Pause, du kriegst bestimmt ne Lösung hin, ne?
EDIT2: Hmpf! Pause verzögert sich... Na gut, prüf nach fgets einfach noch mal auf EOF, dann passt es.
-
CR/LF könntest du mir das noch erklären??
-
08mmarte schrieb:
CR/LF könntest du mir das noch erklären??
Das steht für Carriage Return (Wagenrücklauf, der Cursor geht wieder nach links, ASCII 13) und Linefeed (Zeilenvorschub, ASCII 10). In C kannst du in Strings auch "\r\n" verwenden. '\r' für CR und '\n' für Linefeed/Newline.
-
okey...
-
if (fgets(line,2048,datei)==NULL)
Ich teste so auf NULL...Aber wenn ich das amche liest es mir jede zweite Adresse nicht...und das fseek will nicht recht funktionieren könntest du mir nochmals helfen...
-
Kein Problem! Meine Variante sieht so aus:
FILE *datei; char Name[1024]; char Vorname[1024]; char Strasse[1024]; char PLZ[1024]; char Ort[1024]; char line[2048]; char sep[]=";"; char *token; datei = fopen("c:\\myTemp\\mmarte.txt", "r"); if(datei==NULL) { return; } while (!feof(datei)) { fgets(line,2048,datei); if(feof(datei)) { break; } token=strtok(line,sep); strcpy(Name,token); token=strtok(NULL,sep); strcpy(Vorname,token); token=strtok(NULL,sep); strcpy(Strasse,token); token=strtok(NULL,sep); strcpy(PLZ,token); token=strtok(NULL,sep); strcpy(Ort,token); printf ("%s %s\n%s\n%s %s\n\n", Name, Vorname, Strasse, PLZ, Ort); } fclose(datei);