#include <stdio.h> void ReadChar(FILE * fp){ fgetc(fp); } void PutChar(FILE * fp){ char c = getchar(); fputc(c,fp); //printf("%d\t%d\n", c, (bool)feof(fp)); } int main(){ FILE * fp; fp = fopen("test", "r+"); ReadChar(fp); PutChar(fp); fclose(fp); return 0; }
运行前test里面为空
第一次运行输入1之后test内容为1
第二次运行输入2之后test内容还是为1
解决方案:40分
难倒本人了。研究半天才发现原因,这是VC特有的特征,在linux上结果会不一样, MSDN的帮助:
当指定 “r+”,”w+”, 或 “a+” 访问类型时,允许读取和写入。(文件将处于打开状态以进行“更新”。) 但是,当你从读取切换到写入时,输入操作必须遇到 EOF 标记。假如没有 EOF,必须使用对文件定位函数的干预调用。文件定位函数是 fsetpos、fseek 和 rewind。从写入切换到读取时,必须使用对 fflush 或文件定位函数的干预调用。
假如你检查fputc返回值,会发现第二次fputc其实是执行失败了,返回值为-1。
当指定 “r+”,”w+”, 或 “a+” 访问类型时,允许读取和写入。(文件将处于打开状态以进行“更新”。) 但是,当你从读取切换到写入时,输入操作必须遇到 EOF 标记。假如没有 EOF,必须使用对文件定位函数的干预调用。文件定位函数是 fsetpos、fseek 和 rewind。从写入切换到读取时,必须使用对 fflush 或文件定位函数的干预调用。
假如你检查fputc返回值,会发现第二次fputc其实是执行失败了,返回值为-1。