2012-01-28 107 views
1

我試圖一次讀取一行文本文件並將每行打印到終端窗口。我正在使用g ++編譯mac,例如g ++ cpp3.cpp -o cpp3。getline和使用cout打印

文本文件看起來像這樣:

20100000001 20100000001.xml 
20100000002 20100000002.xml 
20100000003 20100000003.xml 
20100000004 20100000004.xml 

這裏是我的代碼:

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int main() 
{ 
    ifstream ifs("file.txt"); 
    string line; 
    while(getline(ifs,line)) { 
     getline(ifs,line); 
     cout << "[ " << line << " ]" << endl; 
    } 
return 0; 
} 

我想輸出的樣子:

[20100000001 20100000001.xml] 
[20100000002 20100000002.xml] 
[20100000003 20100000003.xml] 
[20100000004 20100000004.xml] 

然而,一切打印到終端中的單行。換句話說,文本文件中的每一行都寫在最後一行。此外,括號「[」和「]」似乎只寫入一次,因此它基本上打印「[」,然後是文件的全部內容,然後是「]」。

原來這就是最終輸出到終端的樣子:

user$ ./cpp3 
]10000000401 20100000004.xml 

user$ 

任何人都可以解釋爲什麼這種情況正在發生和/或如何解決這一問題?

+1

注意:您」在每次迭代中重複調用getline兩次。你可以通過hexdump運行程序的輸出嗎? (我猜你的源文本文件中有奇怪的結尾字符。) – Mat 2012-01-28 17:06:11

回答

3

查看數據文件 - 也許用od -c

所有寫在其他行上的聲音聽起來好像是在輸出中打印\r(回車)而不是\n(換行符),可能是因爲數據不包含換行符。 也許該文件來自Windows環境,並且getline()正在剝離換行符,並在結束時返回回車,並且輸出不會恢復換行符?

或者,也許該文件只包含\r行尾 - 在這種情況下,getline()會將整個文件讀取爲單行,並將其輸出爲單行。您可以通過向輸出添加一個計數器來演示,爲每個輸出行增加一個計數器。你對'方括號打印一次'的觀察表明,這可能比受挫的建議更好。輸出中有一個endl,這很重要。

+0

這樣做了。 (最後一行都是\ r ...我將它們改爲\ n並且它工作正常。)謝謝! – ishmael 2012-01-28 17:16:45

0

您需要刪除getline(ifs, line);這樣的:

while(getline(ifs,line)) { 
    cout << "[" << line << "]" << endl; 
} 

此外,您還需要去掉方括號之間的空間,否則輸出看起來就像這樣:

[ 20100000001 20100000001.xml ] 
[ 20100000002 20100000002.xml ] 
[ 20100000003 20100000003.xml ] 
[ 20100000004 20100000004.xml ] 
+0

謝謝。我不是故意要有兩個getline。 – ishmael 2012-01-28 17:19:57