2016-06-30 6 views
1

Я пытаюсь прочитать одну строку из файла и вернуться к началу только для чтения строки:Использование FSEEK в результате моей filepointer прыгает в сторону EOF

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 **/ 
    } 
} 

Но только после FSEEK, наблюдаю что fp переходит к EOF. Я хочу, чтобы мой fp возвращался в позицию, сохраненную в pos. Никакой другой fp не объявлен нигде в программе.

Я знаю, что fp достигает EOF, потому что я отлаживал и видел значение.

Я на ОС Windows 10.

+1

Вы бы лучше испытывать возвращаемое значение ' fscanf' (количество успешно прочитанных позиций), чем использование 'feof'. Вы не проверяли следующее использование 'fscanf' либо ... плохо! –

+0

@ Weather Vane: Хорошо, но мое требование состояло в том, что fseek должен переместить файл-указатель обратно в позицию, хранящуюся в переменной fp –

+1

Я вижу, что вы только что отредактировали свой код. Так что это не ваш код. Пожалуйста, напишите [Минимальный, Полный и Подтверждаемый пример] (http://stackoverflow.com/help/mcve), который показывает, что вы пробовали. –

ответ

3

ли вы открыть файл в режиме добавления (a или a+), так как в коде ниже?

fopen(fp, "a")` 

Documentation заявляет, что режим добавления не принимает репозиционирование:

на добавление: Открыть файл для вывода в конце файла. Операции вывода всегда записывают данные в конец файла, расширяя его. Перемещение операций (fseek, fsetpos, rewind) игнорируются. Файл создается , если он не существует.

Если вы сделали это, я предлагаю вам попробовать открыть его с чтения - r - или чтение/обновление - r+ - режим, как в:

fopen(fp, "r")` 
+0

№ Открывается в режиме чтения «r». –

+0

Тогда, возможно, он достигает 'EOF' на первом fscanf. Возможно, добавление некоторых 'printf' s или отладки поможет. –

+0

Я сделал это. Ftell() вернул позицию -372, а после fscanf() ниже fp находится на -368. Но сразу после fseek() fp достигает 2787. –

 Смежные вопросы

  • Нет связанных вопросов^_^