将文件读入容器

在下面的示例中,我们使用 std::stringoperator>> 来读取文件中的项目。

    std::ifstream file("file3.txt");

    std::vector<std::string>  v;

    std::string s;
    while(file >> s) // keep reading until we run out
    {
        v.push_back(s);
    }

在上面的例子中,我们只是使用 operator>> 一次迭代读取一个项目的文件。使用 std::istream_iterator 可以实现同样的效果,std::istream_iterator 是一个输入迭代器,它一次从流中读取一个项目。大多数容器也可以使用两个迭代器构造,因此我们可以将上面的代码简化为:

    std::ifstream file("file3.txt");

    std::vector<std::string>  v(std::istream_iterator<std::string>{file},
                                std::istream_iterator<std::string>{});

我们可以通过简单地指定我们想要读取的对象作为 std::istream_iterator 的模板参数来扩展它以读取我们喜欢的任何对象类型。因此,我们可以简单地扩展上面的内容来读取这样的行(而不是单词):

// Unfortunately there is  no built in type that reads line using >>
// So here we build a simple helper class to do it. That will convert
// back to a string when used in string context.
struct Line
{
    // Store data here
    std::string data;
    // Convert object to string
    operator std::string const&() const {return data;}
    // Read a line from a stream.
    friend std::istream& operator>>(std::istream& stream, Line& line)
    {
        return std::getline(stream, line.data);
    }
};

    std::ifstream file("file3.txt");

    // Read the lines of a file into a container.
    std::vector<std::string>  v(std::istream_iterator<Line>{file},
                                std::istream_iterator<Line>{});