在getline中重复使用ifstream的问题

hhmmdd 2003-06-03 01:41:37
void myread(ifstream *in)
{
in->seekg(0);
in->clear();

string s;
while(getline(*in,s,'\n'))
{
...
}
}
当ifstream打开文件后,第一次调用myread时,可以正常读出文件内容,但以后再调用myread就什么也读不出了。不知道问题出在哪里?
...全文
176 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
hhmmdd 2003-06-03
  • 打赏
  • 举报
回复
我觉得应该是重载bool操作符,不知对也不对

给分
chinajiji 2003-06-03
  • 打赏
  • 举报
回复
if(in)又等价于:
if(in.good())
if(!in.fail() && !in.bad())

in.fail() == rdstate & failbit ;
fangrk 2003-06-03
  • 打赏
  • 举报
回复
#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*() 得到状态的
chinajiji 2003-06-03
  • 打赏
  • 举报
回复
in.operator *( )
应该是:
in.operator void*( );

chinajiji 2003-06-03
  • 打赏
  • 举报
回复
当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;
是为了防止隐式类型转换带来意想不到的错误.
fangrk 2003-06-03
  • 打赏
  • 举报
回复
if(in)可能调用operator void*(),至于判断什么bit要回去翻书才知道,估计是failbit

if(in)有时候可以写成if(!in.fail())
hhmmdd 2003-06-03
  • 打赏
  • 举报
回复
实际myread是线程函数,所以用指针
hhmmdd 2003-06-03
  • 打赏
  • 举报
回复
最后一个问题

ifstream in;
if(in)实际判断的是哪个位?

完了就结帖
chinajiji 2003-06-03
  • 打赏
  • 举报
回复
函数参数中对文件对象,传引用比传指针好.
chinajiji 2003-06-03
  • 打赏
  • 举报
回复
failbit,当输入格式错,比如,输入字符到int变量里时,置1.

badbit,比如磁盘读写等物理错误时,置1.
其它两个不用说了吧.
fangrk 2003-06-03
  • 打赏
  • 举报
回复
eofbit是结束标志
failbit是失败标志,比如要求输入整数却输入了字符,遇到这种情况可以认为流状态还行,可以通过clear来消除
badbit是致命错误,不可挽回
goodbit就是状态良好

具体的去看C++标准程序库吧!我只是粗略的回忆写一下
hhmmdd 2003-06-03
  • 打赏
  • 举报
回复
ifstream里有多少标志位?eofbit failbit badbit goodbit都干什么的
ifstream in;
if(in)实际判断的是哪个位?
hhmmdd 2003-06-03
  • 打赏
  • 举报
回复
用楼上两位的方法都可以解决了,多谢
chinajiji(菜鸟叽叽) 、 fangrk(加把油,伙计!) 两位能再详细解释一下机理吗?
“seekg()只有当in->false()为false的时候有效“看不太懂


fangrk 2003-06-03
  • 打赏
  • 举报
回复
这个也行,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
chinajiji 2003-06-03
  • 打赏
  • 举报
回复
hhmmdd (懵懂)
你的写法in->clear()相当于同有起作用.
因为getline()结束后in->false() == true;下一次进入函数体时,in->seek(0)就不起作用了.
chinajiji 2003-06-03
  • 打赏
  • 举报
回复
in->seekg(0);
in->clear();
改成:
in->clear();
in->seekg(0);//seekg()只有当in->false()为false的时候有效
fangrk 2003-06-03
  • 打赏
  • 举报
回复
void myread(ifstream *in)
{
in->seekg(0);
string s;
while(getline(*in,s,'\n'))
{
...
}
in->clear();
}
hhmmdd 2003-06-03
  • 打赏
  • 举报
回复
就是文本文件,第一轮从头读到尾都很正常,然后用
in->seekg(0);
in->clear();
把文件指针定位到开始再getline, getline返回false
atma 2003-06-03
  • 打赏
  • 举报
回复
不太清楚你的问题。帮你up一下吧。

PS: 你打开文件的时候,有没有注意要指定文件模式,比如ios::binary ?

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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