C语言标准IO中的坑
这节内容来自《C Traps and Pitfalls》
FILE *fp;
fp = fopen(file, "r+");
在我们使用这段代码打开一个文件后,我们并不能随心所欲的对文件进行读写
为了保持与过去不能同时进行读写操作程序的向下兼容性,一个输入操作不能随后直接紧跟一个输出操作,反之亦然。
如果要同时进行读写,需要在其中插入fseek
函数调用
CSAPP第十章系统级IO也有提到过这个问题,其中fflush
也可以达到类似的效果,貌似是和IO库的缓冲区有关
相关的原因可以在stackoverflow中找到 链接
那么看书中的这个例子
FILE *fp;
struct record rec;
while (fread((char *)&rec, sizeof(rec), 1, fp) == 1) {
/* do some operations to rec */
if (/* rewrite rec is needed */) {
fseek(fp, -(long)sizeof(rec), 1);
fwrite((char *)&rec, sizeof(rec), 1);
}
}
fseek中的1其实有更准确的写法,是SEEK_CUR
虽然看上去我们在读写之间插入了fseek调用,但是如果我们重写了rec之后,下一个循环就是再一次的读入,在这种情况下,我们没有在读写其中插入fseek
所以改写代码为
if (/* rewrite rec is needed */) {
fseek(fp, -(long)sizeof(rec), 1);
fwrite((char *)&rec, sizeof(rec), 1);
fseek(fp, 0L, 1);
}
虽然第二个fseek看起来什么都没做,但是他更改了文件的状态(如果看了StackOverflow中的回答,他应该是提交了缓冲区中的内容)
文章评论