CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
英特尔®游戏设计大赛100美元现金周周送 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  工具平台和程序库

在getline中重复使用ifstream的问题

楼主hhmmdd(懵懂)2003-06-03 13:41:37 在 C/C++ / 工具平台和程序库 提问

void   myread(ifstream   *in)  
  {  
          in->seekg(0);  
          in->clear();  
   
          string   s;  
          while(getline(*in,s,'\n'))  
          {  
                    ...  
          }  
  }  
  当ifstream打开文件后,第一次调用myread时,可以正常读出文件内容,但以后再调用myread就什么也读不出了。不知道问题出在哪里? 问题点数:100、回复次数:19Top

1 楼atma(当时明月在)回复于 2003-06-03 14:27:45 得分 5

不太清楚你的问题。帮你up一下吧。  
   
  PS:   你打开文件的时候,有没有注意要指定文件模式,比如ios::binary   ?Top

2 楼hhmmdd(懵懂)回复于 2003-06-03 14:51:56 得分 0

就是文本文件,第一轮从头读到尾都很正常,然后用  
  in->seekg(0);  
  in->clear();  
  把文件指针定位到开始再getline,   getline返回false  
  Top

3 楼fangrk(加把油,伙计!)回复于 2003-06-03 15:00:18 得分 20

void   myread(ifstream   *in)  
  {  
          in->seekg(0);  
          string   s;  
          while(getline(*in,s,'\n'))  
          {  
                    ...  
          }  
          in->clear();  
  }  
  Top

4 楼chinajiji(菜鸟叽叽)回复于 2003-06-03 15:06:35 得分 20

in->seekg(0);  
  in->clear();  
  改成:  
  in->clear();  
  in->seekg(0);//seekg()只有当in->false()为false的时候有效  
  Top

5 楼chinajiji(菜鸟叽叽)回复于 2003-06-03 15:10:09 得分 0

hhmmdd   (懵懂)      
  你的写法in->clear()相当于同有起作用.  
  因为getline()结束后in->false()   ==   true;下一次进入函数体时,in->seek(0)就不起作用了.Top

6 楼fangrk(加把油,伙计!)回复于 2003-06-03 15:13:52 得分 0

这个也行,clear要在seekg前面  
   
  #include   <iostream>  
  #include   <string>  
  #include   <fstream>  
  using   namespace   std;  
  void   myread(ifstream   *in)  
  {        
          in->clear();  
          in->seekg(0);  
          string   s;  
          while(getline(*in,s,'\n'))  
          {  
                    cout<<s<<endl;  
          }  
           
  }  
  int   main()  
  {  
        ifstream   input("abc.txt");  
        cout<<"First"<<endl;  
        myread(&input);  
        cout<<"Second"<<endl;  
        myread(&input);  
  }  
   
  我个人觉得函数的参数不是很好,我做的话会传入文件名void   MyRead(const   char*   FileName);  
   
  你程序错误的原因是:  
  while(...){...}以后,in就设置了eofbit,必须先clear才能正确seekg  
  Top

7 楼hhmmdd(懵懂)回复于 2003-06-03 15:14:05 得分 0

用楼上两位的方法都可以解决了,多谢  
  chinajiji(菜鸟叽叽)   、   fangrk(加把油,伙计!)   两位能再详细解释一下机理吗?  
  “seekg()只有当in->false()为false的时候有效“看不太懂  
   
   
  Top

8 楼hhmmdd(懵懂)回复于 2003-06-03 15:21:35 得分 0

ifstream里有多少标志位?eofbit   failbit   badbit   goodbit都干什么的  
  ifstream   in;  
  if(in)实际判断的是哪个位?Top

9 楼fangrk(加把油,伙计!)回复于 2003-06-03 15:32:11 得分 20

eofbit是结束标志  
  failbit是失败标志,比如要求输入整数却输入了字符,遇到这种情况可以认为流状态还行,可以通过clear来消除  
  badbit是致命错误,不可挽回  
  goodbit就是状态良好  
   
  具体的去看C++标准程序库吧!我只是粗略的回忆写一下Top

