2013-03-14 152 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