在getline中重复使用ifstream的问题
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



