这是我写入文件的地方 - >
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。
答案 0 :(得分:1)
由于Product
成员,您的std::string
课程无法轻易复制;你没有在写方法中写出Product_name
保存的实际字符串,只写std::string
的二进制表示,而内部字符串指针几乎肯定会在你阅读时指向无效的位置。无论哪种方式尝试执行非平凡可复制类的按字节副本都是未定义的行为。
当您打开文件进行阅读时,您还没有通过binary
标记
fp.open("ProductList", ios::in);
如果您正在阅读的文件中有任何\ r \ n(0x0A 0x0D)序列,将导致Windows出现问题。
您需要为字符串使用char
数组,或者手动处理每个成员的序列化。最简单的方法是使用stream friend functions将对象写入纯文本文件
答案 1 :(得分:1)
我相信如果它是POD(普通旧数据),你不应该读入std :: string。 std::string Product_name
是您的Product
类的成员,当您从流中读取时,它可能会破坏字符串。
同样,你不应该像std::string
那样写Product
。
答案 2 :(得分:0)
当我在gSOAP客户端中使用ofstream对文件进行写操作时,我遇到了类似的问题。但是,当我切换到FILE(stdio.h)和fwrite()时,访问冲突错误消失了!
答案 3 :(得分:-1)
可能是因为打开文件错误。您可以打印返回值以查看它是否为NULL。 编译代码时。
请注意警告消息。有时,在编译时可能只是警告,而在运行时会崩溃。