2012-04-27 4 views
1

私は、さまざまなもの(構造体の形式)に入力してバイナリファイルに書き込んでいるところです。私は、プログラムが開いている間にファイルを読み書きすることができなければなりません。メソッドの1つは、すべてのクライアントをバイナリファイルに出力する必要があります。私はそのメソッドを呼び出すたびに、ファイルの内容を消去し、それが書き込まれるのを防ぐように見える場合を除いて、動作しているようです。正しい、C++バイナリファイルメソッドがファイルからコンテンツを削除していますか?

fstream binaryFile; 
binaryFile.open("HomeBuyer", ios::in | ios::app | ios::binary); 

は、同じファイルがプログラムを実行する時間の間使用できるようになっているので、私は、iOS ::アプリでそれを開く必要があります。ここに該当スニペットですか?

ここでエントリを追加する方法です。

void addClient(fstream &binaryFile) { 
     HomeBuyer newClient; //Struct the data is stored in 
     // -- Snip -- Just some input statements to get the client details // 

     binaryFile.seekp(0L, ios::end); //This should sent the write position to the 
            //end of the file, correct? 
     binaryFile.write(reinterpret_cast<char *>(&newClient), sizeof(newClient)); 

     cout << "The records have been saved." << endl << endl; 
} 

そして今、すべてのエントリ印刷する方法:

void displayAllClients(fstream &binaryFile) { 
    HomeBuyer printAll; 
    binaryFile.seekg(0L, ios::beg); 
    binaryFile.read(reinterpret_cast<char *>(&printAll),sizeof(printAll)); 

    while(!binaryFile.eof()) { //Print all the entries while not at end of file 
     if(!printAll.deleted) { 
      // -- Snip -- Just some code to output, this works fine // 
     } 

     //Read the next entry 
     binaryFile.read(reinterpret_cast<char *>(&printAll),sizeof(printAll)); 
    } 
    cout << "That's all of them!" << endl << endl; 
} 

私はプログラムをステップ実行した場合、私は、入力として多くのクライアントとして缶を私は、displayAllClients()を初めて呼び出すときにそれらをすべて出力します。しかし、displayAllClients()を一度呼び出すとすぐに、バイナリファイルがクリアされているように見えます。クライアントを表示しようとすると、結果は表示されません。

私はseekpとseekgを間違って使用していますか?

binaryFile.seekp(0L, ios::end); 

をそして、これは最初に私の読み取り位置を設定する必要があります:私が理解から

、これはファイルの最後に私の書き込み位置を設定する必要があり

binaryFile.seekg(0L, ios::beg); 

感謝を!

+0

書き込みが成功したことを確認します。 'ios :: app'が暗黙的に' ios :: out'が指定されているかどうかはわかりません。 – hmjd

+0

書き込みは成功したようですが、チェックするためにios :: outで試しました。同じことをしているようです。つまり、addClient()メソッド以外のメソッドを呼び出すまで、書き込みは成功したように見えます。 – Nate

+2

EOFが設定されている場合は、 'seekp()'と 'seekg()'の前に 'binaryFile.clear()'を呼び出す必要もあると思います。 – hmjd

答えて

3

コメントを貼り付けて問題を解決しました。

あなたはそれ以外の場合は動作しません、EOFが設定されている場合seekp()seekg()binaryFile.clear()を呼び出す必要があります。

+0

ありがとう、これはそれをしたようです。私はまだ他のところで問題を抱えていますが、それはスモッキングの答えに関連していると思います。ありがとう! – Nate

1

これは、iOSのドキュメントです::アプリ

ios::app 

    All output operations are performed at the end of the file, appending the 
    content to the current content of the file. This flag can only be used in 
    streams open for output-only operations. 

これは宿題ですので、私はあなたがあなた自身の結論を出すもらおう。

+0

それは感謝します、ありがとう。 – Nate

関連する問題