2016-11-26 59 views
3

我想將我的類類型的STL向量寫入和讀取到二進制文件,但不明白istream_iterator出了什麼問題。
項目規則不允許使用文本文件, 與Boost等第三方庫相同。使用istream_iterator構造自定義類型的向量

這是Book.h:

class Book{ 
    public: 
    Book(const std::vector<Book>& in_one_volumes,const std::string& title, 
    const std::string& author,const int pagecount,const int price,const std::string& date); 
    private: 
    std::vector<Book> inOneVolumes; 
    std::string title; 
    std::string author; 
    int pagecount; 
    int price; 
    std::string date; 
}; 

這是寫方法:

void writeBook(std::vector<Book> books) { 
    std::ofstream binOut("book.bin", std::ios::binary); 
    std::copy(books.begin(), books.end(), 
     std::ostream_iterator<Book>(binOut, "\n")); 
} 

,我想這樣寫的:

std::vector<Book> readBooks() { 
    std::vector<Book> toReturn; 
    std::ifstream BinIn("book.bin", std::ios::binary); 
    std::istream_iterator<Book> file_iter(BinIn); 
    std::istream_iterator<Book> end_of_stream; 
    std::copy(file_iter, end_of_stream, std::back_inserter(toReturn)); 
    return toReturn;  
} 

Compiller說 - 書:沒有適當的默認構造函數可用。

回答

3

std::istream_iterator<Book>使用operator>>(std::istream&, Book&)將數據讀入對象。由於此operator>>需要現有的Book對象作爲參數(將數據寫入),所以迭代器必須構造一個對象,然後才能將流中的數據轉儲到其中,並且爲此需要默認構造函數。

你的Book類沒有一個。解決這個問題最簡單的方法就是給它一個。

如果這不是一個選項(例如,如果Book保證默認構造函數不能提供的不變量),那麼可以引入一箇中間數據傳輸類,該類是默認構造的,可以通過數據填充operator>>,並可以轉換爲Book。素描:

class TransferBook { 
public: 
    // To read data from stream 
    friend std::istream &operator>>(std::istream &in, TransferBook &dest); 

    // Conversion to Book. Use the non-default Book constructor here. 
    operator Book() const { 
    return Book(all the data); 
    } 

private: 
    // all the data 
}; 

... 

std::vector<Book> books; 
std::ifstream file; 

// Note that books contains Books and the iterator reads TransferBooks. 
// No Book is default-constructed, only TransferBooks are. 
std::copy(std::istream_iterator<TransferBook>(file), 
      std::istream_iterator<TransferBook>(), 
      std::back_inserter(books)); 

可以肯定,這種做法是相當麻煩的和基本上覆制代碼,可能是少些麻煩給Book默認的構造函數。但是,如果Book無法以這種方式更改,這是一種可能的解決方法。

+0

非常感謝,它幫助了我! – Zulcom

相關問題