我想从istream
中读取一行文本并将其拆分为单词。我当前的代码是
vector<string>((istream_iterator<string>(f)),
istream_iterator<string>());
其中f是ifstream
对象。但是,这将读取到文件的末尾,并且我想在到达换行符时停止读取它。有没有办法做类似istream_iterator<string>("\n")
的事情,以便向量构造函数在到达换行符时将停止回退?
答案 0 :(得分:1)
使用std::getline()
阅读一行,然后使用std::istringstream
阅读该行中的单词,例如:
std::string line;
std::getline(f, line);
std::istringstream iss(line);
std::vector<std::string> words(
std::istream_iterator<std::string>(iss),
std::istream_iterator<std::string>()
);
答案 1 :(得分:0)
使用std::getline
读取每一行并将其推送到结果容器中
std::vector<std::string> lines;
for (std::string line; std::getline(f, line); lines.push_back(line));
编辑:人头马(Remy Lebeau)已经回答了OP的问题,我想澄清一下我的代码:
通常,要读取文件中的行,我们会写类似
while (f.good())
{
std::string line;
std::getline(f, line);
lines.push_back(line);
}
由于std::istream
可以是converted to boolean,因此我们可以将其重写为:
while (f)
{
std::string line;
std::getline(f, line);
lines.push_back(line);
}
由于std::getline
返回了input stream itself,因此我们可以将其用作循环条件:
std::string line;
while (std::getline(f, line))
{
lines.push_back(line);
} // `line` still can be used after this line, outside its scope
但是我们必须将临时变量line
超出其范围。为避免这样做,我们使用for
而不是while
循环,并在line
循环内声明for
:
for (std::string line; std::getline(f, line); )
{
lines.push_back(line);
}
最后,由于循环的主体仅包含1行,因此我们也可以将其放入for
循环中:
for (std::string line; std::getline(f, line); lines.push_back(line));