gpt4 book ai didi

c++ - 当我尝试从文件中读取时出现访问冲突写入位置错误

转载 作者:行者123 更新时间:2023-11-28 06:51:12 24 4
gpt4 key购买 nike

这是我写入文件的地方->

void Supermarket_Billing_System::Add_and_WriteNewProduct(Product P)
{
ofstream fl;
fl.open("ProductList", ios::out | ios::binary);
fl.write((char *) &P, sizeof(P));
fl.close();
}

这是我从文件中读取的地方->

void Supermarket_Billing_System::Read_DisplayProductFromProductList()
{
Product P;
int x;
ifstream fp;
fp.open("ProductList", ios::in);
fp.seekg(0, ios::beg);
fp.read((char *) &P, sizeof(P));
x = P.GetProduct_qty();
fp.close();
}

产品类别如下所示->

class Product
{
private:
long int Product_no;
std::string Product_name;
double Product_price;
int Product_qty;
double Product_tax;
double Product_dis;

public:

//Constructor
Product();
Product(long int, string, double, int, double, double);

//All Getters methods
long int GetProduct_no();
string GetProduct_name();
double GetProduct_price();
int GetProduct_qty();
double GetProduct_tax();
double GetProduct_dis();

//All Setters methods
void SetProduct_no(long int);
void SetProduct_name(string);
void SetProduct_price(double);
void SetProduct_qty(int);
void SetProduct_tax(double);
void SetProduct_dis(double);

void Accept_Product();
void Accept_ProductForBilling();
void Display_Product();
};

当我尝试通过调用 Read_DisplayProductFromProductList() 读取文件时,出现错误 ->

Supermarket_Billing_System.exe 中 0x6803ad54 (msvcp100d.dll) 处的未处理异常:0xC0000005:访问冲突写入位置 0xfeeefeee。

最佳答案

由于 std::string 成员,您的 Product 类不可简单复制;你不是在编写 Product_name 在你的 write 方法中保存的实际字符串,只是 std::string 的二进制表示,并且内部字符串指针几乎肯定会指向阅读时的无效位置。无论哪种方式,尝试执行非平凡可复制类的按字节复制都是未定义的行为。

当您打开文件进行阅读时,您也没有传递 binary 标志

fp.open("ProductList", ios::in);

如果您正在阅读的文件中有任何\r\n (0x0A 0x0D) 序列,这将导致 Windows 出现问题。

您需要为字符串使用 char 数组,或者手动处理每个成员的序列化。最简单的方法是使用 stream friend functions将您的对象写入纯文本文件

关于c++ - 当我尝试从文件中读取时出现访问冲突写入位置错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23926112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com