將檔案讀入容器

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