C++ 尝试从文件读取时发生访问冲突写入位置错误

C++ 尝试从文件读取时发生访问冲突写入位置错误,c++,visual-c++,C++,Visual C++,这是我写入文件的地方-> 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

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

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();
}
这是我从文件中读取的位置->

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();
}
Product类看起来像这样->

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()从文件中读取时,会出现错误->


超市计费系统中0x6803ad54(msvcp100d.dll)处未处理的异常:0xC0000005:访问冲突写入位置0xfeeefeee。

由于
std::string
成员,您的
产品
类不容易复制;您没有写入写入方法中保存的
Product\u name
实际字符串,只有
std::string
的二进制表示形式,读取时,内部字符串指针几乎肯定会指向无效位置。任何一种尝试执行非平凡可复制类的字节复制的方式都是未定义的行为

在打开文件进行读取时,您还没有传递
二进制
标志

fp.open("ProductList", ios::in);
如果您正在读取的文件中存在任何\r\n(0x0A 0x0D)序列,这将导致Windows出现问题


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

我认为不应该像读取POD(纯旧数据)一样读取std::string
std::string Product\u name
Product
类的成员,当您从流中读取时,它可能会损坏字符串


类似地,您不应该这样编写
std::string
(作为
产品的一部分)。

当我在gSOAP客户机中使用ofstream对文件编写操作时,我遇到了类似的问题。然而,当我切换到文件(stdio.h)和fwrite()时,访问冲突错误消失了

这可能是因为打开文件错误。您可以打印返回值以查看它是否为空。 当你编译你的代码时


请注意警告信息。有时,当您运行编译器时,它可能只是一个警告,但当您运行它时,它会崩溃

嗨,尹杰!欢迎来到stackoverflow(嗯,我想你已经潜伏了一段时间了)。虽然在一般情况下,您的答案可能是错的,也可能不是错的,但对于这个特定的问题,已经有针对原始海报问题的答案。您可能会发现阅读一些关于回答以下问题的页面很有帮助。如果你还有其他问题,试试看。祝你好运我所说的是在另一种情况下,当我尝试读取文件时,发生了错误访问冲突写入位置错误。因为我遇到了这个错误,在stackoverflow中找不到答案。我认为答案是有贡献的,可以使社区变得更好。我们其实不需要把它弄得太僵硬。任何捐款都可以接受,对吗?有可能其他人会和我在同一个空间里,从中找到答案。那是我的想法。如果你禁止我认真回答问题,你会影响我的热情。问题的标题只是一个标题。问题的细节是需要回答的。如果在stack overflow上找不到问题的答案,但找到了答案,则可以询问并回答自己的问题,这样将来的搜索可以从您共享的内容中获益,同时将当前问题的答案集中在当前的详细信息上。如果您决定这样做,请详细说明,以避免将其标记为副本。我希望这有帮助!嗨,朗格莫尔!我抓到你了。我将在将来为这些相同的标题和不同的具体错误创建问题。