Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;访问错误,指针故障_C++_Pointers - Fatal编程技术网

C++ C++;访问错误,指针故障

C++ C++;访问错误,指针故障,c++,pointers,C++,Pointers,我正在将对象保存到一个文件中,并将其读回。现在我试着一次做一个,看看是否可以避免重复的对象。我收到以下错误:在who.exe的0x00915B18处引发异常:0xC0000005:访问冲突写入位置0xDDDD 我知道这是因为我没有正确地使用指针进行操作,但我迷路了,无法完全理解,当前代码是: #include<iostream> #include "Book.h" #include "InventoryBook.h" #include "SoldBook.h" #include<

我正在将对象保存到一个文件中,并将其读回。现在我试着一次做一个,看看是否可以避免重复的对象。我收到以下错误:
在who.exe的0x00915B18处引发异常:0xC0000005:访问冲突写入位置0xDDDD

我知道这是因为我没有正确地使用指针进行操作,但我迷路了,无法完全理解,当前代码是:

#include<iostream>
#include "Book.h"
#include "InventoryBook.h"
#include "SoldBook.h"
#include<string>
#include<fstream>
using namespace std;

void saveBook(Book);
Book returnBook();

void main() {

    Book novel;
    InventoryBook shelf;
    SoldBook gone;
    novel.setAuthor("Joe");
    novel.setISBN("1234567788");
    novel.setPublisher("Me");
    novel.setTitle("Joe vs. the Volcano");

    saveBook(novel);
    Book rBook = returnBook();
    cout << rBook.getAuthor(); 

    system("Pause");
}

void saveBook(Book saved) {
    ofstream myfile;

    myfile.open("bookInventory.txt", ios::app);

    myfile.write((char*)&saved, sizeof(saved));

}

Book returnBook() {
    ifstream myfile;

    myfile.open("bookInventory.txt", ios::in);

    Book novel;
    Book newBook;

    myfile.read((char*)&novel, sizeof(novel));

    newBook.setAuthor(novel.getAuthor());


    return newBook;
}
#包括
#包括“Book.h”
#包括“InventoryBook.h”
#包括“SoldBook.h”
#包括
#包括
使用名称空间std;
作废存折;
图书归还书();
void main(){
书籍小说;
目录书架;
索尔德布克走了;
小说作者(“乔”);
novel.setISBN(“1234567788”);
小说出版社(“我”);
小说。片名(“乔vs.火山”);
存折(小说);
Book rBook=returnBook();

如果没有出现异常的行号,可能很难回答,并且头文件
std::string
不是您可以直接写入文件并通过强制转换到
char*
来读取的内容。如果您调用
c_()
方法,这为您提供了一些可序列化的内容。c样式的str是后跟空字节的字符。我建议编写
void serialize(of stream&stream)
Book
类的
方法。然后按顺序写出每个字符串。您可以想象一个潜在的
非序列化
函数类似的情况。其余是详细信息。
myfile.write((char*)saved,sizeof(saved));
——我希望停止教授这种类型的编码,或者至少减少这种编码。似乎使用这种完全相同(错误)的编码来“将对象保存到文件”的问题“几天内这里会出现几次。@MichaelPorter底线——您必须以某种可维护的方式保存对象表示的数据,而不是将对象的表示形式保存在内存中,内存中只有一堆神秘的字节。然后在读取时,您从该文件中读取数据,并基于此数据实例化对象,或实例化创建一个“空”对象,并将该对象的每个成员设置为您正在从文件中读取的数据。
C
-样式的“将所有内容作为一个blob读写”在这里不起作用。
#pragma once
#ifndef BOOK_H
#define BOOK_H
#include<iostream>
using namespace std;


class Book{

private:
    string ISBN;
    string bookTitle;
    string authorName;
    string publisher;

public:
    Book(string, string, string, string);
    Book();
    //destructor
    ~Book();
    //Mutators
    void setTitle(string);
    void setISBN(string);
    void setAuthor(string);
    void setPublisher(string);
    //accessors
    string getTitle();
    string getISBN();
    string getAuthor();
    string getPublisher();

};

#endif
#include "Book.h"


Book::Book() {
    ISBN = "";
    bookTitle = "";
    authorName = "";
    publisher = "";
}

Book::Book(string newISBN, string newTitle, string newAuthor, string newPub) {

    ISBN = newISBN;
    bookTitle = newTitle;
    authorName = newAuthor;
    publisher = newPub;
}

Book::~Book()
{
}

void Book::setISBN(string newISBN) {
    ISBN = newISBN;
}

string Book::getISBN() {
    return ISBN;
}

void Book::setTitle(string newTitle) {
    bookTitle = newTitle;
}

string Book::getTitle() {
    return bookTitle;
}

void Book::setAuthor(string newAuthor) {
    authorName = newAuthor;
}

string Book::getAuthor() {
    return authorName;
}

void Book::setPublisher(string newPub) {
    publisher = newPub;
}

string Book::getPublisher() {
    return publisher;
}