如何正确地从c ++中读取和写入二进制文件中的对象

时间:2013-03-23 09:43:25

标签: c++ file object

以下是我的超级市场结算和股票编辑程序的基本结构代码 类:

class Admin
{
public:
     admin();
private:
     int Pid;
     char name[20];
     double quant;
     double price;
     double disc;
     double net_price;

     friend istream &read(istream&, Admin&);
     friend ostream &show(ostream&, const Admin);
};

istream &read(istream&, Admin&);
ostream &show(ostream&, const Admin);
朋友职能的定义:

istream &read(istream &is, Admin &commodity)
{
    double dis;

    fflush(stdin);
    is>>commodity.Pid;

    is.getline(commodity.name,30);

    is>>commodity.quant
      >>commodity.price
      >>commodity.disc;

    dis=grs_pr*(commodity.disc/100);

    commodity.net_price=grs_pr-dis;

    return is;
}

ostream &show(ostream &os, const Admin thing)
{
    os << thing.name <<"   " << thing.quant <<"   "
       << thing.price <<"   " << thing.disc <<"   "
       << thing.net_price << endl;

    return os;
}

主要功能:

int main()
{
    admin item;

    while(read(cin,item)
    {
        ofstream file;
        file.open("Stock.dat",ios::binary | ios::app);
        file.write(reinterpret_cast<const char*>(&item),sizeof(Admin));
    }
    ifstream readFile("Stock.dat",ios::in|ios::binary);

    while(!readFile.eof())
    {
        readFile.read(reinterpret_cast<char*> (&item),sizeof(Admin));
        Admin readedItem;
        read(readFile,readedItem);    /*i have used read and show function to watch the values that are read by readFile but every time show function output some five exponential values like 5.23689e-301*/
        show(cout,readedItem);
    }

    return 0;
}

请告诉我上面的代码有什么问题,我该怎么做才能纠正它, 我的动机是从创建的文件中读取并通过用户提及产品ID来更改或编辑要选择的项目的数据,请帮助我如何实现此功能。

2 个答案:

答案 0 :(得分:1)

你不应该自己实现一个naiive序列化。使用图书馆。

请参阅答案12+comments34

另外,不要在数据序列化中放置数据操作逻辑(即commodity.net_price=grs_pr-dis;

答案 1 :(得分:0)

假设我理解正确,那么你的阅读和展示循环应该是

    for (;;)
    {
        readFile.read(reinterpret_cast<char*> (&item),sizeof(Admin));
        if (readFile.eof())
            break;
        show(cout,item);
    }

出于某种原因,您正在阅读两次,首先是一个名为item的变量,然后是另一个名为readItem的变量。你只需要阅读一次。另外while (!readFile.eof())也是错误的,因为您必须在> 之前 之前测试文件结尾