如何判断读取文件结束

jiangmingfu010 2008-06-13 12:04:34
在不知道一个文件有多大的情况下,读取它,如何判断读取结束????
i = 0 ;
while(结束条件)

{
infile>>stu[i].num>>stu[i].name>>stu[i].English>>stu[i].math>>stu[i].sunnary;

cout<<stu[i].num<<" "<<stu[i].name<<" "<<stu[i].English<<" "<<stu[i].math<<" "<<stu[i].sunnary<<endl;

i++ ;
}

请告诉我用什么判断结束???

谢谢
...全文
2991 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
mjlrecall 2011-08-09
  • 打赏
  • 举报
回复
eof()就相当好用,mark~
loverriverstar 2011-04-08
  • 打赏
  • 举报
回复
我用的是 读取行或者单词的.也就是遇到空格或者换行就读ifstream infile("文件.text");
string param1,param2;
do{
if(infile >> param1 >> param2)
{
....
}
}while(!infile.eof());
吴明治 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 matrixdwy 的回复:]
引用 4 楼 baihacker 的回复:
额,你别误导人啊,文件本身哪里有文件结束符了?
文件结束的情况是,在尝试读取相应数据的时候,达到结束,然后某个标志被设置.
你的这个只是保证了在读入合法数据,当然这样的更强,更满足题目要求,但是和你说的那个东西无关.
最常见的情况是,在读了最后一组数据以后又多读了一组数据,而且最后两组数据一样,这种问题就是用visame的办法解决.
我经常是
while (文件未结束)
{
if (没有成功读取) break;
处理数据;
}
文件是否结束的情况比较复杂,有的时候读了最后一个字符也没有结束,比如fscanf("%c", &data);
因为只读入最后一个字符的时候,并没有作向前检查

fscanf("%d", &data);
读了最后一个整数后,会结束的.
因为会向前检查一次,如果下一个是非数字,当然返回,如果下一个已经达到文件尾了,当然也返回.
所以这一次向前检查导致了这个问题.
在大多数的时候,是有向前检查的.

我的经常的做法是,无论如何,最后一组数据是特殊数据,然后判断,结束.
这样虽然会慢一些,但是稳定性好.
说的对,经常会有最后一条数据读两遍的情况
[/Quote]
说得对啊 我正好碰到这样的情况
songfree 2008-06-15
  • 打赏
  • 举报
回复
for(; !feof(fp);)
{
//c = fgetc(fp);
fgets(buf,buflen,fp);
if(feof(fp))
{
break;
}
}
mhyx_2008 2008-06-15
  • 打赏
  • 举报
回复

0 19 #include<stdio.h>
19 27 main()
27 30 {
30 50 char buf[100];
50 71 FILE *fp1,*fp2;
71 83 int n;
83 95 int m;
95 97
97 127 fp1=fopen("file.c","r");
127 159 fp2=fopen("file.txt","w");
159 165
165 188 while(!feof(fp1))
188 195 {
195 215 n=ftell(fp1);
215 244 fgets(buf,100,fp1);
244 267 m=ftell(fp1);
267 310 fprintf(fp2,"%d %d\t%s",n,m,buf);
310 317 }
317 372 fprintf(fp2,"size of file.c is %d\n",ftell(fp1));
372 390 fclose(fp1);
390 408 fclose(fp2);
408 411 }
411 413 //空行应该是什么都没有,但文件指针却偏移了2个字节,怎么回事???????
413 413
size of file.c is 413

mhyx_2008 2008-06-15
  • 打赏
  • 举报
回复
下边的程序保存为文件file.c

#include<stdio.h>
main()
{
char buf[100];
FILE *fp1,*fp2;
int n;
int m;

fp1=fopen("file.c","r");
fp2=fopen("file.txt","w");

while(!feof(fp1))
{
n=ftell(fp1);
fgets(buf,100,fp1);
m=ftell(fp1);
fprintf(fp2,"%d %d\t%s",n,m,buf);
}
fprintf(fp2,"size of file.c is %d\n",ftell(fp1));
fclose(fp1);
fclose(fp2);
}


如果文件file.c的最后一行是空行,打开file.txt,结果是:

0 19 #include<stdio.h>
19 27 main()
27 30 {
30 50 char buf[100];
50 71 FILE *fp1,*fp2;
71 83 int n;
83 95 int m;
95 97
97 127 fp1=fopen("file.c","r");
127 159 fp2=fopen("file.txt","w");
159 165
165 188 while(!feof(fp1))
188 195 {
195 215 n=ftell(fp1);
215 244 fgets(buf,100,fp1);
244 267 m=ftell(fp1);
267 310 fprintf(fp2,"%d %d\t%s",n,m,buf);
310 317 }
317 372 fprintf(fp2,"size of file.c is %d\n",ftell(fp1));
372 390 fclose(fp1);
390 408 fclose(fp2);
408 411 }
411 413
413 413
size of file.c is 413

如果文件file.c的最后一行不是空行,打开file.txt,结果是:

0 19 #include<stdio.h>
19 27 main()
27 30 {
30 50 char buf[100];
50 71 FILE *fp1,*fp2;
71 83 int n;
83 95 int m;
95 97
97 127 fp1=fopen("file.c","r");
127 159 fp2=fopen("file.txt","w");
159 165
165 188 while(!feof(fp1))
188 195 {
195 215 n=ftell(fp1);
215 244 fgets(buf,100,fp1);
244 267 m=ftell(fp1);
267 310 fprintf(fp2,"%d %d\t%s",n,m,buf);
310 317 }
317 372 fprintf(fp2,"size of file.c is %d\n",ftell(fp1));
372 390 fclose(fp1);
390 408 fclose(fp2);
408 409 }size of file.c is 409


