在下面的示例中,我们使用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>{});