Запись в файл с использованием 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 in "9".
printf("%s", str);
fputs(str, fp);
// why its not working
fclose(fp);
Ответы
Ответ 1
Относительно определения fopen/'+'
в стандарте C (например, как в этот онлайн-проект стандарта C), переход от чтения к письму требует промежуточного вызова функции позиционирования файла (акцент мой):
7.21.5.3 Функция fopen
(7) Когда файл открывается с режимом обновления ('+' в качестве второго или третьего символ в приведенном выше списке значений аргумента режима), как входные, так и вывод может быть выполнен в связанном потоке. Однако вывод не должны непосредственно следовать за входом без промежуточного функция fflush или функция позиционирования файла (fseek, fsetpos, или перемотка назад), и за входным сигналом напрямую не следует вывод без промежуточный вызов функции позиционирования файла, если только вход операция встречает конец файла. Открытие (или создание) текстового файла с режимом обновления может вместо этого открывать (или создавать) двоичный поток в некоторых реализации.
Поэтому я бы предложил вам написать следующий код, чтобы решить вашу проблему:
fseek ( fp , 0, SEEK_CUR);
fputs(str, fp);
Ответ 2
документация MS для fopen
говорит следующее:
Если указан тип доступа "r+"
, "w+"
или "a+"
, оба чтение и запись включены (файл считается открытым для "Обновить" ). Однако, когда вы переключаетесь с чтения на запись, вход операция должна иметь маркер EOF
. Если нет EOF
, вы должен использовать промежуточный вызов функции позиционирования файла. Файл функции позиционирования fsetpos
, fseek
и rewind
. Когда ты переключитесь с записи на чтение, вы должны использовать промежуточный вызов либо fflush
, либо в функцию позиционирования файла.