Запись в файл с использованием fputs в C

Может ли кто-нибудь сказать мне, почему файл не изменился? Он работает, когда я использую rewind или fseek но не иначе.

Каков стандартный способ использования fputs после fgets . Индикатор файла находится в позиции 9, поэтому после этого fputs должен писать, но он ничего не делает.

В файле:

 abcd efgh ijkl mnor 

В исходном коде:

 char c; char str[15]; FILE *fp = fopen("d:\\data.txt","r+"); fgets(str, 10, fp); // fseek(fp, 9, SEEK_SET); // rewind(fp); printf("%d\n", ftell(fp)); // ftel shows that it's in "9". printf("%s", str); fputs(str, fp); // why its not working fclose(fp); 

Что касается определения fopen/'+' в стандарте C (например, как в этом стандартном черновике C ), переход от чтения к записи требует промежуточного вызова функции позиционирования файла (акцент мой):

7.21.5.3 Функция fopen

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

Поэтому я предлагаю вам написать следующий код, чтобы решить вашу проблему:

 fseek ( fp , 0, SEEK_CUR); fputs(str, fp); 

Документация MS для fopen говорит об этом:

Когда указывается тип доступа "r+" , "w+" или "a+" , активируются как чтение, так и запись (файл считается открытым для «обновления»). Однако, когда вы переключаетесь с чтения на запись, операция ввода должна иметь маркер EOF . Если EOF отсутствует, вы должны использовать промежуточный вызов функции позиционирования файла. Функции позиционирования файла – fsetpos , fseek и rewind . Когда вы переключаетесь с записи на чтение, вы должны использовать промежуточный вызов либо fflush либо функцию позиционирования файла.