[英]String vectors not working as expected with newline and iterators? (C++)
我有一個由3行組成的文本文件:
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
我不確定為什么只有換行符的字符串沒有打印出來。 任何幫助,將不勝感激。 謝謝。
不是嗎 其實是! 第Line 1
行之后有換行符的原因恰好是其中包含換行符的空字符串,僅此而已。 如果不是第二行,您將看到Line 1Line 3
作為輸出。 (您自己說過: getline
放棄換行符。)
顯然,據我了解您的意圖的方式,您應該按照以下方式實現輸出周期
for (it = text.begin(); it < text.end(); it++)
cout << *it << endl;
這樣,您可以在輸出期間在每個字符串之后添加換行符。 但是,如果是這樣,則在讀取過程中無需在空字符串中手動添加\\n
字符。
換句話說,決定要做什么。 目前尚不清楚。
如果要在讀取過程中恢復丟棄的換行符,則必須對所有行都執行此操作,而不僅僅是對空行。
如果要在輸出過程中添加換行符,則根本不需要將它們明確地推入讀取行中。
實際上,將換行符逐字地推入字符串中是一個很奇怪的想法。 做什么的? 由於您已經逐行閱讀和存儲了文本,因此可以隱含換行符。 也就是說,您可以像上面一樣(使用endl
)進行打印,並且一切都會按預期進行。
我認為這里的簡單答案是,無論字符串中是否包含內容,getline()都會刪除尾隨的換行符。 因此,您執行的三讀操作如下:
"Line 1"
""
"Line 3"
您將其轉換為:
"Line 1"
"\n"
"Line 3"
打印時為:
Line 1
Line 3
我會用這樣的東西:
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"));
您添加的復雜性使您的代碼無法正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.