1

ランダム アクセス ファイル管理を使用して、学校用の倉庫プログラムを作成したいと考えています。多くのプライベート var を持つ product(prodotto) というクラスを作成しました。新しいレコードを作成する必要があります。

この関数は、シーク ポインターとファイルの読み取りを使用して、製品が既に存在するかどうかを確認します。ファイルがない場合は、そのスペースにファイルを書き込むことができます。キーは製品コード (コード) です。

問題は、関数を実行するたびに以前の記録が消去されることです。

このバージョンの前に、私fstreamは仕事をするために将軍を使っていましたが、それはもっとひどかったです。file.dat は常に空でした。

tellg と tellp でポインターを確認しましたが、問題ありません。また、読み取り部分は問題ないようです。問題は文章の書き方だと思います。

これは機能です:

void aggiungiProd()
{
    int code;
    string name,section, description;
    int quantity;
    double price;


    cout<<"\n(insert 0 to come back)"<<endl;

    //exit condiction

    cout<<"Insert product code:";

cin>>code;


if( cin.good()==0)
{ code=0;
    cout<<"invalid code. Please reinsert:"<<endl;
cin>>code;
} //also this part is not working but is less important


if(codice==0) return;//exit condition



ifstream readFile("prod.dat",ios::in);
if(!readFile){
        cerr<<"Error during the reading";
 exit(1);
    }
int var;
var=code-1;

//use a pointer to indicate the location to read
readFile.seekg(var * (sizeof(Prodotto)),ios::beg );


//reading the product record
Prodotto prodotto;
readFile.read(reinterpret_cast< char*> (&prodotto),sizeof(Prodotto));


readFile.close();
if(prodotto.getCod()==0)
{



//THIS PART IS ONLY ABOUT VARIABLES TO SET--> SKIP

cout<<"Inserisci il nome del prodotto (max 30 caratteri): ";
cin.ignore();
getline(cin,name);

if(name=="0") return;//condizione uscita

cout<<"Inserisci quantità da aggiungere: ";
cin>>quantita;

if(quantita==0) return;

cout<<"Inserisci il prezzo del prodotto: " ;
cin>>prezzo;

if(prezzo==0) return;

cout<<"Inserisci sezione di appartenenza del prodotto(max 15 caratteri): " ;
cin.ignore();
getline(cin,sezione);

if(sezione=="0") return;

cout<<"Aggiungi una descrizione del prodotto (max 500 caratteri):";
cin.ignore();
getline(cin,descrizione);

if(descrizione=="0") return;

//END OF THE VARIABLES INSERTION


//NOW PUT THE VARIABLES IN THE PRODUCT prodotto

    prodotto.setCod(codice);
    prodotto.setNome(nome);
    prodotto.setQta(quantita);
    prodotto.setPrz(prezzo);
    prodotto.setSez(sezione);
    prodotto.setDes(descrizione);

//open the file as output
ofstream inOutProd("prod.dat", ios::out );
if(!inOutProd){
        cerr<<"Error in the file creation";
 exit(1);
    }

//pointer for the location of the new record
inOutProd.seekp(var * (sizeof(Prodotto)));


//write the record prodotto
inOutProd.write(reinterpret_cast<const char*>(&prodotto),sizeof(Prodotto));

//i believe the problem is in the statement over this line. I tried also to add ios::app
// in the ofstream line but it only append the new record at the end of file.



cout<<"the following product has been saved successfully\n"<<endl;
outputLine(cout,prodotto);
inOutProd.close();

}
else
{
    cerr<<"The product"<<codice<<"is already in our database"<<endl;

}

}
4

1 に答える 1

0

新しいレコードを書き込む前に、seekp 呼び出しの戻り値を確認する必要があります。ファイルの長さが N レコードを含むのに十分でない場合、seekp はエラー コードを返すので、N レコードを含むのに十分な長さになるようにファイルにデータを追加する必要があります。

于 2013-01-07T17:15:57.280 に答える