More than code

More Than Code
The efficiency of your iteration of reading, practicing and thinking decides your understanding of the world.
  1. 首页
  2. daily
  3. 正文

Daily C/C++ C语言标准IO中的坑

2021年5月7日 526点热度 0人点赞 0条评论

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中的回答,他应该是提交了缓冲区中的内容)

标签: c++
最后更新:2021年5月8日

sheep

think again

点赞
< 上一篇
下一篇 >

文章评论

取消回复

COPYRIGHT © 2021 heavensheep.xyz. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS