字符串向量与新行和迭代器无法按预期工作? (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
我不确定为什么只有换行符的字符串没有打印出来。任何帮助,将不胜感激。谢谢。
不是吗?其实,这是!在Line 1
之后有一个换行符的原因恰恰就是那个带有换行符的空字符串,而没有其他字符。如果不是第二行,你会看到Line 1Line 3
作为输出。 (你自己说的:getline
丢弃换行符)
很显然,我理解你的意图的方式,你应该实现你的输出循环如下
for (it = text.begin(); it < text.end(); it++)
cout << *it << endl;
这样,你以后每次添加一个换行符输出中的字符串。但如果是这样,那么在阅读过程中,您不需要手动添加\n
字符来清空字符串。
换句话说,决定你想要做什么。目前尚不清楚。
如果你想读期间恢复丢弃 换行符, 你必须这样做对所有行, 不只是空的。
如果你想在输出时添加换行字符 ,你不 需要显式地他们推入读 线在所有。
事实上,将换行符字面推送到字符串中是一个相当奇怪的想法。做什么的?由于您已经逐行读取和存储您的文本,所以换行符可以是暗示。即您可以按照上面的方法进行打印(使用endl
),并且所有内容都与预期相符。
我误解了我后来写的东西。这段代码虽然是一个侧面片段,但我会尝试写下我想要做的事情。 – 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
安德烈是正确的,我只是有一个不同的错误在我的代码中,似乎迭代器不能用换行工作 – kevin 2010-03-08 05:43:21