將檔案讀入容器
在下面的示例中,我們使用 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>{});