2012-05-17 2 views
17
FILE* f = fopen("rajat", "w"); 
fputs("sometext", f); 
fseek(f, 6, SEEK_SET); 
fputs("is a", f); 
fclose(f); 

успешно возвращает "а": "someteis"FSEEK не работает, если файл открыт в режиме (добавление)

Но

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

не работает. Возвращает «sometextis a»

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

+1

Вам не нужен '' w + "' для первого? В противном случае файл будет уничтожен и воссоздан. –

ответ

24

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

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

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

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

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

+0

Если вы не хотите, чтобы существующие данные в файле были уничтожены, вы должны использовать '' r + "', а не '' w + "'. –

+0

@JamesKanze Это правильно, я разъяснил этот момент в редактировании несколько минут назад. Недостатком для 'r +' является то, что файл должен существовать. – dasblinkenlight

+0

Я всегда считал, что поведение '' a '' неинтуитивно. –

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