有人能告诉我为什么文件不变吗?当我使用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);
发布于 2017-09-11 17:45:51
关于C标准中fopen/'+'
的定义(例如,在this online C standard draft中),从读取切换到写入需要对文件定位函数的中间调用(重点是我的):
7.21.5.3 fopen函数
(7)当使用更新模式('+‘作为上述模式参数值列表中的第二个或第三个字符)打开文件时,输入和输出都可以在相关的流上执行。但是,如果没有对函数或文件定位函数(fseek、fsetpos或)的中间调用,输入输出之后不应直接跟随输入,除非输入操作遇到文件末尾,否则不应在输入之后直接跟随输出,而不插入对文件定位函数的调用。在一些实现中,用更新模式打开(或创建)文本文件可以改为打开(或创建)二进制流。
所以我建议你写下面的代码来解决你的问题:
fseek ( fp , 0, SEEK_CUR);
fputs(str, fp);
发布于 2017-09-11 17:39:10
fopen
的MS documentation是这样说的:
如果指定了
"r+"
、"w+"
或"a+"
访问类型,则同时启用读取和写入(文件被称为打开以进行“更新”)。但是,当您从读取切换到写入时,输入操作必须遇到EOF
标记。如果没有EOF
,则必须使用对文件定位函数的中间调用。文件定位函数是fsetpos
、fseek
和rewind
。当您从写入切换到读取时,必须使用对fflush
或文件定位函数的中间调用。
https://stackoverflow.com/questions/46152077
复制相似问题