先看下面一个小程序:
int main(int argc, _TCHAR* argv[])
{
FILE *fp=fopen("1.txt","r+");
fputc('x',fp);
fputc('x',fp);
fputc('x',fp);
return 0;
}
1.txt文件内容为abcdefg,调用函数之后为axxxefg,恩,正确
int main(int argc, _TCHAR* argv[])
{
FILE *fp=fopen("1.txt","rb+");
char c=fgetc(fp);
fputc('x',fp);
fputc('x',fp);
fputc('x',fp);
return 0;
}
而上面的这个程序只是加了一句fgetc,调用后却失去了作用,文件内容没有发生变化,仍然为abcdefg,为什么呢?(该问题在Linux下已不存在)
《Unix环境高级编程》在使用读写方式打开文件时(type中的+号),输出的后面不能直接跟输入,输入的后面也不能直接跟输出,否则可能会出错。如果需要输出输入相连,则中间
需调用fflush,fseek,fsetpos或rewind等操作。
既然这样,那我们试一下,看看能不能解决问题,在上面代码中fgetc和fputc中间加入
fpos_t pos;
fgetpos(fp,&pos);
fsetpos(fp,&pos);
之后,运行程序,果真可以解决问题。
C语言的标准I/O库函数由于使用缓存的原因,在使用时可能出现各种各样的问题,尤其是在那种即时性比较强的I/O中,使用时要慎重。尽量使用其他的I/O函数代替之。