или к функции позиционирования файла.

кто-нибудь сказать мне, почему файл не меняется? Работает когда использую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);
 Weather Vane11 сент. 2017 г., 11:34
Предположим, что файл, который был открыт для чтения и обновления, содержит две строки текста. Вы читаете первую строку, а затем записываете ее в тот же файл. Как вы думаете, где это будет написано? Можете ли вы увидеть необходимость явной установки указателя файла после чтения перед записью?
 Some programmer dude11 сент. 2017 г., 11:17
Когда и где и как вы проверяете вывод? Междуfputs а такжеfclose звонки? Возможно, вам следуетfflush файловые буферы?
 krpra11 сент. 2017 г., 11:58
для редактирования из текущего местоположения используйтеfseek ( fp , 0L , SEEK_CUR);

Ответы на вопрос(2)

Решение Вопроса

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

7.21.5.3 Функция fopen

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

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

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

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

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

Ваш ответ на вопрос