字符串向量与新行和迭代器无法按预期工作? (C++)

问题描述:

我具有由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

不是吗?其实,这是!在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

我会使用这样的:

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")); 

您要添加的复杂性,从工作停止你的代码。

我认为这里的简单答案是getline()去除了字符串中是否有内容的尾随换行符。所以三读你如下:

"Line 1" 
"" 
"Line 3" 

你变成:

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

其打印时是:

Line 1 
Line 3