自定义istream结束迭代器

时间:2019-03-03 04:04:45

标签: c++ c++11

我想从istream中读取一行文本并将其拆分为单词。我当前的代码是

vector<string>((istream_iterator<string>(f)),
                                istream_iterator<string>());

其中f是ifstream对象。但是,这将读取到文件的末尾,并且我想在到达换行符时停止读取它。有没有办法做类似istream_iterator<string>("\n")的事情,以便向量构造函数在到达换行符时将停止回退?

2 个答案:

答案 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));