=========================
继续测试,1.txt的内容为hello world

#include<stdio.h>
main()
{
char ch;
FILE *fp1,*fp2;

fp1=fopen("1.txt","r");
fp2=fopen("2.txt","w");

while(!feof(fp1))
{
ch=fgetc(fp1);
putchar(ch);
fputc(ch,fp2);
}
fprintf(fp2,"\n%d == %d\n",ch,EOF);//让我们看看结束符到底是什么
printf("\n%d\n",ftell(fp1));

fseek(fp1,0,SEEK_END);
printf("%d\n",ftell(fp1));

putchar(fgetc(fp1));
printf("\n%d\n",ftell(fp1));

putchar(fgetc(fp1));
printf("\n%d\n",ftell(fp1));

fprintf(fp2,"%d---%c---%x\n",fgetc(fp1),fgetc(fp1),fgetc(fp1));
fseek(fp1,1,SEEK_END);
printf("\n%d\n",ftell(fp1));
fprintf(fp2,"%d---%c---%x\n",fgetc(fp1),fgetc(fp1),fgetc(fp1));
fseek(fp1,2,SEEK_END);
printf("\n%d\n",ftell(fp1));
fprintf(fp2,"%d---%c---%x\n",fgetc(fp1),fgetc(fp1),fgetc(fp1));
fseek(fp1,3,SEEK_END);
printf("\n%d\n",ftell(fp1));
fprintf(fp2,"%d---%c---%x\n",fgetc(fp1),fgetc(fp1),fgetc(fp1));

fclose(fp1);
fclose(fp2);
}

运行结束后,打开文件2.txt,自己查看结果,里边有个字符csdn里无法显示。
初步分析,读文件时如果遇到文件结尾,文件指针就不再移动,但fseek()可以起作用。
帅得不敢出门 2008-06-14
  • 打赏
  • 举报
回复
我一般用infile.eof()判断
K行天下 2008-06-14
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 baihacker 的回复:]
引用 20 楼 k2eats 的回复:
摘自 Wikipedia

In computing, end-of-file, commonly abbreviated EOF, is a condition in a computer operating system where no more data can be read from a data source. The data source is usually called a file or stream.

In the C Standard Library, file access and other I/O functions may return a value equal to the symbolic value (macro) EOF to indicate that an end-…
[/Quote]

是我错了, EOF这里只是一种状态,一种标记

In certain cases when dealing with text files(处理文本文件) or reading data from a "character device", the Microsoft MS-DOS shell (COMMAND.COM) or operating-system utility programs would historically append an ASCII control-Z character to the end of a disk file
//添加CTRL+Z to the end of file
这句话只是特例罢了, 请问飞雪这里添加control-Z到文件结尾的情况存在吗?能不能说明某些特殊情况文件尾确实存在EOF呢?
linlan999 2008-06-14
  • 打赏
  • 举报
回复
学习~~~
birchlin 2008-06-14
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 baihacker 的回复:]
引用 20 楼 k2eats 的回复:
摘自 Wikipedia

In computing, end-of-file, commonly abbreviated EOF, is a condition in a computer operating system where no more data can be read from a data source. The data source is usually called a file or stream.

[/Quote]

从二进制的角度说,文件应该没有EOF,但是,如果没有,系统怎么确定读到末尾了呢?
如果两个文件1.txt和2.TXT 连在一起存放

1.TXT中有123 , 2.TXT中有456
那么读1.TXT的时候,为什么不出来123456呢?

是先确定读不出来,设置个EOF,还是先遇到EOF,在读不出来呢
从上面的文章看,好象EOF是系统读不出数据的时候加的.

jieao111 2008-06-14
  • 打赏
  • 举报
回复

以前的处理方法

while(true)
{
Train t1;
input>>t1;
if(input.fail())
break;
v1.push_back(t1);
cout<<t1<<endl;
}
input.close();
zbing0203 2008-06-13
  • 打赏
  • 举报
回复
飞雪说的对
xlzxlich 2008-06-13
  • 打赏
  • 举报
回复
eof(file)
baihacker 2008-06-13
  • 打赏
  • 举报
回复
while (!infile.eof())
lidongri 2008-06-13
  • 打赏
  • 举报
回复
while(infile>>stu[i].num>>stu[i].name>>stu[i].English>>stu[i].math>>stu[i].sunnary;)
---
怎么看怎么不对
fallening 2008-06-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 baihacker 的回复:]
while (!infile.eof())
[/Quote]
我发现这样做的时候,偶尔会有文件没有读完就退出的情形,不知道怎么回事情
hongyzniu 2008-06-13
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
FILE *fp;
char ch;
fp=fopen("red_star.txt","r");
ch=fgetc(fp); //获取文件最后的空字符(文件结束符)
while(ch!=EOF)
{
putch(ch);
}
   return 0;
}
hongyzniu 2008-06-13
  • 打赏
  • 举报
回复
[code=C/C++]#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
fengyizi 2008-06-13
  • 打赏
  • 举报
回复
while(ch!=null)
{
..............
}
eatsweetpotato 2008-06-13
  • 打赏
  • 举报
回复
mark
加载更多回复(17)

64,687

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