2016-12-31 8 views
-1

私はVisual Studio 2013を使用しています。私のプロジェクトはライブラリ管理システムです。 3セム最終PROJECT.exeで0x6534DF58(msvcp120d.dll)でアクセス違反の読み取り場所0x012D363C

class Book { 

    string edition; 
    string serialno; 
    string shelfno; 
    int date, month, year; 

public: 
    Book(); 
    Book(char name, char aname, string edit, int srno, int shfno); 
    void getbook(); 
    void showbook(); 
    void getdate(); 
    string bookname; 
    string authorname; 
}; 

Book::Book() 
{ 
    bookname = "BOOKNAME"; 
    authorname = "AUTHORNAME"; 
    edition = "EDITION"; 
    serialno = "SERIALNO."; 
    shelfno = "SHELFNO."; 
} 

void Book::showbook() 
{ 
    cout << bookname << " ---- " << authorname << " ---- " << edition << "---- " << serialno << "----" << shelfno << endl; 
} 

void Librarysystem::showrecord() 
{ 
    ifstream file; 

    Book b; 
    file.open("bookrecord.txt", ios::in); 
    if (!file) 
     cerr << "\n could not open file:"; 
    cout << "\t\t BOOK RECORD\n\n" << endl; 
    while (!file.eof()) { 
     b.showbook(); 
     file.read(reinterpret_cast<char*>(&b), sizeof(b)); 

     if (file.eof()) 
      file.close(); 
     //cerr << "\n could not read from file:"; 
    } 
} 

未処理の例外:0xc0000005で:アクセス違反読取位置0x012D363C。 これは例外です

+0

(例えばoperator<<operator>>を再定義することによって)Bookに適切&特定のシリアライズ/デシリアライズする方法を記述することです。 'Book'の定義を教えてください。 –

+1

本は確かにPOD型ではありません。objecの状態を決して保存せず、フィールド値を保存します。あなたはクラス内の直列化メソッドが必要です – Swift

+1

あなたのコードをインデントする方法を学んでください。それはデバッグに役立ち、*あなたも*役立ちます。 – cybermonkey

答えて

1

Bookクラスの内容は表示されませんでしたが、std::stringなどの非POD(純オブジェクトデータ)メンバーを使用していることを強く疑う。

この場合、にはシリアル化できず、ほとんどの場合、純粋なCタイプで動作する同じテクニックを使用してオブジェクトをデシリアライズします。そこで、基本的

while (!file.eof()) 
{ 
    b.showbook(); 
    file.read(reinterpret_cast<char*>(&b), sizeof(b)); 

、初めて、bはOKである必要があり、空の値で初期化/初期化されますが、file.read呼び出した後、bは前bの状態を保持しており、std::stringオブジェクトがある場合、それはポインタを保持していません(あなたはポインタをシリアル化しようとしますか?意味がないでしょう:よく同じです)。

最も簡単な方法は、彼らがPOD-メンバーのみが含まれていない場合は、そのようなオブジェクトをデシリアライズすることはできません

+0

は、それよりもさらに良い演算子<<を定義します – Swift