10 楼chinajiji(菜鸟叽叽)回复于 2003-06-03 15:33:04 得分 0

failbit,当输入格式错,比如,输入字符到int变量里时,置1.  
   
  badbit,比如磁盘读写等物理错误时,置1.  
  其它两个不用说了吧.Top

11 楼chinajiji(菜鸟叽叽)回复于 2003-06-03 15:36:01 得分 0

函数参数中对文件对象,传引用比传指针好.Top

12 楼hhmmdd(懵懂)回复于 2003-06-03 15:42:40 得分 0

最后一个问题  
   
  ifstream   in;  
  if(in)实际判断的是哪个位?  
   
  完了就结帖Top

13 楼hhmmdd(懵懂)回复于 2003-06-03 15:44:36 得分 0

实际myread是线程函数,所以用指针Top

14 楼fangrk(加把油,伙计!)回复于 2003-06-03 15:50:43 得分 0

if(in)可能调用operator   void*(),至于判断什么bit要回去翻书才知道,估计是failbit  
   
  if(in)有时候可以写成if(!in.fail())Top

15 楼chinajiji(菜鸟叽叽)回复于 2003-06-03 15:51:33 得分 20

当in.good   ==   true   时,  
  if(in)等价于:  
  if(in.operator   *(   ))   此时,in.operator   *(   )返回值当然不会为0,所以又等价于:  
  if(true);  
   
  当in.good   !=   true   时,  
  if(in)等价于:  
  if(in.operator   *(   ))   此时,in.operator   *(   )返回值当然为0,所以又等价于:  
  if(false);  
   
  之所以用in.operator   *(   ),而没有定义basic_ios::operator   bool   (   )   const;  
  是为了防止隐式类型转换带来意想不到的错误.  
  Top

16 楼chinajiji(菜鸟叽叽)回复于 2003-06-03 15:57:29 得分 0

in.operator   *(   )  
  应该是:  
  in.operator   void*(   );  
   
  Top

17 楼fangrk(加把油,伙计!)回复于 2003-06-03 16:01:50 得分 5

#include   <iostream>  
   
  #include   <fstream>  
  using   namespace   std;  
   
  int   main()  
  {  
        ifstream   input("abc.txt");  
        cout<<"Open   file   "<<(input.operator   void*()   ?   "successfully":"failed");  
  }  
   
  DEV-C++   和   Borland   C++   Builder6通过,应该是通过operator   void*()   得到状态的Top

18 楼chinajiji(菜鸟叽叽)回复于 2003-06-03 16:11:19 得分 10

if(in)又等价于:  
  if(in.good())  
  if(!in.fail()   &&   !in.bad())  
   
  in.fail()   ==   rdstate   &   failbit   ;Top

19 楼hhmmdd(懵懂)回复于 2003-06-03 16:16:01 得分 0

我觉得应该是重载bool操作符,不知对也不对  
   
  给分Top

相关问题

  • 重复使用BitBlt的问题?
  • ---------ifstream------------
  • 用ifstream::getline()碰到的很奇怪的现象
  • 使用fopen怎么象ifstream一样逐行读取文件?
  • 如何直接使用ifstream读入的数据?
  • 使用ifstream从文件中读不到空白数据?
  • 请问高手如何避免getline()和cin使用的冲突?
  • 如何重复使用DataSet中的数据
  • 为什么使用了DISTINCT后,还有重复项??
  • “区域”为何不能重复使用呢???

关键词

  • 文件
  • ifstream
  • seekg
  • getline
  • 等价
  • badbit
  • myread
  • failbit
  • clear
  • 调用

得分解答快速导航

  • 帖主:hhmmdd
  • atma
  • fangrk
  • chinajiji
  • fangrk
  • chinajiji
  • fangrk
  • chinajiji

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo