使用C中的fputs写入文件
有人能告诉我为什么文件不会改变? 它在我使用rewind
或fseek
但不是。
在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是fsetpos
,fseek
和rewind
。 当您从写入切换到读取时,必须使用fflush
或文件定位function进行干预。