2016-06-30 21 views
1

Ich versuche, eine Zeile aus einer Datei zu lesen und zu Beginn der gerade gelesen Zeile zurück:fseek Verwendung in meinem Dateizeiger resultierende EOF springen in Richtung

FILE *fp = fopen("C:\\F2BJROP1.phn", "r+"); 
while(1){ 
    /**Data reading**/ 
    fscanf(fp, "%f", &temp1); 
    if(feof(fp)) 
     break; 
    if(isvoiced(temp1)==1){ /** isvoiced() has nothing to do with this fp. **/ 
     pos = ftell(fp); 
     voicedIntervs[k++] = temp1; 
     fscanf(fp, "%f", &temp1); 
     voicedIntervs[k++] = temp1; 
     fseek(fp, pos, SEEK_SET); /** Trying to go back to pos **/ 
    } 
} 

Aber kurz nach dem fseek, ich beobachte dass fp in Richtung EOF springt. Ich möchte, dass mein fp wieder in der Position ist, die in pos gespeichert ist. Kein anderer fp ist irgendwo im Programm deklariert.

Ich weiß, fp erreicht EOF, weil ich debuggte und den Wert sah.

Ich bin auf dem 10. Windows

+1

Sie besser von den Rückgabewert testen tun würde ' fscanf' (die Anzahl der erfolgreich gelesenen Elemente) als mit 'feof'. Du hast auch die nächste Verwendung 'fscanf' nicht überprüft ... schlecht! –

+0

@Weather Vane: Alles klar, aber meine Anforderung war, dass fseek den Dateizeiger in die Position in der Variablen fp –

+1

zurückpositionieren sollte Ich sehe, dass Sie gerade Ihren Code bearbeitet haben. Es ist also nicht dein Code. Bitte posten Sie das [Minimale, vollständige und verifizierbare Beispiel] (http://stackoverflow.com/help/mcve), das zeigt, was Sie versucht haben. –

Antwort

3

Haben öffnen Sie die Datei mit Zufügen-Modus (a oder a+), wie in dem folgenden Code?

fopen(fp, "a")` 

Documentation Staaten, die Modus anhängen akzeptiert keine Neupositionierung:

append: Öffnen Sie die Datei am Ende einer Datei für die Ausgabe. Ausgabeoperationen schreiben immer Daten am Ende der Datei und erweitern sie. Neupositionierungen Operationen (fseek, fsetpos, rewind) werden ignoriert. Die Datei wird erstellt, wenn sie nicht existiert.

Wenn du das getan hast, schlage ich vor, Sie versuchen, öffnen Sie es mit Lese - r - oder lesen/update - r+ - Modus, wie in:

fopen(fp, "r")` 
+0

Nein. Es ist im Modus "r" geöffnet. –

+0

Dann erreicht es vielleicht beim ersten fscanf'EOF'. Vielleicht würde es hilfreich sein, ein paar "Printf's" oder "Debugging" hinzuzufügen. –

+0

Ich habe das getan. Die Funktion ftell() hat die Position -372 zurückgegeben, und nach fscanf() unten steht fp bei -368. Aber nach fseek() erreicht fp 2787. –