有人能告诉我为什么文件不会改变吗?它在我使用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);
答案 0 :(得分:26)
关于C标准中fopen/'+'
的定义(例如在this online C standard draft中),从读取切换到写入需要对文件定位功能进行中间调用(重点是我的):
7.21.5.3 fopen功能
(7)以更新模式打开文件时(' +'作为第二个或第三个 上面的模式参数值列表中的字符),输入和 可以在关联的流上执行输出。但是,输出 在没有干预呼叫的情况下,不得直接输入 fflush功能或文件定位功能(fseek,fsetpos, 或倒带),输入不得直接输出而不输出 除非输入,否则对文件定位功能进行干预调用 操作遇到文件结束。打开(或创建)文本文件 使用更新模式可以改为打开(或创建)某些二进制流 的实施方式。
所以我建议您编写以下代码来克服您的问题:
fseek ( fp , 0, SEEK_CUR);
fputs(str, fp);
答案 1 :(得分:7)
fopen
的{{3}}说明了这一点:
指定
"r+"
,"w+"
或"a+"
访问类型时,两者都有 读取和写入已启用(该文件据说是开放的 “更新”)。但是,当您从阅读切换到写入时,输入 操作必须遇到EOF
标记。如果没有EOF
,那么你 必须使用对文件定位功能的干预调用。文件 定位函数是fsetpos
,fseek
和rewind
。当你 从写作切换到阅读,你必须使用干预电话fflush
或文件定位功能。