以下是我的超级市场结算和股票编辑程序的基本结构代码 类:
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来更改或编辑要选择的项目的数据,请帮助我如何实现此功能。
答案 0 :(得分:1)
你不应该自己实现一个naiive序列化。使用图书馆。
请参阅答案1,2+comments,3,4
另外,不要在数据序列化中放置数据操作逻辑(即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())
也是错误的,因为您必须在>> 之前 之前测试文件结尾。