使用C中的fputs写入文件

有人能告诉我为什么文件不会改变? 它在我使用rewindfseek但不是。

fgets之后使用fputs的标准方法是什么。 文件指示器位于第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); 

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

7.21.5.3 fopen函数

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

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

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

fopen的MS文档说:

当指定"r+""w+""a+"访问类型时,启用读取和写入(该文件被称为“更新”打开)。 但是,当您从读取切换到写入时,输入操作必须遇到EOF标记。 如果没有EOF ,则必须使用对文件定位function的干预调用。 文件定位function是fsetposfseekrewind 。 当您从写入切换到读取时,必须使用fflush或文件定位function进行干预。