鍍金池/ 問答/C++/ 寫入位置 0x00460000 時發(fā)生訪問沖突

寫入位置 0x00460000 時發(fā)生訪問沖突

應(yīng)該是vector有問題但是并沒有發(fā)現(xiàn)錯在哪里,文件內(nèi)容讀取不了
而且連while做循環(huán)時居然都會出錯
如圖:

clipboard.png
按任意鍵后退出居然出錯!

代碼如下:有點長

demo.cpp

#include<iostream>
#include<string>
#include"Book.h"
#include"BookInventory.h"

#include"AddBook.h"

using namespace std;

int main()
{
    
    AddBook addbook;
    addbook.getBook();
    BookInventory B;

    system("pause");
    return 0;
}

Book.cpp

#include<iostream>
#include"Book.h"
using namespace std;
//圖書信息
Book::Book()
{
    m_strBookName = "C++";
    m_iBookCode = "001";
    m_iBookCount = 2;
}

Book::Book(string book_name, string book_code, int book_count)
{
    m_strBookName = book_name;
    m_iBookCode = book_code;
    m_iBookCount = book_count;
}

Book::~Book()
{
}

void Book::displayBook()
{
    cout << "圖書名稱:" << m_strBookName << endl;
    cout << "圖書編號:" << m_iBookCode << endl;
    cout << "剩余本數(shù):" << m_iBookCount << endl;
}

Book.h

#ifndef _CLASS_H
#define _CLASS_H

#include<string>
using namespace std;

class Book
{
public:
    Book();
    Book(string book_name,string book_code,int book_count);
    virtual~Book();
    void displayBook();
protected:
    string m_strBookName;
    string m_iBookCode;//圖書編號
    int m_iBookCount;//剩余本數(shù)
};

#endif

AddBook.cpp

#include"AddBook.h"

int AddBook::m_iSum = 0;//初始化sum
AddBook::AddBook()
{    
}

void AddBook::getBook()
{
    string name;
    string code;
    int count;
    int t = 0;
    while (1)
    {
        cout << "請輸入圖書名稱" << endl;
        cin >> name;
        cout << "請輸入圖書編號" << endl;
        cin >> code;
        cout << "請輸入此類圖書的數(shù)目" << endl;
        cin >> count;
        Book b(name, code, count);
        m_iSum++, t++;
        book.push_back(b);
        cout << "是否繼續(xù)錄入圖書,是:請按1,否:按任意鍵退出" << endl;
        int a;
        cin >> a;
        if (a != 1)//判斷是否繼續(xù)輸入
        {
            break;
        }
    }

    //book[0].displayBook();

    fstream file("book.txt", ios::app | ios::out);
    if (!file)
    {
        cout << "文件打開失敗" << endl;
    }
    for (int i = 0; i < t; i++)
    {
        file.write((char*)&book[i], sizeof(book[i]));
    }
    file.close();
}

AddBook::~AddBook()
{

}


AddBook.h

#ifndef _ADDBOOK_H
#define _ADDBOOK_H
//添加圖書
#include<string>
#include<vector>
#include<fstream>
#include<iostream>
#include"Book.h"
using namespace std;

class AddBook :public Book
{
public:
    AddBook();
    virtual ~AddBook();
    void getBook();
private:
    static int m_iSum;//記錄圖書種類數(shù)目
    vector<Book>book;//定義圖書數(shù)組
};

#endif

BookInventory.cpp

#include"BookInventory.h"

BookInventory::BookInventory()//將txt的內(nèi)容讀進book[]中
{
    Book b;
    top = 0;
    fstream file("book.txt", ios::in);
    while (!file.eof())//讀取txt內(nèi)容
    {
        if (!file)
        {
            cout << "文件為正常打開" << endl;
            break;
        }
        file.read((char*)&b, sizeof(b));
        top++;
        book.push_back (b);
    }
    for (int i = 0; i < top; i++)//打印從txt中讀取的結(jié)果
    {
        book[i].displayBook();
    }
    
    file.close();
}

BookInventory::~BookInventory()
{
}

BookInventory.h

#ifndef _BOOKINVENTORY_H
#define _BOOKINVENTORY_H
//圖書庫,將文件內(nèi)容寫入圖書數(shù)組
#include<string>
#include<vector>
#include<fstream>
#include<iostream>
#include"Book.h"
using namespace std;

class BookInventory :public Book
{
public:
    BookInventory();
    ~BookInventory();
private:
    int top;//記錄圖書種類數(shù)目
    vector<Book>book;//定義圖書數(shù)組
};



#endif



回答
編輯回答
維她命

if (!file)
{

cout << "文件打開失敗" << endl;

}
for (int i = 0; i < t; i++)
{

file.write((char*)&book[i], sizeof(book[i]));

}
這里打開文件, 你的程序仍然會嘗試執(zhí)行for里面的內(nèi)容, 就會導(dǎo)致指針錯誤了. 應(yīng)該是在退出后 不但要結(jié)束while循環(huán), 還應(yīng)該退出函數(shù), 不應(yīng)該繼續(xù)執(zhí)行while后面的語話.

2017年12月16日 18:28