C语言大神请进,关于文件内部指针移动的问题
while(!feof(fp_B))//fp_B指向文件B{ch=fgetc(fp_B);str[i++]=ch;}这是我的部分代码我想问的是:为什么这段代码会将文件B末...
while ( !feof(fp_B) ) //fp_B指向文件B
{
ch = fgetc(fp_B);
str[i++] = ch;
}
这是我的部分代码
我想问的是: 为什么这段代码会将文件B末尾的结束符(EOF)储存在str中
我将代码改为:
ch = fgetc(fp_B);
while ( !feof(fp_B) )
{
str[i++] = ch;
ch = fgetc(fp_B);
}
就不会出现这种情况,为什么?
文件内部的指针到底是在执行哪些语句的时候会右移啊? 展开
{
ch = fgetc(fp_B);
str[i++] = ch;
}
这是我的部分代码
我想问的是: 为什么这段代码会将文件B末尾的结束符(EOF)储存在str中
我将代码改为:
ch = fgetc(fp_B);
while ( !feof(fp_B) )
{
str[i++] = ch;
ch = fgetc(fp_B);
}
就不会出现这种情况,为什么?
文件内部的指针到底是在执行哪些语句的时候会右移啊? 展开
展开全部
这是逻辑设计问题。
判断是否读到 EOF 的判断应当在读语句后面进行。
这是读 ch = fgetc(fp_B);
如果读到 EOF 就不要存放,并退出循环
否则 str[i++] = ch;
while(1){ ch = fgetc(fp_B); if ( feof(fp_B) ) break; str[i++] = ch;};
如果不管读到什么,你先存放,再判断,你就多存了一EOF.
判断是否读到 EOF 的判断应当在读语句后面进行。
这是读 ch = fgetc(fp_B);
如果读到 EOF 就不要存放,并退出循环
否则 str[i++] = ch;
while(1){ ch = fgetc(fp_B); if ( feof(fp_B) ) break; str[i++] = ch;};
如果不管读到什么,你先存放,再判断,你就多存了一EOF.
更多追问追答
追问
逻辑没问题,我的第一段代码,是先判断在存放,feof判断的时候指针不会右移,所以我每次存放的,都是事先经过feof判断过的
追答
"我每次存放的,都是事先经过feof判断过的" -- 没有。无论ch是什么,你是先存放再判断。
feof 并不直接同文件打交道,它只是检查文件系统的标志EOF灯是否亮了。而EOF灯的点亮,是读语句做的事,读到了EOF,点亮EOF。
你的逻辑错。看你写的语句次序
while ( !feof(fp_B) ) { ch = fgetc(fp_B); str[i++] = ch; }你的次序是:
(1) while(! feof(fp_B)) 先判断是否读到了EOF
(2) ch = fgetc(fp_B); 读,即使读到了EOF,也赋给ch
(3) 存放ch,回到1,继续循环。
---
当你的(2)读到了EOF,你没有及时终止循环,却执行了(3),把EOF 存放起来,
存完,回到1,判断是否EOF。 这时再结束循环。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询