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语言 - while循环体内变量重新声明,陷入死循环。
今天写一个实验代码时,用到了while(exp)循环。发现exp已经为false。但是依然死循环下去。nnnfloat T = (float)work[srcNode] / (workAll/6);n int consume = 0;n float flag = 1.5;n while( T &amp;gt; flag ){ n consume += (work[srcNode] - work[dict...
关于C语言feof()函数判断文件结尾的问题分析
相信很多C语言初学者都遇到过这种情况:nn使用nnnnnwhile(!feof(fp))n{n fscanf(...);n //或者n //fread(...)n}nn读文件时经常会重复读最后一段字符。nn实际上这并非feof()函数的bug,只是我们不了解feof()函数的性质。nnnfeof()的性质:nn只有当文件位置指针指向文件末尾,再发生读/写操作,然后再调用feof()时,才会得到...
feof多读一次数据的问题
在读完文件的最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()或者fread执行读操作,feof()才能探测到文件结尾。这样就多执行了一次。对于feof()这个函数, 它是先读再判断是否到文件尾, 也就是说在它之前一定要读一次才能做出判断。rn开始我的代码是这样的rnrntypedef structrn{rn    cha
文件流中读行的正确使用(fgets、feof、ferror)
char *fgets(char *buf, int bufsize, FILE *stream);功能fgets函数用来从stream所指文件中读入bufsize-1个字符放入buf为起始地址的空间内;如果在未读满bufsize-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符。因此,调用fgets函数时,最多只能读入bufsize-
嵌入式系统中的死循环C语言写法,while(1)和for(;;)区别
一般for(;;){}性能更优nfor(;;){}n这两个;;空语句,编译器一般会优掉的,直接进入死循环nwhile(1){}n每循环一次都要判断常量1是不是等于零,在这里while比for多做了这点事n不过从汇编的角度来说,都是一样的代码。nn...
C语言再学习 -- EOF、feof函数、ferror函数
EOF是end of file的缩写,表示"文字流"(stream)的结尾。这里的"文字流",可以是文件(file),也可以是标准输入(stdin)。nEOF不是特殊字符,而是一个定义在头文件stdio.h的常量,一般等于-1。nn#define EOF (-1)n在C语言中,或更精确地说成C标准函数库中表示文件结束符(end of file)。在while循环中以EOF作为文件结束标志,
C语言:feof 测试 --- 文件末尾,数据重复问题
如下程序:rn#include &amp;amp;amp;lt;stdio.h&amp;amp;amp;gt;rn#include &amp;amp;amp;lt;string.h&amp;amp;amp;gt;rn#include &amp;amp;amp;lt;stdlib.h&amp;amp;amp;gt;rnrn#include &amp;amp;amp;lt;sys/stat.h&amp;amp;amp;gt;rnrntypedef unsigned char BYTE;rntypedef uns
C语言 while((c=getchar())!=EOF)死循环解决办法
死循环代码例子如下n(代码目的为得到文本中的行数、词数、字符个数)n#include &amp;lt;stdio.h&amp;gt;n#include &amp;lt;windows.h&amp;gt;nint main(void)n{n int c,nl,nw,nc,inword;n nl=nw=nc=inword=0;n while((c=getchar())!=EOF)n {n nc++;n if(c=='\n') n...
for语句引起一个死循环而引发的思考!!!
对于一个简单地for语句,学过C的朋友可能觉得很简单,但是,看完下面这个看似简单程序还能想明白的朋友(实则并不简单),n那才是真的不错,,好了,不废话了,大家看代码吧!!!nn#include n#include nnint main(){n int i;n int a[5];n n for(i = 0; i <= 5; i++)n a[i] = 0;n n printf("programming form
函数feof使用注意事项
本文主要讲讲当feof遇到fgets时,发生的尴尬故事!
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字节,如果调用成功返回实际读取到的元素个数,如果不成功或读到文件末尾返回
feof()原理和用法
nn一、feof()是什么?nnn feof()是检测流上的文件结束符的函数,如果文件结束,则返回非0值,否则返回0nnn一般在文件操作,中经常使用feof()判断文件是否结束。nnnnnn二、feof()的经典错误nn根据这个函数的定义,一般大家都是这样使用的,但是这样使用,文件中无论是否有内容,都会被判断为“文件不为空”。nnnn#include&amp;amp;lt;stdio.h&amp;amp;gt;nint mai...
for(;;)和while(1)两种死循环的区别
在JUC的源码中,经常看到for(;;),为什么不使用while(true)呢?for(;;)死循环里的两个;;代表两个空语句,编译器一般会优化掉它们,直接进入循环体。 while(true)死循环里的true被看成表达式,每循环一次都要判断表达式是否真。 即,相对来说for式死循环更加高效一点。当然以上条件成立还要看编译器的优化,一些编译器优化的两者并无区别,但是,并非所有的编译器都做了这样的优...
二次抛物线拟合
用二次抛物线拟合数组中的某些点,结果我写的陷入了死循环了
C语言feof函数的一个简单示例
#includenint main()n{n FILE* fp = NULL;n char ch = NULL;n fp = fopen("1.txt","r");n ch = fgetc(fp);n while(!feof(fp))n {n printf("%c\n",ch);n ch = fgetc(fp);n }n fclose(fp);n return 0;n}rn图一:
用feof()判断文件时出现多读内容的问题
昨天将自己以前做的电子通讯录加上了文件读写的功能,是的数据可以关机保存,开机读取。n在修改的过程中出现了一个问题就是每次开启程序时,读文件内的内容总是会在最后多读一串数据,经过上网查询找到了问题所在。n下面我先把我原来写的错误的程序部分贴出nwhile(0 == feof(stream)) n{nfread(&from,sizeof(struct file_node),1,stream)
C 语言用 while 循环来写一个内存泄漏的例子
#include &lt;stdlib.h&gt;n#include &lt;stdio.h&gt;nint main(){n while(1){ //死循环n malloc(1024); //分配1024个字节的内存n }nn return 0;n}nnwhile 循环的条件是 1,始终成立,循环会一直进行下去,永无休止,所以是一个“死循环”。n每次循环,程...
关于feof()多读取一次的问题(还未解决)
在编写C语言学生信息管理系统时,想编写一个读取文本的小功能时意外遇到一个小问题。void query()//读取文件n{n FILE *P=fopen("E:\\practise\\a.txt","r");//以读的方式打开文件n char s[1024]={0};//分配一个空间n while(!feof(P))n {n printf("%s"
在循环中的scanf()不被执行面陷入死循环
今天好蠢,期末忙于应付考试编个小程序手都生了,nscanf("%d",&p->num);写成了scanf("&d",&p->num);n【当时还以为是结构体的问题呢= =】还有,scanf里的“”中间的部分并不会给你检错!!!nn原因:nn'&d'并不是一个符合scanf格式化的一个输入,因为格式化要求输入一个“&d”,所以输入成功的个数就0,也就是scanf返回值=0n此时程序进入
shell死循环 (crtrl+c)永不打断
首先我们要知道shell脚本的基本写法n然后就直接步入正题:nshell里的死循环想必大家都知道,在这里随便举个例子n#!bin/bashn#authors Mr Zhounwhile :ndonecho “死循环”ndonen这样一个基本死循环就出来了,那么想要ctrl+c打不断的话,n就需要知道ctrl+c的原理。在linux系统中存在许多信号类型,当然也存在信号的捕捉,ctrl+c其实就是一...
fread feof 文件尾读取重复的问题
问题:rn 多路归并排序时,每次通过fread读取小文件里的一个double数据,通过feof判断是否读取结束,rn 结果,在最后总的排序文件中,每个小文件的最后一行的数据回重复一遍rnrnrn原因:rn  feof只是检查标志位,如果是good则返回0,是bad就返回1。rn  更改标志位的fread函数,只有当它读不到东西了,才会把标志位从good变成bad,当fread读到最后一个字符时,由
巧用while(true){ }死循环的一个小例子
package cn.itcast.zuoye_GuanQia2_day03;/* n * 请按如下要求编写程序,打印菜单: n 1.从键盘上录入一个1到5的数字; n 2.当数字为1时打印菜单”新建”; n 当数字为2时打印菜单”打开文件”; n 当数字为3时打印菜单”保存”; n 当数字为4时打印菜单”刷新”;
Vue 之vue-router router.beforeEach导航守卫,陷入死循环
官方文档 :https://router.vuejs.org/zh/guide/advanced/navigation-guards.htmlnn判断浏览器缓存是否有用户的信息,没有的话跳转登录页。n看了官方文档,直接这样写了。(试了手动清除缓存,再从url里面跳登录页,直接陷入了死循环)nnnrouter.beforeEach((to,from,next)=&amp;gt;{n if(sessionS...
C语言scanf语句输入跳过造成死循环的解决办法
现象描述:在编写C语言程序时,需要使用scanf语句从键盘上输入一个整型的数时,当错误的输入了字符时,scanf语句就好像不会执行,但从键盘输入其他数字又无法获取。nn问题分析:当定义scanf语句接收整型数值时,它就会跳过所有的非数字的字符,专接收数字。当输入了字符时,字符就会留在缓冲区,只要缓冲区又字符,scnaf就会去读,一读发现不是数字,就会跳过,只有当输入缓冲区没有字符了才等待你去输入,...
While_continue 语句里容易出现的一个死循环及解决办法
package cn.itcast.zuoye_GuanQia1_day03; n/* n * 需求:使用while循环, 输出10次HelloWorld.请在跳过第4次输出. n * n */public class While_Continue {public static void main(String[] args) {n int i = 1; while (i &lt;= 10)
怎样解决使用feof()函数时出现的问题?
feof函数rn       昨天在做一个课程设计时,一个函数的功能是将文件中的数据一条条的读到链表中去。既然不确定有多少条数据,那只能借助feof()函数了,本来文件部分就没学好,也就知道这一个方法。但是在测试的后就发现了它的问题,就是在判断是否到达文件尾的时候,它会多读一次,就导致从文件读出的部分内容是错的。可能在课堂上老师就讲到了,可是我不知道当时在干啥,反正就是不记得。更关键的是我还不知道
迷阵突围(dijkstra求次短路径)
求图中的次短路径输入格式第一行输入两个整数 n (1≤n≤200) 和 m,表示一共有 n 个点和 m 条边。接下来输入n 行,每行输入两个整数xi​,yi​ (−500≤xi​,yi​≤500),代表第i 个点的坐标。接下来输入 m 行,每行输入两个整数pj​,qj​ (1≤pj​,qj​≤n),表示点 pj​ 和点 qj​ 之间相连。输出格式输出一行,输出包含一个数,表示第二短的路径长度(小数...
feof函数多读一次问题分析
feof函数多读一次问题分析,详细讲解为什么会多读一次原因
for(;;)和while(1)两种死循环的区别
有些编译器在写程序时会自动生成死循环代码,大多是使用for形式的,我们自己写程序,经常用的while(1),所以有些不解,查询网络后得出以下结论 n即 for(;;)和while(1)两种死循环的区别: n1、 for(;;)死循环里的两个;;代表两个空语句,编译器一般会优化掉它们,直接进入循环体。 n while(1)死循环里的1被看成表达式,每循环一次都要判断常量1是不是等于零。
eclipse运行程序时 出现死循环
eclipse运行程序时出现死循环
数组越界会造成死循环
数组越界问题编译器是不会报错的,数组越界是不可估计的。但是数组越界会给程序带来死循环,例如:#include <stdio.h>n#include <stdlib.h>nint main()n{n int i = 0;n int arr[10];//a[0]--a[9]一共10个元素n for(i = 0; i<=12; i++)//下标越界,造成死循环n {
为什么我这个函数陷入了死循环
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。n输入格式n  输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。n输出格式n  输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。n样例输入n3 3n1 2 3n4 5 6n7 8 9n样例输出n1 4 7 8 9 6 3 2 5n```n #includenint m,n,a[200][200]=0,b[200][200]=0,s=0,num=0;nvoid solve(int i,int j)nn if(b[i][j]==0&&i>=0&&j>=0&&i
【bug笔记】scanf不停下来接收输入陷入死循环 fflush(stdin)与其他读取缓冲区字符的方法
main()n{nn HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台输出句柄n int num;n score *head = NULL, *stu = NULL;n system("color f0");n menu();nn scanf("%d", &num);nn while (1)n {n switch (num)n
没有用循环语句却陷入了死循环?
一个strncpy搞得我几天来寝食难安,貌似直接看strncpy的源码也不顶用!有谁知道strncpy到底是个什么原理啊,msdn对许多细节都没交代清rnrn楚啊rn问题一:为什么下面这段代码会陷入死循环?(xpsp2+vc6)rn#include "stdio.h"rn#include "string.h"rnvoid main(void)rnchar ch[]="dogs123";rnstrncpy(ch+6,"iii",7);rnprintf("%d",*(ch+10));rnrnrn问题二:为什么char *strncpy( char *strDest, const char *strSource, size_t count );中的count大于sizeof strDest时会出现提示内存rnrn不能为写的错误?rnrn问题三:为什么下面这段代码会提示内存不能为写?rnvoid main(void)rnchar ch[]="dogs123";//改成char ch[]="dogs";或者char ch[]="dogs123iii";后又正常了?!rnstrncpy(ch+7,"iii",3);rnprintf("%s\n",ch);rnrnrn问题四:rn#include "stdio.h"rn#include "string.h"rnvoid main(void)rnchar ch[]="dogs123";rnprintf("%d\n",strlen(ch));rnprintf("%d\n",sizeof(ch));rnstrncpy(ch,"iii",5);rnprintf("%s\n",ch);rnprintf("%d\n",strlen(ch));rnprintf("%d\n",sizeof(ch));//为什么仍然是8???rnrnrn参考资料:微软C运行时库中strncpy函数的源码如下:rn/***rn*strncpy.c - copy at most n characters of stringrn*rn* Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.rn*rn*Purpose:rn* defines strncpy() - copy at most n characters of stringrn*rn*******************************************************************************/rnrn#include rn#include rnrn/***rn*char *strncpy(dest, source, count) - copy at most n charactersrn*rn*Purpose:rn* Copies count characters from the source string to thern* destination. If count is less than the length of source,rn* NO NULL CHARACTER is put onto the end of the copied string.rn* If count is greater than the length of sources, dest is paddedrn* with null characters to length count.rn*rn*rn*Entry:rn* char *dest - pointer to destinationrn* char *source - source string for copyrn* unsigned count - max number of characters to copyrn*rn*Exit:rn* returns destrn*rn*Exceptions:rn*rn*******************************************************************************/rnrnchar * __cdecl strncpy (rn char * dest,rn const char * source,rn size_t countrn )rnrn char *start = dest;rnrn while (count && (*dest++ = *source++)) /* copy string */rn count--;rnrn if (count) /* pad out with zeroes */rn while (--count)rn *dest++ = '\0';rnrn return(start);rnrn
用while(true)和continue、break来实现在一个大循环里switch
while (true) {n System.out.println("输入命令:1-按照名称查找图书;2-按照序号查找图书");n String book;n try {n //取得整型命令n int command = inputCommand();
关于跳出while(1)死循环问题
最近也是再看题的时候看到了这个东西。同样也是再写需求中出现的东西。也就是while(1)死循环,有时候我们想让一个while一直循环。到需要的时候跳出循环。这种要怎么办???nn来看一道题:nnnwhile(1){n switch(&quot;a&quot;){n case &quot;a&quot; :n console.log(true);n //修改代码不让while死循环,...
【NOIP2017提高A组集训10.21】Fantasy
Y sera 陷入了沉睡,幻境中它梦到一个长度为N 的序列{Ai}。 n对于这个序列的每一个子串,定义其幻境值为这个子串的和,现在Y sera 希望选择K 个不同的子串并使得这K 个子串的幻境值之和最大。 n然而由于梦境中的种种限制,这些子串的长度必须在L 到R 之间。 n你需要告诉她,最大的幻境值之和。分析题目要求求出最大的和,那显然就是找出最大的k个子串。 n考虑怎么找出最大的k个子串。
死循环的调试
当Java程序中出现了死循环的时候,可以通过以下步骤来解决nn①首先判断循环跳出的条件是否可以结束循环,把具体的例子代入进去看看程序的逻辑是否符合可以跳出循环nn②当真的判断不出来哪里出现错误的时候此时可以使用输出语句输出相关的值查看相关情况来进行进一步的判断,但是往往出现死循环的时候往往在控制台打印的时候打印出来的数字是跳跃的,无法观看,此时需要定义一个变量来计数,在循环中计数,当循环达到一定的...
Shell中让程序造死循环的几种方式
有时候需要造个死循环,或者让程序一直运行下去,这个时候就要用到while,归纳汇总了让Shell脚本一直运行下去的几种方式:
纯c语言实现多任务程序,c
纯c语言实现的一个多任务小程序,标准C语言编写,模拟多任务运行的状态,可以移植到任意平台,代码写的很简单,适合C初学者,只是抛砖,作为启发只用,高端C开发人员可以忽略,不喜勿喷
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 怎么学习互联网大数据 村干部学习大数据心得