簡體   English   中英

字符串向量不能與換行符和迭代器一起使用? (C ++)

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

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