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

Запись в файл с использованием 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);
4b9b3361

Ответ 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, либо в функцию позиционирования файла.