C++ 将文件读入容器

示例

在下面的示例中,我们使用std::string和operator>>从文件中读取项目。

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

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

    std::string s;
    while(file >> s) // 继续阅读直到我们用完为止
    {
        v.push_back(s);
    }

在上面的示例中,我们只是简单地遍历文件,一次使用读取一个“项目” operator>>。使用,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 >>
//因此,在这里我们建立一个简单的帮助器类来完成它。那将转换
// 在字符串上下文中使用时返回到字符串。
struct Line
{
    // 在此处存储数据
    std::string data;
    // 将对象转换为字符串
    operator std::string const&() const {return data;}
    // 从流中读取一行。
    friend std::istream& operator>>(std::istream& stream, Line& line)
    {
        return std::getline(stream, line.data);
    }
};


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

    // 将文件的行读入容器。
    std::vector<std::string>  v(std::istream_iterator<Line>{file},
                                std::istream_iterator<Line>{});