Подтвердить что ты не робот

Fseek не работает, когда файл открывается в режиме "a" (добавить)

FILE* f = fopen("rajat", "w");
fputs("sometext", f);
fseek(f, 6, SEEK_SET);
fputs("is a", f);
fclose(f);

Успешно возвращает: "someteis a"

Но

FILE* f = fopen("rajat", "a");
fputs("sometext", f);
fseek(f, 6, SEEK_SET);
fputs("is a", f);
fclose(f);

Не работает. Возвращает "sometextis a"

Любые идеи, почему? Каково решение этого, так что второй код выводится точно так же, как первый?

4b9b3361

Ответ 1

При открытии в режиме добавления указатель файла возвращается до конца файла перед каждой записью. Вы можете переместить указатель fseek для чтения, но как только вы вызываете функцию, которая записывает в файл, указатель возвращается в конец файла.

Или, говоря иначе, чтобы предотвратить потерю данных, позиция "указателя записи" переопределяет положение "указателя чтения". После любого добавления указатель записи отскакивает от нового EOF.

Ответ на эту ссылку ссылается на соответствующий раздел стандарта C.

Используйте режим "w+", если вы хотите записать произвольные места в файле. Существующий файл будет перезаписан.

Если вы хотите сначала добавить существующий файл, но затем fseek в произвольное место, используйте "r+", а затем fseek(f, 0, SEEK_END).