Почему fprintf не работает после fscanf? - PullRequest
1 голос
/ 19 августа 2010

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

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

Есть идеи?

1 Ответ

4 голосов
/ 19 августа 2010

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

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

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

...