[英]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.