免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 21373 | 回复: 15
打印 上一主题 下一主题

[C++] 请教:c++中读文件,如何判断文件结尾 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-08 16:38 |只看该作者 |倒序浏览
我想使用c++中ifstream进行读文件,但是发现无法给出正确的文件结尾,请问如何去做?
下面是我的一段代码:


  1. void F()
  2. {
  3.                ifstream in(FILE_NAME_IN);

  4.         if (!in)
  5.         {
  6.                 cerr << FILE_NAME_IN << "can't be openned!" << endl;
  7.                 return;
  8.         }

  9.         char p[20];

  10.         UnicodeList uList;

  11.         bool isCN = false;
  12.        
  13.         while (in.getline(p, sizeof(p))) //此处没有到文件结尾就退出了,怎么才能让他到文件结尾呢
  14.         {
  15.                        //do something to p
  16.                        memset(p, 0, sizeof(p));
  17.                 }
  18. }
复制代码


问题:怎么才能判断到文件结尾呢?d

另外修改了一下,还是有问题:


  1. void F()
  2. {
  3.                ifstream in(FILE_NAME_IN);

  4.         if (!in)
  5.         {
  6.                 cerr << FILE_NAME_IN << "can't be openned!" << endl;
  7.                 return;
  8.         }

  9.         char p[20];

  10.         UnicodeList uList;

  11.         bool isCN = false;
  12.        
  13.         while (!in.eof())//此处没有到文件结尾就退出了,依然如故
  14.         {
  15.                        in.getline(p, sizeof(p));
  16.                        //do something to p
  17.                        memset(p, 0, sizeof(p));
  18.                 }
  19. }
复制代码


下面的按字符读也是有时候读不到文件结尾:

  1. void F()
  2. {
  3.                ifstream in(FILE_NAME_IN);

  4.         if (!in)
  5.         {
  6.                 cerr << FILE_NAME_IN << "can't be openned!" << endl;
  7.                 return;
  8.         }

  9.         char p[20];

  10.         UnicodeList uList;

  11.         bool isCN = false;
  12.         char c;
  13.         while (!in.eof())//此处没有到文件结尾就退出了,依然如故
  14.         {
  15.                        in.get(c); //
  16.                        //do something to p
  17.                        memset(p, 0, sizeof(p));
  18.                 }
  19. }
复制代码


看到的一些资料说,由于eof的判断也是一个字符,这个字符完全可能出现在文件中间,所以导致判断有问题,但不知如何才能判断到文件的结尾呢?

论坛徽章:
0
2 [报告]
发表于 2007-02-08 18:24 |只看该作者
EOF

论坛徽章:
0
3 [报告]
发表于 2007-02-09 10:43 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2007-02-09 11:48 |只看该作者
上面给的解决方案都是基于c语言的,没有和fstream联系在一起.
没有人知道fstream的判断结尾方法吗???

论坛徽章:
0
5 [报告]
发表于 2007-02-09 11:55 |只看该作者
char buf[BUFSIZE];
do {
   in.read( buf, BUFSIZE );
   std::streamsize n = in.gcount();
   out.write( buf, n );
} while( in.good() );
if( in.bad() || !in.eof() ) {
   // fatal error occurred
}
in.close();


http://cppreference.com/cppio/eof.html

论坛徽章:
0
6 [报告]
发表于 2007-02-09 13:59 |只看该作者
ls:
通过使用你给的那段代码,我发现,是可以正常的读取到文件结尾的,那么看来eof这个函数是没有问题.
我把in.read修改为in.getline结果程序没有读到文件结尾就跳出了,所以我觉得是in.getline()在使用时候的问题.经过排查,我发现当遇到文件中的一个字符的时候,in的流状态变为fail(),于是导致了没有读到最后.
有谁能解释一下什么时候会在读文件的时候出现流状态是fail(),这种情况很常见!

  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4. #define BUFSIZE 20

  5. int main()
  6. {
  7.         ifstream in("e:\\a.txt");
  8.         cout << in.gcount() << endl;
  9.         char buf[BUFSIZE];
  10.         int i = 0;
  11.         do {
  12.                         //in.read(buf, BUFSIZE );
  13.                         in.getline(buf, 20); //改动的地方
  14.                         std::streamsize n = in.gcount();
  15.                         cout.write( buf, n );
  16.                 } while( in.good() );//

  17.          if( in.bad() || !in.eof() )
  18.          {
  19.                  cerr << "error" << endl;
  20.          }
  21.          in.close();  
  22. }
复制代码

论坛徽章:
0
7 [报告]
发表于 2007-02-09 14:09 |只看该作者
又经过测试,把getline()函数换成了in.get()程序遇到那个字符,也是可以正常过去,执行到结尾.
那么从上面的分析,可以看出是getline()这个函数导致流状态的问题,他为什么会导致流状态出问题呢???
请牛人帮助解释一下流的问题?
(好像对C++了解的人很少呀,难道要去别的论坛问这些问题,晕!)

论坛徽章:
0
8 [报告]
发表于 2007-02-09 14:19 |只看该作者
通过查看MSDN,
关于getline的解释:
If the function extracts no elements, it calls setstate(failbit). In any case, it returns *this.

说明getline什么也没有获取到,所有把流的状态设置为failbit,所以出了问题.
问题在于什么情况下他才这样设置呢?

论坛徽章:
0
9 [报告]
发表于 2007-02-09 14:21 |只看该作者
另外,怎么通过C++的函数获取文件的大小?

论坛徽章:
0
10 [报告]
发表于 2007-02-09 14:40 |只看该作者
stat
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP