Я никогда не осознавал этого. Я мог бы очень хорошо предположить подсознательно, как непреложный факт, что я могу переходить между чтением и записью в существующем файле, открывая его в режиме обновления, просто так. Но два вопроса по SO (1,2) заставил меня скептически, и я решил попробовать. Вот что я нахожу:
В первой программе, prog1
, я работаю с файлом source.txt
, в котором есть только строка Смертельное оружие. Я читаю Смертельное оружие из первого мира, используя fscanf()
, и намереваюсь написать "мушкет" сразу после этого, ожидая получить Смертельный мушкет. Но он просто терпит неудачу, и я все еще получаю исходное содержание Смертельное оружие в конце записи операция. Но в этой первой программе, если я вставляю строку fseek(fp,0,SEEK_CUR)
, операция записи работает нормально, и я получаю Смертельный мушкет. Я заметил, что fseek(fp,0,SEEK_CUR)
не служит никакой другой цели, кроме вызова fseek()
просто ради этого , так как нет поиска по сети вообще.
Но во второй программе, prog2
, тот же самый сценарий не нуждается в этом оператореfseek(fp,0,SEEK_CUR)
. Точнее, во второй программе, в отличие от чтения до середины файла, как в первой программе, здесь я читаю до конца файла, и затем начните писать туда. Здесь запись прошла успешно даже без использования fseek(fp,0,SEEK_CUR)
и я получаю нужный контент Продажа летального оружия.
Вопрос: Почему мы не можем перейти из режима read
в режим write
в середине файла и какая разница в том, что fseek(fp,0,SEEK_CUR)
заработает? И в то же время, почему тот же самый переход работает без суеты если мы прочитаем до конца файла и запишем туда? Почему fseek(fp,0,SEEK_CUR)
не нужен во втором случае? Насколько целесообразно использование fseek(fp,0,SEEK_CUR)
для успешной записи в первой программе? Есть ли лучшая альтернатива?
Два вопроса о SO, похоже, в некоторой степени касались одной и той же проблемы, но, поскольку они были основаны больше на поиске объяснения выдержек из текстов/книг, ответы, ориентированные на них, похоже, не касаются того, что я намереваюсь знать в точных терминах .
//PROG1
#include <stdio.h>
int main ()
{
FILE *fp=fopen("D:\\source.txt","r+");
char arr[20],brr[50];
fscanf(fp,"%s",arr);
printf("String is %s\n",arr);
//fseek(fp,0,SEEK_CUR); //Doesn't work without it
fprintf(fp," musket");
rewind(fp);
fgets(brr,50,fp);
printf("New string is %s",brr);
fclose(fp);
}
Вывод:
1) Без fseek()
-- Смертельное оружие
2) С fseek()
-- Смертельный мушкет
//PROG2
#include <stdio.h>
int main ()
{
FILE *fp=fopen("D:\\source.txt","r+");
char arr[20],brr[50];
fgets(arr,20,fp);
printf("Initial line is %s\n",arr);
fprintf(fp," sale"); //writes to end of file
rewind(fp);
printf("New string is %s",fgets(brr,50,fp));
fclose(fp);
}
Вывод без fseek(): -- Lethal weapon sale
fread
для чтения иfwrite
для записи. И я пробую ваш код, но поведение отличается - person MYMNeo   schedule 24.05.2013fread
не очень помогает при чтении строк из файлов, поскольку вам нужно самостоятельно добавлять нулевой символ, в отличие отfscanf()
- person Rüppell's Vulture   schedule 24.05.2013fseek
тоже мушкет Смертельный - person MYMNeo   schedule 24.05.2013fseek()
на моем компьютере, и, кажется, оно согласуется с тем, что говорят два других вопроса и их ссылки. - person Rüppell's Vulture   schedule 24.05.2013fflush
,fseek
,fsetpos
илиrewind
, невозможно записать содержимое после вывода. (Мой родной язык не английский, это мой перевод не происхождение). - person MYMNeo   schedule 24.05.2013