0

以下は、私のスーパー マーケット請求および在庫編集プログラム クラスの基本構造コードです。

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 に言及して選択するアイテムのデータを変更または編集することです。 、この機能を実現する方法を教えてください。

4

2 に答える 2

1

単純なシリアル化を自分で実装しないでください。ライブラリを使用します。

つまり、回答を参照してください1 , 2+コメント, 3 , 4

commodity.net_price=grs_pr-dis;また、データのシリアル化にデータ操作のロジック (つまり ) を入れないでください。

于 2013-08-13T14:45:57.300 に答える
0

私が正しく理解していると仮定すると、読み取りと表示のループは次のようになります

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

何らかの理由で、最初に という変数を読み込んでから、 というitem別の変数を読み込んでいましたreadItem。一度だけ読む必要があります。の前ではなく、読んだwhile (!readFile.eof())にファイルの終わりをテストする必要があるため、これも間違っています。

于 2013-03-23T10:06:32.523 に答える