通过文件迭代失败
我想遍历文件并打印所有字符串。例如,文件包含:通过文件迭代失败
a
1
2
10
a1
1
b
将输出:
a
a1
b
我写我的代码是这样的:
int main(){
ifstream stream;
stream.open("example.txt");
string temp;
while (getline(stream, temp)){
cout<<temp<<endl;
int n;
while(stream>>n){}
}
}
这个节目的在线打印 “a” 和 “A1”。和建议?
这是怎么回事?
我是编程新手。我不认为我被允许使用类似的东西。到目前为止,我只知道getline用于读取字符串,并且流>> n用于读取int – 2013-03-14 22:39:53
@JessicaHerlian如果使用cppreference.com完成该工作,那么您将比教授更了解更多教你! – 2013-03-14 22:41:12
@JessicaHerlian很高兴解释任何你无法理解的东西。 – 2013-03-14 22:44:22
如果字符串不是空的,并以字母开头,对不对?
if (temp.size() > 0 && isalpha(temp[0]))
{
cout << temp;
}
会发生什么情况是这样的:一旦你的程序打这条线,
while(stream>>n){}
它试图从文件读取下面标记为int
egers。 1
成功。 2
成功。 10
成功。 a1
失败。
stream
现在处于失败状态(stream.fail() == true
)。你的代码执行下面的语句是
while (getline(stream, temp)){
这将读取下一个令牌(a1
),但由于stream
处于失效状态下,getline
结果将被解释为false
,并且循环将被中断。
这就是为什么你的程序过早结束。但是,它甚至不应该打印a1
。事实上,它只在我的机器上打印a
。
您需要清除循环内部的整数标记之后的失败状态。添加以下语句结尾:
stream.clear();
这将复位故障状态(stream.fail() == false
)和外循环将继续运行。
+1解释为什么OP的解决方案不起作用。 – 2013-03-14 23:01:35
你不会在'while(stream >> n){}'之后清除失败状态。 – ildjarn 2013-03-14 22:24:19
@ildjarn我用它遍历所有整数 – 2013-03-14 22:34:50
*非常*很好地问问题。 – 2013-03-14 22:50:49