2017-09-25 6 views
1

Zum Beispiel;In C-Datei lesen: Wie führen Sie Fgets in einer Datei mehrmals aus?

Ich habe eine while-Schleife, dass die Schleife durch die Datei

while (fgets(line, MAXLINE-1, filePointer)!=NULL){ 
// do something; 
} 
fclose(filePointer); 

nach der Schleife beenden, wenn ich fgets auf der gleichen Datei rufen mich null zurück, weil fgets bereits die gesamte Datei beenden. Wie soll ich dann die Datei nochmal durchlesen, wenn ich fgets() benutzen möchte?

+3

'man fseek' .... –

+2

Oder http://www.tutorialspoint.com/c_standard_library/c_function_rewind.htm –

+2

Versuchen Sie, rewind (FILE * Strom); –

Antwort

2

Am Ende der While-Schleife passiert, dass der Dateizeiger bis zum Ende der Datei reicht (bekannt als EOF). Das Betriebssystem zeichnet die Position des Zeigers auf, um zu verfolgen, wo Sie sich befinden oder welche Position Sie in der Datei haben, um weiter von dieser Position lesen zu können. Alles, was Sie tun müssen, ist, den Dateizeiger an den Anfang der Datei zu verschieben. Jetzt gibt es zwei Möglichkeiten dafür, dass Sie die rewind() - Methode oder die fseek() -Methode verwenden können. Dies ist, wie:

rewind(fp); 

ODER

fseek(fp, 0, SEEK_SET); 

verwenden diese, bevor sie wieder die gleiche Datei zu lesen. Für den Datensatz bezieht sich fp auf die Datei, die Sie versuchen, zu lesen

+0

Sie sollten hinzufügen, dass einige Streams keine Suche unterstützen, wie beispielsweise Terminals und Pipes. – chqrlie

+0

@chqrlie; nvm; mein Fehler; Ich schließe meine Datei, bevor ich zurückspulen oder fseek; und merke, dass ich das tun sollte, bevor ich meine Datei schließe. Aber danke für die Antwort – ElleryL

+0

Oder Sie können die Datei schließen und erneut öffnen. –

3

den Dateizeiger zurückzustellen, Sie zwei Ansätze verwenden:

rewind(fp); 

und:

fseek(fp, 0L, SEEK_SET); 

Wo fp den Dateizeiger ist. Sie können dann erneut die Datei fgets() aufrufen, um die Datei von Anfang an zu lesen.

+0

Neugierig, irgendein besonderer Grund für "0L" gegenüber einfach "0"? – chux

+0

@chux Ich erinnere mich nur, dass ich es einmal so gesehen habe, also war es einfach eine Erinnerung. –

+0

@chux ['man fseek'] (https://linux.die.net/man/3/fseek) gibt dieses Beispiel. Wahrscheinlich zu betonen, dass es "lange" dauert ... –

Verwandte Themen