簡體   English   中英

getline和使用cout打印

[英]getline and printing with cout

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

文本文件如下所示:

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$

誰能解釋為什么會這樣和/或如何解決問題?

看一下數據文件-也許用od -c

每行寫起來的所有內容聽起來都像是在輸出中打印\\r (回車)而不是\\n (換行),也許是因為數據不包含換行符。 也許該文件來自Windows環境,而getline()正在剝離換行符,在末尾保留回車符,並且輸出未恢復換行符?

或者,也許文件僅包含\\r行結尾-在這種情況下, getline()會將整個文件讀取為一行,然后將其輸出為一行。 您可以通過向輸出添加一個計數器,為每條輸出線遞增計數器來演示這一點。 您對“方括號打印一次”的觀察表明,這可能比遭受打擊的建議要好。 您的輸出中有一個endl ,這一點很重要。

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

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

另外,您需要刪除方括號之間的空格,否則輸出將如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM