将文件读入容器
在下面的示例中,我们使用 std::string
和 operator>>
来读取文件中的项目。
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>{});