[英]C++: How to iterate over a text in a std::string line by line with STL?
我在std :: string对象中有一个文本。 该文由几行组成。 我想使用STL(或Boost)逐行迭代文本。 我提出的所有解决方案似乎都不是很优雅。 我最好的方法是在换行符处拆分文本。 有更优雅的解决方案吗?
更新:这就是我要找的:
std::string input;
// get input ...
std::istringstream stream(input);
std::string line;
while (std::getline(stream, line)) {
std::cout << line << std::endl;
}
我以为我已经尝试过了。 我收到了一个编译错误并把它丢了。 快点!
为什么要将文本保留在源文件中? 将其保存在单独的文本文件中。 用std :: ifstream打开它并用while(getline(...))
迭代它while(getline(...))
#include <iostream>
#include <fstream>
int main()
{
std::ifstream fin("MyText.txt");
std::string file_line;
while(std::getline(fin, file_line))
{
//current line of text is in file_line, not including the \n
}
}
或者,如果文本HAS要在std::string
变量中以类似的方式使用std::istringstream
读取
如果您的问题是如何在不使用+的情况下将文本放入代码中,请注意在编译之前连接相邻的字符串文字,因此您可以这样做:
std::string text =
"Line 1 contents\n"
"Line 2 contents\n"
"Line 3 contents\n";
使用Boost.Tokenizer :
std::string text("foo\n\nbar\nbaz");
typedef boost::tokenizer<boost::char_separator<char> > line_tokenizer;
line_tokenizer tok(text, boost::char_separator<char>("\n\r"));
for (line_tokenizer::const_iterator i = tok.begin(), end = tok.end();
i != end ; ++i)
std::cout << *i << std::endl;
版画
foo
bar
baz
请注意,它会跳过空行,这可能是您想要的,也可能不是。
如果你想line by line
循环,正如你所说,为什么在换行符时拆分文本不是你想要的?
你没有发布代码显示你是如何做到的,但你的方法似乎是正确的,以实现你所说的你想要的。 为什么感觉自卑?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.