2 weixin 42318425 weixin_42318425 于 2018.10.11 21:31 提问

C语言 while(!feof())似乎陷入了死循环

问题描述:C语言菜鸟,做一道关于资金账户管理的练习,输入一个记录ID,如果文件中已存在该记录,则输入新的记录信息并更新资金账户文件中相应记录的信息。

部分代码:

```printf("Please enter a log id:\n"); /*输入相应信息*/
scanf("%ld", &num);
logcount = getLogcount(cfptr);
if(num <= logcount){
printf("Input logdate(format:2006-01-01):") ;
scanf("%s", log.logdate);
printf("Input lognote:");
scanf("%s", log.lognote);
printf("Inpute Charge: Income+ and expend-:");
scanf("%lf", &log.charge);

    /*更新Log信息*/
    log.logid = num;
    if(num == 1){
        log.balance = log.charge;
        fwrite(&log, size, 1, cfptr);
    }
    else{
        fseek(cfptr, size*(num-2), SEEK_SET);    /*跳转到上一条记录*/
        fread(&log_old, size, 1, cfptr);
        log.balance = log.charge + log_old.balance;    /*log存储应该修改的记录信息*/
        fread(&log_old, size, 1, cfptr);         /*读入当前记录*/
        differ = log.charge - log_old.charge;    /*新输入的信息与当前记录的差异,用循环对后续记录进行修改*/
        fseek(cfptr, -size, SEEK_CUR);
        fwrite(&log, size, 1, cfptr);      /*修改当前记录*/
    }

    while(!feof(cfptr)){          /*更新后续记录信息,出问题的地方,文件指针好像没动,陷入死循环*/
        fread(&log, size, 1, cfptr);
        log.balance = log.balance + differ;
        fseek(cfptr, -size, SEEK_CUR);
        fwrite(&log, size, 1 ,cfptr);
    }
}

1个回答

phoenix510
phoenix510   2018.10.11 21:40

这样就不会死循环了:
while(!feof(cfptr)){
if(1!=fread(&log, size, 1, cfptr))
break;
log.balance = log.balance + differ;
fseek(cfptr, -size, SEEK_CUR);
if(1!=fwrite(&log, size, 1 ,cfptr))
break;
}
但fwrite一般是替换。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
关于C语言中feof的使用
本篇博客结合原理和实例分析了C语言编程中feof()函数的使用和EOF的含义。
“采用while(!feof(FP)){...}进行文件复制时,目标文档总会比源文档多出一些” 原因探析及解决方法
1.问题提出: 目标:  假设源文件共有3个double型的数据,1.0,2.0,3.0,我希望将源文件中的数据复制到另一文件中,都以二进制形式打开和保存。 设源文件路径为inpath,目标文件为outpath。   代码:         FILE *fin,*fout;         fin=fopen(inpath,"rb");         fout=fopen(outp
feof() 函数的陷阱……
<br />使用feof()的时候,掉陷阱里了,总是少输出一条:<br />  while ( !feof(fp) ) { flag = fgets(buffer,300,fp); cout << buffer<<endl; sscanf(buffer,"%s %d %d", temp_name,&salary,&count); temp = new Set; temp->set_name(temp_name); temp->set
C语言中的feof函数
函数名   feof 功 能   检测流上的文件结束符 用 法   int feof(FILE *stream); 程序例   #include stdio.h>   int main(void)   {   FILE *stream;   /* open a file for reading *
【C语言天天练(一)】while(1)死循环与for(;;)死循环的区别
单片机的编程中经常用到while(1)死循环来进行轮寻操作,但分析Linux内核源代码时却经常见到for(;;)作为死循环的条件。 两者区别: 区别一 for(;;)死循环里的两个;;代表两个空语句,编译器一般会优化掉它们,直接进入循环体。 while(1)死循环里的1被看成表达式,每循环一次都要判断常量1是不是等于零。 区别二 for.c源码: #include int mai
fgets重复读取最后一行,都是feof惹的祸
写了一个小程序用于读取文件,每次输出时最后一行都重复输出,经Debug发现是因为feof慢了一拍。当fgets读过最后哦一行之后,feof()仍然返回的是0,又一次读出错之后feof才检测到文件结束。下面用代码来说明:  FILE *fd;   char buf[1024];   string temp;   fd = fopen(filename.c_str(), "rb");   i
feof()多读一次的解决方法
查看 stdio.h 可以看到如下定义:   #define  EOF  (-1)   #define  _IOEOF  0x0010  #define  feof(_stream)  ((_stream)->_flag & _IOEOF)   由此可以看出,这两种方式的原理是不同的。   在这里先说下EOF和feof()这个两个宏定义,在我们学的课本中有这样的描述。 EOF是
feof多读一次问题分析
在读完文件的最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多执行了一次。对于feof()这个函数, 它是先读再判断是否到文件尾, 也就是说在它之前一定要读一次才能做出判断。 而我们经常这样把它使用在循环中: int c; while(!feof(fp))
c语言两种方式死循环的区别
for(;;)系统执行时会自动优化两个分号,不用去判断。并且生成的文件占用的内存小。 while(1);因为while中的判断是一个数,系统每次执行都会去判断是真是假。并且生成文件占用的内存较大。
用feof()判断文件时出现多读内容的问题
昨天将自己以前做的电子通讯录加上了文件读写的功能,是的数据可以关机保存,开机读取。 在修改的过程中出现了一个问题就是每次开启程序时,读文件内的内容总是会在最后多读一串数据,经过上网查询找到了问题所在。 下面我先把我原来写的错误的程序部分贴出 while(0 == feof(stream))  { fread(&from,sizeof(struct file_node),1,stream)

相似问题

8
C语,如何将choice 2 循环独立出来?
4
关于C语言中“在某个变量周围的堆栈已损坏”的问题
2
求delphi高手转换个C语言的CRC16算法,算法如下
4
leetcode 345反转字符串中的元音字母C语言
2
javascript语言怎么读取我的文档目录下的word文件并且自动汇总,判断后再显示出来?
5
怎么在javascopt语言的开发中实现div双向判断对应的input?
4
javascrpt语言里怎么实现div点击以后通过文本框给它更新的功能,html的实现?
5
leetcode 383赎金信 C语言
1
leetcode167两数之和c语言问题
4
如何利用javascrpt语言实现网页判断?怎么判断一个网页,用javasipt实现
3
真挚求教高分悬赏,请问怎么在javascrip语言里实现下载电子邮件的附件?
2
leetcode219存在重复元素C语言问题
5
利用c语言及easy x制作一个坦克大战小游戏,要求代码简单基础,不超过800行最好
16
简单的js问题,回答就有c币了:请问怎么在js里面实现求一个矩阵的数学期望值?
7
在线等高手,怎么利用javascpt语言的eval函数,实现一个简单的表达式计算器,怎么做?
27
急等马上就给c币,输入3个数字,求其中最大的和最小的数字,怎么实现?
4
javascrpt语言怎么实现ghost方式重装系统,并且重启返回网页的功能
3
leetcode268缺失数字 C语言
14
C语言中sprintf赋值问题
12
在c语言里数组长度是固定的么(不讨论柔性数组)比如int a[5]=0,1,2,3,4