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);
    }
}
0

1个回答

这样就不会死循环了:
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一般是替换。

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的。是时候展现真正的技术了!
其他相关推荐
关于C语言中feof的使用
本篇博客结合原理和实例分析了C语言编程中feof()函数的使用和EOF的含义。
feof()多读一次的解决方法
查看 stdio.h 可以看到如下定义:   #define  EOF  (-1)   #define  _IOEOF  0x0010  #define  feof(_stream)  ((_stream)->_flag & _IOEOF)   由此可以看出,这两种方式的原理是不同的。   在这里先说下EOF和feof()这个两个宏定义,在我们学的课本中有这样的描述。 EOF是
关于C语言feof()函数判断文件结尾的问题分析
相信很多C语言初学者都遇到过这种情况: 使用 while(!feof(fp)) { fscanf(...); //或者 //fread(...) } 读文件时经常会重复读最后一段字符。 据说当年的X老师对此也很困惑,还曾经对此做过专题分析…… 实际上这并没有多么高深莫测,也不是feof()函数的bug,只是我们不了解feof()函数的性质。 feof()的性质: 只
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语言天天练(一)】while(1)死循环与for(;;)死循环的区别
单片机的编程中经常用到while(1)死循环来进行轮寻操作,但分析Linux内核源代码时却经常见到for(;;)作为死循环的条件。 两者区别: 区别一 for(;;)死循环里的两个;;代表两个空语句,编译器一般会优化掉它们,直接进入循环体。 while(1)死循环里的1被看成表达式,每循环一次都要判断常量1是不是等于零。 区别二 for.c源码: #include int mai
ftell、fread、fseek、feof 详细的使用介绍与注意细节
1. long ftell(FILE *stream);功能:用于得到文件位置指针当前位置相对于文件首的偏移字节数2. size_t fread ( void *buffer, size_t size, size_t count, FILE *stream)功能:从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功或读到文件末尾返回
C语言 while((c=getchar())!=EOF)死循环解决办法
死循环代码例子如下 (代码目的为得到文本中的行数、词数、字符个数) #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;windows.h&amp;gt; int main(void) { int c,nl,nw,nc,inword; nl=nw=nc=inword=0; while((c=getchar())!=EOF) { nc++; if(c=='\n') n...
C语言中的feof函数
函数名   feof 功 能   检测流上的文件结束符 用 法   int feof(FILE *stream); 程序例   #include stdio.h>   int main(void)   {   FILE *stream;   /* open a file for reading *
C语言再学习 -- EOF、feof函数、ferror函数
EOF是end of file的缩写,表示"文字流"(stream)的结尾。这里的"文字流",可以是文件(file),也可以是标准输入(stdin)。 EOF不是特殊字符,而是一个定义在头文件stdio.h的常量,一般等于-1。 #define EOF (-1) 在C语言中,或更精确地说成C标准函数库中表示文件结束符(end of file)。在while循环中以EOF作为文件结束标志,
feof()原理和用法
一、feof()是什么? feof()是检测流上的文件结束符的函数,如果文件结束,则返回非0值,否则返回0 一般在文件操作,中经常使用feof()判断文件是否结束。 二、feof()的经典错误 根据这个函数的定义,一般大家都是这样使用的,但是这样使用,文件中无论是否有内容,都会被判断为“文件不为空”。 #include&amp;amp;lt;stdio.h&amp;amp;gt; int mai...
关于feof()多读取一次的问题(还未解决)
在编写C语言学生信息管理系统时,想编写一个读取文本的小功能时意外遇到一个小问题。void query()//读取文件 { FILE *P=fopen("E:\\practise\\a.txt","r");//以读的方式打开文件 char s[1024]={0};//分配一个空间 while(!feof(P)) { printf("%s"
fgets重复读取最后一行,都是feof惹的祸
写了一个小程序用于读取文件,每次输出时最后一行都重复输出,经Debug发现是因为feof慢了一拍。当fgets读过最后哦一行之后,feof()仍然返回的是0,又一次读出错之后feof才检测到文件结束。下面用代码来说明:  FILE *fd;   char buf[1024];   string temp;   fd = fopen(filename.c_str(), "rb");   i
C语言中的检测文件流是否结束的函数feof
函数名: feof 功  能: 检测流上的文件结束符 用  法: int feof(FILE *stream); feof - 程序例 #include int main(void) {    FILE *stream;    /* open a file for reading */    stream = fopen("DUMMY.FIL
feof多读一次问题分析
在读完文件的最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多执行了一次。对于feof()这个函数, 它是先读再判断是否到文件尾, 也就是说在它之前一定要读一次才能做出判断。 而我们经常这样把它使用在循环中: int c; while(!feof(fp))
c语言两种方式死循环的区别
for(;;)系统执行时会自动优化两个分号,不用去判断。并且生成的文件占用的内存小。 while(1);因为while中的判断是一个数,系统每次执行都会去判断是真是假。并且生成文件占用的内存较大。
C语言--死循环的一种的写法
#include void hello(void); void hello(void)  { printf("Hello world!\n"); } void main(void) { void (*test)(void); test = main; hello(); test(); } 这是一个死循环! 不断的打印Hello world!
fread feof 文件尾读取重复的问题
问题:  多路归并排序时,每次通过fread读取小文件里的一个double数据,通过feof判断是否读取结束,  结果,在最后总的排序文件中,每个小文件的最后一行的数据回重复一遍 原因:   feof只是检查标志位,如果是good则返回0,是bad就返回1。   更改标志位的fread函数,只有当它读不到东西了,才会把标志位从good变成bad,当fread读到最后一个字符时,由
while死循环
作为初学者,已经陷入while的几次死循环了。 比如:求100以内所有奇数之和。 用while来实现,我出现了以下死循环: >>> sum = 0 >>> for i in range(1,101): while i%2 != 0: sum += i #死了……因为while条件永远满足 然后我灵机一动: >>> sum = 0 >>> for i in r
C语言中死循环的三种写法
C语言中死循环的三种写法 1. while(1) {         ; } 2. for(; ;) {        ; } 3 LOOP: ...... goto LOOP; 第一种写法明显比第二种写法的效率要高,第三种常用在嵌入式编程中
C语言 - while循环体内变量重新声明,陷入死循环。
今天写一个实验代码时,用到了while(exp)循环。发现exp已经为false。但是依然死循环下去。 float T = (float)work[srcNode] / (workAll/6); int consume = 0; float flag = 1.5; while( T &amp;gt; flag ){ consume += (work[srcNode] - work[dict...
feof的使用
在未知文件长度的 情况下,对文件进行读写,要作好文件读写结束的判断。 但feof()有点小毛病,特点:先读,根据读的结果来置位标志位,然后依据标志位来判断是否结束,故有如下三种 写法: 第一种写法,会读到标志位,不应采取,新手,容易范的错误。 第二种写法,可行,但是循环写的不够漂亮。 第三种写法, 应该作为标准写法来推行。 /*  *方案一:先判断,后读取  */ while (
二次抛物线拟合
用二次抛物线拟合数组中的某些点,结果我写的陷入了死循环了
c语言虽难,但是只要入门了,学习了那个思想后,就觉得容易多了!
c语言难吗? 只要有兴趣,一点都不难,在接触一种新东西的时候,还没开始不能就去考虑它难不难,你试过才知道。。编程只要多敲代码,多做练习和项目,每完成一个项目,你会有一定的成就感,这样你就会对编程越发又浓厚的兴趣,你就会越想去做更大的项目,到那时候,C语言对你来说就是很简单的了。 你可以去看一下《CPrimerplus(第五版)》,这本书很好。。是C语言的入门书。。把书上的练习和
for(;;)和while(1)两种死循环的区别
在JUC的源码中,经常看到for(;;),为什么不使用while(true)呢?for(;;)死循环里的两个;;代表两个空语句,编译器一般会优化掉它们,直接进入循环体。 while(true)死循环里的true被看成表达式,每循环一次都要判断表达式是否真。 即,相对来说for式死循环更加高效一点。当然以上条件成立还要看编译器的优化,一些编译器优化的两者并无区别,但是,并非所有的编译器都做了这样的优...
C语言scanf语句输入跳过造成死循环的解决办法
现象描述:在编写C语言程序时,需要使用scanf语句从键盘上输入一个整型的数时,当错误的输入了字符时,scanf语句就好像不会执行,但从键盘输入其他数字又无法获取。 问题分析:当定义scanf语句接收整型数值时,它就会跳过所有的非数字的字符,专接收数字。当输入了字符时,字符就会留在缓冲区,只要缓冲区又字符,scnaf就会去读,一读发现不是数字,就会跳过,只有当输入缓冲区没有字符了才等待你去输入,...
while(1);是死循环的意思。只要括号里为非零,也就是真值,它就一直循环这条句子。
while(1);是死循环的意思。只要括号里为非零,也就是真值,它就一直循环这条句子。 这个句子一般用在三个方面: 1.正常程序里,用来等待中断的产生; 2.在总程序的后面加上这条,可以减少单片机程序跑飞,出现程序可能的混乱; 3.调试的时候,手工让程序停在一个地方,不往下执行,以便于观察输出情况。想在哪里停,就在哪里插入此句。非常有用,我经常用。
C语言feof()函数用法.
feof()函数的意思是用来判断你读到了文件的外面. 而不是判断文件指针是否到达文件尾部(指向文件最后一个字符的后面). 如果在while表达式里直接用feof()判断是否到达文件尾,则结果总会多读一次. 下面是正确的写法. #include int main() { int c; FILE*file=fopen("test.txt","r"); while(1){ c=fg
fgets与feof 判断文件结尾
fgets 是读取文件中的一行,
函数feof使用注意事项
本文主要讲讲当feof遇到fgets时,发生的尴尬故事!
“采用while(!feof(FP)){...}进行文件复制时,目标文档总会比源文档多出一些” 原因探析及解决方法
1.问题提出: 目标:  假设源文件共有3个double型的数据,1.0,2.0,3.0,我希望将源文件中的数据复制到另一文件中,都以二进制形式打开和保存。 设源文件路径为inpath,目标文件为outpath。   代码:         FILE *fin,*fout;         fin=fopen(inpath,"rb");         fout=fopen(outp
Linux gcc for 循环中 i=i++ 会造成死循环问题及 ++i / i++ 汇编分析
在把 Windows 程序移植到 Linux 时遇到了死循环,最后定位到了类似这种的语句 for (i = 0; i < 1; i = i++), 别问我谁写的,为什么这么写(泪目!)。 根据C语言的常识, i = i++ 应该等价于 i++, Windows 上确实是这样,但 Linux 不是,这应该是编译器差异造成的。 --------------------------------------- 可 i 的分割线
for(;;)和while(1)两种死循环的区别
有些编译器在写程序时会自动生成死循环代码,大多是使用for形式的,我们自己写程序,经常用的while(1),所以有些不解,查询网络后得出以下结论 即 for(;;)和while(1)两种死循环的区别: 1、 for(;;)死循环里的两个;;代表两个空语句,编译器一般会优化掉它们,直接进入循环体。 while(1)死循环里的1被看成表达式,每循环一次都要判断常量1是不是等于零。
怎样解决使用feof()函数时出现的问题?
feof函数        昨天在做一个课程设计时,一个函数的功能是将文件中的数据一条条的读到链表中去。既然不确定有多少条数据,那只能借助feof()函数了,本来文件部分就没学好,也就知道这一个方法。但是在测试的后就发现了它的问题,就是在判断是否到达文件尾的时候,它会多读一次,就导致从文件读出的部分内容是错的。可能在课堂上老师就讲到了,可是我不知道当时在干啥,反正就是不记得。更关键的是我还不知道
关于feof函数的一点问题
#include int main(){    FILE *in,*out;    char ch,infile[10],outfile[10];    printf("Enter the infile name:");    scanf("%s",infile);    in=fopen(infile,"r");        if(in==NULL)    {         prin
通过限制循环次数来避免死循环
int nLoopCount=0; while(...) { nLoopCount++; if(nLoopCount>**)break; ... } 很多时候,我们并不能确定假定的循环结束条件真能发生,对调用的函数并不是很了解。这就容易造成死循环。因此,通过限制循环次数可以避免产生死循环BUG。
feof相关的一个死循环
<?php //下面代码在其他程序同时使用添加或更改数据源的时候,容易产生死循环 $filename= dirname(__FILE__) ."/test.txt"; $handle = fopen($filename, "r"); while (!feof($handle)) { $buffer = fgets($handle, 4096); $line = trim($b
while(1)和for(;;)两个死循环有什么区别
一般for(;;)性能更优 for(;;)   {} 复制代码 这两个;; 空语句,编译器一般会优掉的,直接进入死循环 while(1)   {} 复制代码 每循环一次都要判断常量1是不是等于零,在这里while比for多做了这点事。不过从汇编的角度来说,都是一样的代码。 另一种解释: 看VC生成的汇编码,for比whil
linux中结束死循环
1.使用ctrl-c跳出死循环2.ps -ef|grep 名称 查询进程号3.kill 进程号
文件流中读行的正确使用(fgets、feof、ferror)
char *fgets(char *buf, int bufsize, FILE *stream);功能fgets函数用来从stream所指文件中读入bufsize-1个字符放入buf为起始地址的空间内;如果在未读满bufsize-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符。因此,调用fgets函数时,最多只能读入bufsize-
文件检测函数 feof, ferror,clearerr C库函数
文件检测函数 C语言中常用的文件检测函数有以下几个。 一、文件结束检测函数feof函数调用格式: feof(文件指针); 功能:判断文件是否处于文件结束位置,如文件结束,则返回值为1,否则为0。 二、读写文件出错检测函数ferror函数调用格式: ferror(文件指针); 功能:检查文件在用各种输入输出函数进行读写时是否出错。 如ferror返回值为0表示未出错,否则表示有错。 三、文件出错标志和文件结束标志置0函数clearerr函数调用格式: clearerr(文件指针); 功能:本函数用于清除出错标