字符串向量与换行符和迭代器无法正常工作? (C ++)

时间:2010-03-08 04:42:44

标签: c++ string iterator vector

我有一个由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

我不确定为什么只有换行符的字符串没有打印出来。任何帮助,将不胜感激。感谢。

3 个答案:

答案 0 :(得分:4)

是不是?实际上,它是!你在Line 1之后有一个换行符的原因正是那个带有换行符的空字符串而没有别的。如果不是第二行,您会看到Line 1Line 3作为输出。 (你自己说过:getline丢弃换行符。)

显然,我理解你的意图的方式,你应该按如下方式实现你的输出周期

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

这样,您可以在输出期间在每个字符串后添加换行符。但如果是这样,那么在阅读过程中您不需要手动添加\n字符来清空字符串。

换句话说,决定你想做什么。目前尚不清楚。

  • 如果要还原丢弃的 阅读时的换行符, 你必须为所有行做, 不仅仅是空的。

  • 如果要添加换行符 输出中的字符,你没有 需要明确地将他们推入 完全读取行。

事实上,将字符串推送到字符串中是一个相当奇怪的想法。做什么的?由于您已经逐行阅读和存储了文本,因此换行符可以是隐含的。即你可以像我上面那样进行打印(使用endl),一切都会按预期进行。

答案 1 :(得分:2)

我认为这里的简单答案是,无论字符串中是否有内容,getline()都会删除尾随换行符。所以你做的三个读取如下:

"Line 1"
""
"Line 3"

你转变为:

"Line 1"
"\n"
"Line 3"
打印时的

是:

Line 1
Line 3

答案 2 :(得分: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"));

您正在增加使代码无法运行的复杂性。