2010-03-08 43 views
0

我具有由3行的文本文件:字符串向量與新行和迭代器無法按預期工作? (C++)

Line 1 

Line 3 

(第1行,一個空行,第3行)

vector<string> text; 
vector<string>::iterator it; 
ifstream file("test.txt"); 
string str; 

while (getline(file, str)) 
{ 
    if (str.length() == 0) 
    str = "\n"; 
    // since getline discards the newline character, replacing blank strings with newline 

    text.push_back(str); 
} // while 

for (it=text.begin(); it < text.end(); it++) 
    cout << (*it); 

打印出:

Line 1 
Line 3 

我不確定爲什麼只有換行符的字符串沒有打印出來。任何幫助,將不勝感激。謝謝。

+0

安德烈是正確的,我只是有一個不同的錯誤在我的代碼中,似乎迭代器不能用換行工作 – kevin 2010-03-08 05:43:21

回答

4

不是嗎?其實,這是!在Line 1之後有一個換行符的原因恰恰就是那個帶有換行符的空字符串,而沒有其他字符。如果不是第二行,你會看到Line 1Line 3作爲輸出。 (你自己說的:getline丟棄換行符)

很顯然,我理解你的意圖的方式,你應該實現你的輸出循環如下

for (it = text.begin(); it < text.end(); it++) 
    cout << *it << endl; 

這樣,你以後每次添加一個換行符輸出中的字符串。但如果是這樣,那麼在閱讀過程中,您不需要手動添加\n字符來清空字符串。

換句話說,決定你想要做什麼。目前尚不清楚。

  • 如果你想讀期間恢復丟棄 換行符, 你必須這樣做對所有, 不只是空的。

  • 如果你想在輸出時添加換行字符 ,你不 需要顯式地他們推入讀 線在所有。

事實上,將換行符字面推送到字符串中是一個相當奇怪的想法。做什麼的?由於您已經逐行讀取和存儲您的文本,所以換行符可以是暗示。即您可以按照上面的方法進行打印(使用endl),並且所有內容都與預期相符。

+0

我誤解了我後來寫的東西。這段代碼雖然是一個側面片段,但我會嘗試寫下我想要做的事情。 – kevin 2010-03-08 04:55:06

1

我會使用這樣的:

std::vector<std::string> text; 
std::string str; 

while (std::getline(infile, str)) 
    text.push_back(str); 

std::copy(text.begin(), text.end(), 
    std::ostream_iterator<std::string>(std::cout, "\n")); 

您要添加的複雜性,從工作停止你的代碼。

2

我認爲這裏的簡單答案是getline()去除了字符串中是否有內容的尾隨換行符。所以三讀你如下:

"Line 1" 
"" 
"Line 3" 

你變成:

"Line 1" 
"\n" 
"Line 3" 

其打印時是:

Line 1 
Line 3