Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : [c/c++] FILE pointer macht Probleme



ulzf
15-09-2004, 11:28
Hallo erstmal!

ich will daten aus einer datei.txt lesen, und das geht wunderbar (wenn ich das ganze einlese).
währen des lesen will ich ja aber manchmal eine zeile überspringen bzw. noch mal lesen:


FILE *fd;
fopen(........);
fscan(.....);
//zeile überspringen
//hier mache ich
fd++;
//und dann
fscan(.....);
//und dann eine nochmal lesen.
fd--;
fscan(...);


GCC compeiliert ohne fehler!
beim ausführen gibt´s speicherzugriffsfehler!!

PROBLEM KOMMT von dem fd++ (ich habe es überprüft)
PS: Ich will ja gern wissen warum der FILE POINTER probleme macht;

chrizel
15-09-2004, 11:35
Wie kommst du darauf dass du mit dem inkrementieren des FILE-Zeigers eine Zeile ueberspringen kannst? ;)

So geht das nicht. Du musst dir ggf. selber eine Routine schreiben die bis zum naechsten \n geht, bzw. eins darueber.

ulzf
15-09-2004, 11:41
Auf die Idee komme ich aus PHP

und was ist mit zeile noch mal lesen

chrizel
15-09-2004, 11:48
C ist halt kein PHP.

Wenn du mal in /usr/include/stdio.h guckst siehst du dass FILE ein typedef auf struct _IO_FILE ist. _IO_FILE ist eine structure in libio.h. (bei mir zumindest)

Mit dem inkrementieren des Pointers bewirkst du, dass dein Zeiger auf einen anderen Speicher zeigt. Schlimmstenfalls irgendwo wo er nicht kann und dann bekommst du Zugriffsverletzungen bzw. Segmentation faults.

Aendere also nicht einfach so den FILE-Zeiger, ausser du oeffnest eine neue Datei.

Um eine Zeile wieder neu einzulesen musst du rueckwaerts gehen. Rueckwaerts kannst du z.B. mit der Funktion fseek gehen. Siehe dazu man fseek. Dabei wuerde sich anbieten hier auch eine Routine zu schreiben, die eine Zeile rueckwaerts geht bis zum \n.

Ich beziehe mich hier auf ANSI-C.

Evtl. waere es einfacher C++ zu verwenden (File streams), aber da bin ich nicht so in der Standard Library drin.

ulzf
15-09-2004, 12:27
THX
ich werde es versuchen

BlueJay
15-09-2004, 14:55
währen des lesen will ich ja aber manchmal eine zeile überspringen bzw. noch mal lesen


Hast du fgets schon mal probiert?
Und wenn du die Zeile 2x brauchst, siehst du dir einfach den Puffer an, in den du fgets hast schreiben lassen.

Zu dem Speicherfehler hast du ja schon die Antwort von chritzel

so long