写入位置 0x00460000 时发生访问冲突

应该是vector有问题但是并没有发现错在哪里,文件内容读取不了
而且连while做循环时居然都会出错
如图:

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 << "剩余本数:" << 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;//剩余本数
};

#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 << "请输入此类图书的数目" << endl;
        cin >> count;
        Book b(name, code, count);
        m_iSum++, t++;
        book.push_back(b);
        cout << "是否继续录入图书,是:请按1,否:按任意键退出" << endl;
        int a;
        cin >> a;
        if (a != 1)//判断是否继续输入
        {
            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;//记录图书种类数目
    vector<Book>book;//定义图书数组
};

#endif

BookInventory.cpp

#include"BookInventory.h"

BookInventory::BookInventory()//将txt的内容读进book[]中
{
    Book b;
    top = 0;
    fstream file("book.txt", ios::in);
    while (!file.eof())//读取txt内容
    {
        if (!file)
        {
            cout << "文件为正常打开" << endl;
            break;
        }
        file.read((char*)&b, sizeof(b));
        top++;
        book.push_back (b);
    }
    for (int i = 0; i < top; i++)//打印从txt中读取的结果
    {
        book[i].displayBook();
    }
    
    file.close();
}

BookInventory::~BookInventory()
{
}

BookInventory.h

#ifndef _BOOKINVENTORY_H
#define _BOOKINVENTORY_H
//图书库,将文件内容写入图书数组
#include<string>
#include<vector>
#include<fstream>
#include<iostream>
#include"Book.h"
using namespace std;

class BookInventory :public Book
{
public:
    BookInventory();
    ~BookInventory();
private:
    int top;//记录图书种类数目
    vector<Book>book;//定义图书数组
};



#endif



阅读 4.1k
1 个回答

if (!file)
{

cout << "文件打开失败" << endl;

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

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

}
这里打开文件, 你的程序仍然会尝试执行for里面的内容, 就会导致指针错误了. 应该是在退出后 不但要结束while循环, 还应该退出函数, 不应该继续执行while后面的语话.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题