2016-12-31 1 views
-1

입니다. Visual Studio 2013을 사용하고 있습니다. 내 프로젝트는 라이브러리 관리 시스템입니다. 내 파일을 읽을 때 액세스 위반은 예외입니다. 가 0xc0000005 : 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:"; 
    } 
} 

처리되지 않은 예외가 액세스 위반이 위치 0x012D363C을 읽고. 이 예외

+0

당신이 그와 같은 객체를 직렬화 할 수 없습니다 (예를 들어 operator<<operator>>를 재정 의하여) Book에 적절한 & 특정 직렬화/역 직렬화 메소드를 작성하는 것입니다. 'Book'의 정의를 보여줄 수 있습니까? –

+1

확실히 POD 타입이 아닙니다. objec의 상태를 절대로 저장하지 않고 필드 값을 저장합니다. 클래스 – Swift

+1

내부에 직렬화 메서드가 필요합니다. 코드를 들여 쓰기를 배우십시오. 디버깅에 도움이되며 도움이됩니다. – cybermonkey

답변

1

우리는 Book 클래스의 내용을 보지 않았다 그러나 비 POD (순수 객체 데이터) std::string 형상 부재를 사용하고 있음을 난 강력하게 의심이다.

이 경우 을 직렬화 할 수 없으며 대부분은 순수 C 유형에서 사용할 수있는 동일한 기술을 사용하여 객체를 비 직렬화합니다. 그래서 기본적으로

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

, 처음, b는 확인을해야한다, 빈 값으로 초기화/초기화하지만 file.read 호출 후, b는 이전 b 상태를 유지하고 std::string 객체가있는 경우, 그 포인터를 보유하고 있지 않습니다 유효하지 않은 메모리 영역 (포인터 직렬화를 시도 하시겠습니까? 그들은 POD 전용 멤버를 포함하지 않는 경우

가장 간단한 방법은

+0

더 나은 것은 연산자 <<를 정의 할 것입니다. – Swift

관련 문제