使用C中的fputs写入文件

Exo*_*xon 18 c string file

有人能告诉我为什么文件不会改变?它适用于我使用rewindfseek不使用的情况.

什么是使用fputs后的标准方式fgets.文件指示器位于第9位,因此fputs必须在此之后写入,但它不会执行任何操作.

在档案中:

abcd efgh ijkl mnor
Run Code Online (Sandbox Code Playgroud)

在源代码中:

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);
Run Code Online (Sandbox Code Playgroud)

Ste*_*ner 26

关于fopen/'+'C标准中的定义(例如,在此在线C标准草案中),从读取切换到写入需要对文件定位功能的中间调用(重点是我的):

7.21.5.3 fopen函数

(7)当以更新模式打开文件时('+'作为上述模式参数值列表中的第二个或第三个字符),可以在关联的流上执行输入和输出.但是,如果没有对fflush功能或文件定位功能(fseek,fsetpos或倒带)的干预调用,输出不应直接输入,并且输入不应直接跟随输出而不干预文件定位函数,除非输入操作遇到文件结尾.在某些实现中,打开(或创建)具有更新模式的文本文件可以改为打开(或创建)二进制流.

所以我建议您编写以下代码来克服您的问题:

fseek ( fp , 0, SEEK_CUR);
fputs(str, fp);
Run Code Online (Sandbox Code Playgroud)


Wea*_*ane 7

MS文档用于fopen这样说:

"r+","w+"或者"a+"是指定的访问类型,读取和写入启用(该文件被认为是开放的"更新").但是,当您从读取切换到写入时,输入操作必须遇到EOF标记.如果没有EOF,则必须使用对文件定位功能的干预调用.文件定位功能fsetpos,fseek以及rewind.从写入切换到读取时,必须使用fflush对文件定位功能的中间调用或对文件定位功能的干预调用.