2017-09-14 12 views
0

任意の種類のタイプを取得できる配列をシミュレートする、古典的なリンクリストを作成しました。もちろん、あなたは臓器を削除して追加することができ、すべてのメソッドが正常に動作します。リンクリストのデータをバイナリファイルに保存して読み込みます。C++

バイナリファイルからの書き込みと読み取りのためのメソッドを書く必要があります。実際に何をするのかわかりません。 ファイルに書き込むためのさまざまな方法を試しましたが、これまでできなかったどこに行くし、私もコードが悪いのかわからない、

は私のリンクリストコード

template <class T> 
class LinkedList 
{ 
private: 
    struct node 
    { 
     T data; 
     node * next; 
    }; 
    node* head; 

public: 
    LinkedList(); 
    ~LinkedList(); 

    void add(T value); 
    int find(T value); 
    bool remove(T value); 
    void clear(); 
    bool ifEmpty() const; 
    int size() const; 
    void display() const; 
    T getData(int index) const; 

    T &operator[](int index); 


    void save(ofstream& out); 
}; 

の一部のthatsと仕事

template <class T> 
void LinkedList<T>::save(ofstream& out) 
{ 
    node* temp = head; 
    T temp2 = temp->data; 

    for (int i = 0; i < size(); i++) 
    { 
     out.write((const char*)(temp2), sizeof(temp2)); 
     temp = temp->next; 
     temp2 = temp->data; 
    } 
} 
012をdosent保存方法のコードのthats

あなたのプロの何人かが私にそれを正しく行う方法の指示を与えることができる場合はどうぞ...

+3

"シリアル化"を参照してください。 'T 'にポインタが含まれていれば、ポインタを読み戻すことは役に立ちません。 – nwp

+1

うん、私はあなたの言うことを理解していますが、私はポインタや何かを使用しないように例外をスローすることができますか? – user8093201

+0

'T 'にポインタが含まれているかどうかは分かりません。もしそれが 'プライベート'メンバーならどうですか?一般的には、 '' std :: string to_string(const T&t) ''と '' T from_string(const std :: string&s) ''のような関数をさまざまな '' T ''に書くことになります。 'int'のようないくつかの型では、それを自分で実装することができます。 [cereal](https://uscilab.github.io/cereal/)のような図書館も見てください。 – nwp

答えて

0

リストのサイズを最初に書き込む必要があります。これにより、あなたはリストを読むことができます。サイズを読み取らずに、ファイルからの読み込みをいつ停止するかを決める方法はありません。

また、エラーが発生しました。ライン

 out.write((const char*)(temp2), sizeof(temp2)); 

 out.write((const char*)(&temp2), sizeof(temp2)); 
           ^^ Missing 

template <class T> 
void LinkedList<T>::save(ofstream& out) 
{ 
    size_t sz = size(); 
    out.write((const char*)(&sz), sizeof(sz)); 

    node* temp = head; 
    T temp2 = temp->data; 

    for (int i = 0; i < size(); i++) 
    { 
     out.write((const char*)(&temp2), sizeof(temp2)); 
     temp = temp->next; 
     temp2 = temp->data; 
    } 
} 

読み出し電位を実装する必要があります。

template <class T> 
void LinkedList<T>:read(ifstream& in) 
{ 
    size_t sz = 0; 
    in.read((char*)(&sz), sizeof(sz)); 

    // Make sure that list is empty 

    for (size_t i = 0; i < sz; ++i) 
    { 
     T temp; 
     in.read((char*)(&temp), sizeof(temp)); 

     // Add temp to the list. 
     add(temp); 
    } 
} 

size()が正しい値を返す場合はnullポインタアクセスの問題を修正する必要がありsaveの更新バージョン。

template <class T> 
void LinkedList<T>::save(ofstream& out) 
{ 
    size_t sz = size(); 
    out.write((const char*)(&sz), sizeof(sz)); 

    node* temp = head; 
    for (int i = 0; i < size(); i++) 
    { 
     // Pull the data out of the pointer here. 
     // At this point, temp should not be NULL. 
     T temp2 = temp->data; 
     out.write((const char*)(&temp2), sizeof(temp2)); 
     temp = temp->next; 
    } 
} 
+0

助けてくれてありがとう、私はあなたの方法を試みたが、その破砕し続けると私はなぜ、私はそれが間違って書くかもしれないと思うメインでそれを使用する方法を知っている? 'ofstream outFile(" test.txt "、ios :: binary); \t \t iList.save(outFile); \t \t outFile.close(); – user8093201

+0

@ user8093201、デバッガを試してください。あなたの 'ofstream'と' save() '関数の使い方は私にとってうまく見えます。問題はおそらく他の場所で起こりそうです。 –

+0

デバッガはtempがnull ptrだと言っていますので、例外をスローして、今は破棄しないようにしていますが、問題は、ちょうどチェックのためにtxtファイルを書き込もうとしてもgibrishで作成したファイルを開いたとき、正しいデータがコピーされているかどうかは確かです。 – user8093201

関連する問題