《C陷阱与缺陷》:更新顺序文件
来源:互联网 发布:mac网游 编辑:程序博客网 时间:2024/04/28 13:53
许多系统中的标准输入/输出库都允许程序打开一个文件,同时进行写入和读出的操作:
FILE * fp; fp = fopen(file, "r+");
上面的例子代码打开了文件名由变量 file 指定的文件,对于存取权限的设定表明程序希望对这个文件进行输入和输出操作。
编程者也许认为,程序一旦执行上述操作完毕,就可以自由地交错进行读出和写入操作。遗憾的是,事实总是难随人愿,为了保持与过去不能同时进行读写操作的程序的向下兼容性,一个输入操作不能随后直接紧跟着一个输出操作,反之亦然。如果要同时进行输入和输出操作,必须在其中插入 fseek 函数的调用。
下面的程序片段似乎更新了一个顺序文件中选定的记录:
FILE * fp; struct record rec; //... ... while (fread((char *)&rec, sizeof(rec), 1, fp) == 1) { /* 对rec执行某些操作 */ if (/* rec 必须被重新写入 */) { fseek(fp, -(long)sizeof(rec), 1); fwrite((char *)&rec, sizeof(rec), 1, fp); } }
这段代码乍看上去没有问题。但是实际上出错的方式令人难以察觉。如果一个记录需要被重新写入,也就是是说,fwrite 函数得到执行,对这个文件执行的下一个操作将是循环开始的 fread 函数。因为在 fwrite 函数调用与 fread 函数调用之间缺少一个 fseek 函数的调用,所以无法进行上述操作。解决办法如下:
FILE * fp; struct record rec; //... ... while (fread((char *)&rec, sizeof(rec), 1, fp) == 1){ /* 对rec执行某些操作 */ if (/* rec 必须被重新写入 */) { fseek(fp, -(long)sizeof(rec), 1); fwrite((char *)&rec, sizeof(rec), 1, fp); fseek(fp, 0L, 1); //新增 fseek } }
第二个 fseek 函数虽然看上去什么也没有做,但它改变了文件的状态,使得文件现在可以正常地读取了。
本文摘自:《C陷阱与缺陷》
0 0
- 《C陷阱与缺陷》:更新顺序文件
- [美]Andrew Koenig -C陷阱与缺陷 - 更新顺序文件
- c陷阱与缺陷
- 《c陷阱与缺陷》
- C陷阱与缺陷
- C陷阱与缺陷
- C 陷阱与缺陷
- c陷阱与缺陷
- c陷阱与缺陷
- C陷阱与缺陷
- “c缺陷与陷阱”
- 《C陷阱与缺陷》
- c缺陷与陷阱
- C陷阱与缺陷
- c陷阱与缺陷
- c缺陷与陷阱
- C陷阱与缺陷
- C缺陷与陷阱
- Netlink中常用宏定义
- 单例模式
- 《JavaScript高级程序设计 第三版》学习笔记 (一)数据类型详解
- (数学专题)eqution 逆元+扩展欧几里得+组合数
- (16):复合优先于继承
- 《C陷阱与缺陷》:更新顺序文件
- HTML CSS 特殊字符表
- 伯努利分布、二项分布、泊松分布、指数分布简介
- 安卓排除美颜相机等第三方相机直接调用系统相机处理方法
- Java NIO几个基础概念[待编辑]
- 使用github作为maven仓库发布自己的jar包依赖
- 计算机组成原理之原码、补码、反码和移码
- Lock和synchronized比较详解
- 用纯css改变下拉列表select框的默认样式