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条回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C语言中死循环的三种写法
C语言中死循环的三种写法 1. while(1) {         ; } 2. for(; ;) {        ; } 3 LOOP: ...... goto LOOP; 第一种写法明显比第二种写法的效率要高,第三种常用在嵌入式编程中
C语言 while(feof(fp)){}多循环一次解决方案
不用feof() 使用fgetc(fp)==EOF判断是否进行x
feof()多读一次的解决方法
查看 stdio.h 可以看到如下定义:   #define  EOF  (-1)   #define  _IOEOF  0x0010  #define  feof(_stream)  ((_stream)->_flag & _IOEOF)   由此可以看出,这两种方式的原理是不同的。   在这里先说下EOF和feof()这个两个宏定义,在我们学的课本中有这样的描述。 EOF是
feof 函数 while循环引发的断错误及调试方法
学习lex and yacc,例子ch1-05.*执行命令 如下:               lex   ch1-05.l               bison  -d  ch1-05.y               cc   -c   lex.y.c   ch1-05.tab.c               cc   -o   ch105     le
关于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
fgets重复读取最后一行,都是feof惹的祸
写了一个小程序用于读取文件,每次输出时最后一行都重复输出,经Debug发现是因为feof慢了一拍。当fgets读过最后哦一行之后,feof()仍然返回的是0,又一次读出错之后feof才检测到文件结束。下面用代码来说明:  FILE *fd;   char buf[1024];   string temp;   fd = fopen(filename.c_str(), "rb");   i
【C语言天天练(一)】while(1)死循环与for(;;)死循环的区别
单片机的编程中经常用到while(1)死循环来进行轮寻操作,但分析Linux内核源代码时却经常见到for(;;)作为死循环的条件。 两者区别: 区别一 for(;;)死循环里的两个;;代表两个空语句,编译器一般会优化掉它们,直接进入循环体。 while(1)死循环里的1被看成表达式,每循环一次都要判断常量1是不是等于零。 区别二 for.c源码: #include int mai
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作为文件结束标志,
关于C语言中feof的使用
本篇博客结合原理和实例分析了C语言编程中feof()函数的使用和EOF的含义。
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()
最近做开发的时候用到c语言文件的读写函数fread(),采用while(!feof(fp))来控制循环,结果发现每次读取数据的时候总会把最后一个数据单元读取两次,很是不解。         后来查找资料发现,原来fread()在读到文件最后一个字节时,feof(fp)还是为0值,此时while(!feof(fp))的控制条件依然为真,所以会将最后一个数据单元再次读取一遍。然后feof(fp)才为
feof多读一次数据的问题
在读完文件的最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()或者fread执行读操作,feof()才能探测到文件结尾。这样就多执行了一次。对于feof()这个函数, 它是先读再判断是否到文件尾, 也就是说在它之前一定要读一次才能做出判断。 开始我的代码是这样的 typedef struct {     cha
嵌入式系统中的死循环C语言写法,while(1)和for(;;)区别
一般for(;;){}性能更优 for(;;){} 这两个;;空语句,编译器一般会优掉的,直接进入死循环 while(1){} 每循环一次都要判断常量1是不是等于零,在这里while比for多做了这点事 不过从汇编的角度来说,都是一样的代码。 ...
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多读一次问题分析
在读完文件的最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多执行了一次。对于feof()这个函数, 它是先读再判断是否到文件尾, 也就是说在它之前一定要读一次才能做出判断。 而我们经常这样把它使用在循环中: int c; while(!feof(fp))
feof()原理和用法
一、feof()是什么? feof()是检测流上的文件结束符的函数,如果文件结束,则返回非0值,否则返回0 一般在文件操作,中经常使用feof()判断文件是否结束。 二、feof()的经典错误 根据这个函数的定义,一般大家都是这样使用的,但是这样使用,文件中无论是否有内容,都会被判断为“文件不为空”。 #include&amp;amp;lt;stdio.h&amp;amp;gt; 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语言两种方式死循环的区别
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!
从文件读入数据块时用feof(fp)判断文件结尾真的保险吗?
今天用文件输入时发现了一个值得注意的问题。 先看程序: #include #include int main(void) { FILE*in=fopen("1.txt","r"); int a,b; if(in==NULL) { printf("error:cannot open infile !\n"); r
for(;;)和while(1)两种死循环的区别
在JUC的源码中,经常看到for(;;),为什么不使用while(true)呢?for(;;)死循环里的两个;;代表两个空语句,编译器一般会优化掉它们,直接进入循环体。 while(true)死循环里的true被看成表达式,每循环一次都要判断表达式是否真。 即,相对来说for式死循环更加高效一点。当然以上条件成立还要看编译器的优化,一些编译器优化的两者并无区别,但是,并非所有的编译器都做了这样的优...
关于跳出while(1)死循环问题
最近也是再看题的时候看到了这个东西。同样也是再写需求中出现的东西。也就是while(1)死循环,有时候我们想让一个while一直循环。到需要的时候跳出循环。这种要怎么办??? 来看一道题: while(1){ switch(&quot;a&quot;){ case &quot;a&quot; : console.log(true); //修改代码不让while死循环,...
C语言feof()函数用法.
feof()函数的意思是用来判断你读到了文件的外面. 而不是判断文件指针是否到达文件尾部(指向文件最后一个字符的后面). 如果在while表达式里直接用feof()判断是否到达文件尾,则结果总会多读一次. 下面是正确的写法. #include int main() { int c; FILE*file=fopen("test.txt","r"); while(1){ c=fg
C语言文件指针的基本函数介绍包含了fpoen、fclose、fgetc、fputc、fscanf、fprintf、fgets、fputs、fread、fwrite函数以及文件定位函数.
一、打开关闭文件 只打开文件   再关闭文件 #include #include main() { FILE *fp; fp = fopen("data.dat","r"); //打开文件 if(fp == NULL) { printf("Cannot open this file!\n "); exit(0); //头文件需要有 stdlib.h
“采用while(!feof(FP)){...}进行文件复制时,目标文档总会比源文档多出一些” 原因探析及解决方法
1.问题提出: 目标:  假设源文件共有3个double型的数据,1.0,2.0,3.0,我希望将源文件中的数据复制到另一文件中,都以二进制形式打开和保存。 设源文件路径为inpath,目标文件为outpath。   代码:         FILE *fin,*fout;         fin=fopen(inpath,"rb");         fout=fopen(outp
二次抛物线拟合
用二次抛物线拟合数组中的某些点,结果我写的陷入了死循环了
while循环中使用输出语句停止死循环的原因
直接看代码 public class WhileTest { private boolean flag = true; public void setFlag(boolean flag) { this.flag = flag; } public void say() { while(flag) { } System.out.println(&quot;--------------...
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语言按行读取文件的正确使用:fgets、feof、ferror
转自 https://blog.csdn.net/yss28/article/details/53453959 一、fgets函数 原型 char *fgets(char *buf, int bufsize, FILE *stream); 功能 fgets函数用来从stream所指文件中读入bufsize-1个字符放入buf为起始地址的空间内;如果在未读满bufsize-1个字符之时...
C语言scanf语句输入跳过造成死循环的解决办法
现象描述:在编写C语言程序时,需要使用scanf语句从键盘上输入一个整型的数时,当错误的输入了字符时,scanf语句就好像不会执行,但从键盘输入其他数字又无法获取。 问题分析:当定义scanf语句接收整型数值时,它就会跳过所有的非数字的字符,专接收数字。当输入了字符时,字符就会留在缓冲区,只要缓冲区又字符,scnaf就会去读,一读发现不是数字,就会跳过,只有当输入缓冲区没有字符了才等待你去输入,...
feof的使用
在未知文件长度的 情况下,对文件进行读写,要作好文件读写结束的判断。 但feof()有点小毛病,特点:先读,根据读的结果来置位标志位,然后依据标志位来判断是否结束,故有如下三种 写法: 第一种写法,会读到标志位,不应采取,新手,容易范的错误。 第二种写法,可行,但是循环写的不够漂亮。 第三种写法, 应该作为标准写法来推行。 /*  *方案一:先判断,后读取  */ while (
在循环中的scanf()不被执行面陷入死循环
今天好蠢,期末忙于应付考试编个小程序手都生了, scanf("%d",&p->num);写成了scanf("&d",&p->num); 【当时还以为是结构体的问题呢= =】还有,scanf里的“”中间的部分并不会给你检错!!! 原因: '&d'并不是一个符合scanf格式化的一个输入,因为格式化要求输入一个“&d”,所以输入成功的个数就0,也就是scanf返回值=0 此时程序进入
函数feof使用注意事项
本文主要讲讲当feof遇到fgets时,发生的尴尬故事!
C语言:feof 测试 --- 文件末尾,数据重复问题
如下程序: #include &amp;amp;amp;lt;stdio.h&amp;amp;amp;gt; #include &amp;amp;amp;lt;string.h&amp;amp;amp;gt; #include &amp;amp;amp;lt;stdlib.h&amp;amp;amp;gt; #include &amp;amp;amp;lt;sys/stat.h&amp;amp;amp;gt; typedef unsigned char BYTE; typedef uns
c语言中,while(1)语句使用break语句跳出循环
这个要分情况的:1:本身条件就有出口,这样的话,可以自然退出,也可以认为退出2:如果本身条件永远不可能满足,例如:while(1)像这种的话想要退出的话就必须人为干涉,例如int num = 0;while(1){ num++; if(num &amp;gt;1000)break;}注意:一般这类的循环都是用break退出的。   while(1)中执行到属于while自身的break语句。break...
巧用while(true){ }死循环的一个小例子
package cn.itcast.zuoye_GuanQia2_day03;/* * 请按如下要求编写程序,打印菜单: 1.从键盘上录入一个1到5的数字; 2.当数字为1时打印菜单”新建”; 当数字为2时打印菜单”打开文件”; 当数字为3时打印菜单”保存”; 当数字为4时打印菜单”刷新”;
c语言学习(while)中自己遇到的陷阱
在看书时,似乎看到这个陷阱,但直到自己遇到,确实感觉可怕。 我先贴出错误代码: /* count.c ----简单的计数程序*/ #include #define SIZE 10000 int main(void) { int i = SIZE; int j = SIZE; /*开始进行计数*/ while( j--) while( i--) ; /*
关于feof函数使用的说明
函数原型: int feof(FILE *stream); 功能:检测流上的文件结束符 返回值:feof(fp)有两个返回值:如果遇到文件结束,函数feof(fp)的值为非零值,否则为0。 什么时候结束了,当读取到那个字节为0xFF时,就结束了。 EOF是文本文件结束的标志,在文本文件中都是以ASCII码字符表示的,取值范围 0-127 共128个字符,EOF的16进制代码为0x1A(十进
文章热词 设计制作学习 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 学习大数据c语言 python教程c语言