2013-03-14 111 views
3

我想遍历文件并打印所有字符串。例如,文件包含:通过文件迭代失败

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”。和建议?

+2

你不会在'while(stream >> n){}'之后清除失败状态。 – ildjarn 2013-03-14 22:24:19

+0

@ildjarn我用它遍历所有整数 – 2013-03-14 22:34:50

+1

*非常*很好地问问题。 – 2013-03-14 22:50:49

回答

1

这是怎么回事?

​​
+0

我是编程新手。我不认为我被允许使用类似的东西。到目前为止,我只知道getline用于读取字符串,并且流>> n用于读取int – 2013-03-14 22:39:53

+0

@JessicaHerlian如果使用cppreference.com完成该工作,那么您将比教授更了解更多教你! – 2013-03-14 22:41:12

+0

@JessicaHerlian很高兴解释任何你无法理解的东西。 – 2013-03-14 22:44:22

0

如果字符串不是空的,并以字母开头,对不对?

if (temp.size() > 0 && isalpha(temp[0])) 
{ 
    cout << temp; 
} 
3

会发生什么情况是这样的:一旦你的程序打这条线,

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

+1解释为什么OP的解决方案不起作用。 – 2013-03-14 23:01:35