Почему fprintf не работает после fscanf?

Я хочу открыть файл как для записи, так и для чтения, но после того, как я его прочитал, я не могу писать в него:

f_prefs = fopen(prefs_path, "r+");
while (fscanf(f_prefs, "%[^\n]\n", line) == 1)
{
    ... do some stuff ...
    fprintf(f_prefs, "test"); // doesn't work
    ...
}

Любые идеи?


person Claudiu    schedule 19.08.2010    source источник


Ответы (1)


Должна быть операция позиционирования файла между каждым переключателем в направлении - от чтения к записи или от записи к чтению. В случае сомнений используйте fseek(fp, 0, SEEK_CUR);, который ищет нулевые байты из текущей позиции. Обратите внимание, что вам потребуется две операции fseek() в цикле!

C99 §7.19.5.3 Функция fopen()

Когда файл открывается в режиме обновления ("+" в качестве второго или третьего символа в приведенном выше списке значений аргумента режима), для связанного потока могут выполняться как ввод, так и вывод. Однако за выводом не должен непосредственно следовать ввод без промежуточного вызова функции fflush или функции позиционирования файла (fseek, fsetpos или перемотка назад), а за вводом не должен следовать вывод напрямую без промежуточного вызова функции позиционирования файла. функция, если операция ввода не встречает конец файла.

person Jonathan Leffler    schedule 19.08.2010