1

私は問題に遭遇しました、そして、C++の私の現在の知識はそれを解決するのに十分ではありません。私はStroustrupの本で答えを探しましたが、今では私が間違っていることを完全に理解しています。

だから本質。

私はファイルに書き込みます:

int i = 1;
int j = 2;
ofstream ofs("file", ios::binary);
ofs.write(as_bytes(i), sizeof(int));
ofs.write(as_bytes(j), sizeof(int));

その後、2番目の値を更新する必要があります。

int j = 10;
ofstream ofs("file", ios::binary);
ofs.seekp(4, ios::beg);
ofs.write(as_bytes(j), sizeof(int));

そして、私がファイルを読み込もうとすると:

int i = 0;
int j = 0;
ifstream ifs("file", ios::binary);
ifs.read(as_bytes(i), sizeof(int));
ifs.read(as_bytes(j), sizeof(int));
cout << i << ' ' << j << endl;

私は最初の値を失ったことがわかりました。私は何が間違っているのですか?なぜ消えたのですか?

4

1 に答える 1

3

デフォルトでは、ファイルは切り捨てられます(ios:truncつまり、書き込み用にファイルを開くとコンテンツが失われます)。

2番目の書き込み操作では、書き込みのみを行っているにもかかわらず、フラグios:inANDを明示的に追加します。ios:outしたがって、基本的には次のものを使用します。

ofstream ofs("file", ios::binary | ios::in | ios::out | ios::ate);

これにより、ストリーム/ファイルポインタがファイルの最後にある状態でファイルが開かれるはずです(ios::ateただし、オプションの場合もあります)。

于 2011-08-17T22:03:44.177 に答える