- 论坛徽章:
- 0
|
本帖最后由 聪聪知不道 于 2010-06-06 22:17 编辑
书中提到:
“一个输入操作不能随后直接紧跟一个输出操作,反之亦然。如果要同时进行输入和输出操作,必须在其中插入fseek函数的调用。”
给出的例子是这样的:- 错误的程序
- FILE *fp;
- fp=fopen(file,"r+");
- 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函数调用,所以无法进行上述操作。”解决的方法是把这段代码改写为:- 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函数虽然看上去上那么也没做,但它改变了文件的状态,使得文件现在可以正常的读取了”。
我在Linux2.6内核上用gcc 4.4.3编译运行上面那个“错误的例子”没有发现问题,但是作者书中提到的是“可能运行失败”。那么作者所谓的“可能运行失败”是指的一种什么情况下呢?是否我们现在已经不需要考虑这种失败的情况了呢? |
|