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语言初学者都遇到过这种情况: 使用 while(!feof(fp)) { fscanf(...); //或者 //fread(...) } 读文件时经常会重复读最后一段字符。 据说当年的X老师对此也很困惑,还曾经对此做过专题分析…… 实际上这并没有多么高深莫测,也不是feof()函数的bug,只是我们不了解feof()函数的性质。 feof()的性质: 只
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语言 while(feof(fp)){}多循环一次解决方案
不用feof() 使用fgetc(fp)==EOF判断是否进行x
【C语言天天练(一)】while(1)死循环与for(;;)死循环的区别
单片机的编程中经常用到while(1)死循环来进行轮寻操作,但分析Linux内核源代码时却经常见到for(;;)作为死循环的条件。 两者区别: 区别一 for(;;)死循环里的两个;;代表两个空语句,编译器一般会优化掉它们,直接进入循环体。 while(1)死循环里的1被看成表达式,每循环一次都要判断常量1是不是等于零。 区别二 for.c源码: #include int mai
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((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...
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语言中feof的使用
本篇博客结合原理和实例分析了C语言编程中feof()函数的使用和EOF的含义。
C语言中的feof函数
函数名   feof 功 能   检测流上的文件结束符 用 法   int feof(FILE *stream); 程序例   #include stdio.h>   int main(void)   {   FILE *stream;   /* open a file for reading *
feof多读一次问题分析
在读完文件的最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多执行了一次。对于feof()这个函数, 它是先读再判断是否到文件尾, 也就是说在它之前一定要读一次才能做出判断。 而我们经常这样把它使用在循环中: int c; while(!feof(fp))
关于feof()多读取一次的问题(还未解决)
在编写C语言学生信息管理系统时,想编写一个读取文本的小功能时意外遇到一个小问题。void query()//读取文件 { FILE *P=fopen("E:\\practise\\a.txt","r");//以读的方式打开文件 char s[1024]={0};//分配一个空间 while(!feof(P)) { printf("%s"
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语言虽难,但是只要入门了,学习了那个思想后,就觉得容易多了!
c语言难吗? 只要有兴趣,一点都不难,在接触一种新东西的时候,还没开始不能就去考虑它难不难,你试过才知道。。编程只要多敲代码,多做练习和项目,每完成一个项目,你会有一定的成就感,这样你就会对编程越发又浓厚的兴趣,你就会越想去做更大的项目,到那时候,C语言对你来说就是很简单的了。 你可以去看一下《CPrimerplus(第五版)》,这本书很好。。是C语言的入门书。。把书上的练习和
C语言中死循环的三种写法
C语言中死循环的三种写法 1. while(1) {         ; } 2. for(; ;) {        ; } 3 LOOP: ...... goto LOOP; 第一种写法明显比第二种写法的效率要高,第三种常用在嵌入式编程中
关于<stdio.h>中feof()函数的问题
一、原型 1. 在头文件stdio.h中有如下宏定义(gcc): #define feof(__F) ((__F)->_flag & _IOEOF) #define _IOEOF 0x0010 /* EOF reached on read */ 2. 原型声明: _CRTIMP int __cdecl__MINGW_NOTHROW feof (FILE*);
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)判断文件结尾真的保险吗?
今天用文件输入时发现了一个值得注意的问题。 先看程序: #include #include int main(void) { FILE*in=fopen("1.txt","r"); int a,b; if(in==NULL) { printf("error:cannot open infile !\n"); r
feof()原理和用法
一、feof()是什么? feof()是检测流上的文件结束符的函数,如果文件结束,则返回非0值,否则返回0 一般在文件操作,中经常使用feof()判断文件是否结束。 二、feof()的经典错误 根据这个函数的定义,一般大家都是这样使用的,但是这样使用,文件中无论是否有内容,都会被判断为“文件不为空”。 #include&amp;amp;lt;stdio.h&amp;amp;gt; int mai...
C语言库函数文件操作(fread、fwrite、feof)
fread 函数名称:fread 函数功能: 从一个流中读数据 函数原型: size_t fread(void* buffer, size_t size, size_t count, FILE* stream);  参数说明: buffer:用于接收数据的地址(指针)。size:单个元素的大小,单位是字节而不是位,例如读取一个int型数据就是4个字节。count:元素个数。str
函数feof使用注意事项
本文主要讲讲当feof遇到fgets时,发生的尴尬故事!
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相关的一个死循环
<?php //下面代码在其他程序同时使用添加或更改数据源的时候,容易产生死循环 $filename= dirname(__FILE__) ."/test.txt"; $handle = fopen($filename, "r"); while (!feof($handle)) { $buffer = fgets($handle, 4096); $line = trim($b
linux中结束死循环
1.使用ctrl-c跳出死循环2.ps -ef|grep 名称 查询进程号3.kill 进程号
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语言错误之死循环
#include //打印值 void print(int value) { if (value == 0) { //跳出函数 // break; 错误 return; } printf("%d ",value); value --; print(value); /* 注意:死循环 if (value == 0) { //跳出函数 // break;
“采用while(!feof(FP)){...}进行文件复制时,目标文档总会比源文档多出一些” 原因探析及解决方法
1.问题提出: 目标:  假设源文件共有3个double型的数据,1.0,2.0,3.0,我希望将源文件中的数据复制到另一文件中,都以二进制形式打开和保存。 设源文件路径为inpath,目标文件为outpath。   代码:         FILE *fin,*fout;         fin=fopen(inpath,"rb");         fout=fopen(outp
二次抛物线拟合
用二次抛物线拟合数组中的某些点,结果我写的陷入了死循环了
for(;;)和while(1)两种死循环的区别
有些编译器在写程序时会自动生成死循环代码,大多是使用for形式的,我们自己写程序,经常用的while(1),所以有些不解,查询网络后得出以下结论 即 for(;;)和while(1)两种死循环的区别: 1、 for(;;)死循环里的两个;;代表两个空语句,编译器一般会优化掉它们,直接进入循环体。 while(1)死循环里的1被看成表达式,每循环一次都要判断常量1是不是等于零。
feof的使用
在未知文件长度的 情况下,对文件进行读写,要作好文件读写结束的判断。 但feof()有点小毛病,特点:先读,根据读的结果来置位标志位,然后依据标志位来判断是否结束,故有如下三种 写法: 第一种写法,会读到标志位,不应采取,新手,容易范的错误。 第二种写法,可行,但是循环写的不够漂亮。 第三种写法, 应该作为标准写法来推行。 /*  *方案一:先判断,后读取  */ while (
文件流中读行的正确使用(fgets、feof、ferror)
char *fgets(char *buf, int bufsize, FILE *stream);功能fgets函数用来从stream所指文件中读入bufsize-1个字符放入buf为起始地址的空间内;如果在未读满bufsize-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符。因此,调用fgets函数时,最多只能读入bufsize-
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...
eclipse运行程序时 出现死循环
eclipse运行程序时出现死循环
C语言feof()函数用法.
feof()函数的意思是用来判断你读到了文件的外面. 而不是判断文件指针是否到达文件尾部(指向文件最后一个字符的后面). 如果在while表达式里直接用feof()判断是否到达文件尾,则结果总会多读一次. 下面是正确的写法. #include int main() { int c; FILE*file=fopen("test.txt","r"); while(1){ c=fg
while(1)和for(;;)两个死循环有什么区别
一般for(;;)性能更优 for(;;)   {} 复制代码 这两个;; 空语句,编译器一般会优掉的,直接进入死循环 while(1)   {} 复制代码 每循环一次都要判断常量1是不是等于零,在这里while比for多做了这点事。不过从汇编的角度来说,都是一样的代码。 另一种解释: 看VC生成的汇编码,for比whil
feof多读一次数据的问题
在读完文件的最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()或者fread执行读操作,feof()才能探测到文件结尾。这样就多执行了一次。对于feof()这个函数, 它是先读再判断是否到文件尾, 也就是说在它之前一定要读一次才能做出判断。 开始我的代码是这样的 typedef struct {     cha
关于feof函数使用的说明
函数原型: int feof(FILE *stream); 功能:检测流上的文件结束符 返回值:feof(fp)有两个返回值:如果遇到文件结束,函数feof(fp)的值为非零值,否则为0。 什么时候结束了,当读取到那个字节为0xFF时,就结束了。 EOF是文本文件结束的标志,在文本文件中都是以ASCII码字符表示的,取值范围 0-127 共128个字符,EOF的16进制代码为0x1A(十进
文章热词 C/C++ Go语言 C/C++培训 C/C++入门教程 C/C++课程
相关热词 c语言 go语言vs c语言c++c语言数据结构 c# timer中死循环 python教程c语言 学习c语言还是python