0

私はC++fstream、ifstream、ofstreamを学ぼうとしています。プロジェクトの途中で、ofstreamとifstreamを使用して同じファイルにアクセスして読み取りと書き込みを行う場合は、別のストリームを使用する前にストリームを閉じる方がよいことを学びました。

ofstreamのようにwrite_stream(...); ifstream read_stream(....);

 // Accessing pointers using both read_stream, write_stream interchangebly 

  read_stream.read(....);
  write_stream.write(....);

  read_stream.close(); 
  write_stream.close();

///

上記の場合、両方のストリームがファイル内で同じポインターを使用していると思います。そのため、ポインターの動きに注意する必要があります。そのため、read()またはwrite()を試みるたびにシークする必要があります。

私は今のところ正しいと思います。

これ以上の混乱を避けるために、私はこの形式を使用することにしました

 fstream read_write_stream("File.bin",ios::in|ios::out|ios::binary);
 read_write_stream.seekp(pos);
 read_write_stream.seekg(pos);
 read_write_stream.tellp();
 read_write_stream.tellg()

 read_write_stream.read(...);
 read_write_stream.write(...);

 read_write_stream.close()

上記のプログラムで知っておくべきバグ誘発機能はありますか?ご意見をお聞かせください

4

1 に答える 1

1

標準がこのケースを明示的に参照しているかどうかはわかりませんが、C ++コンパイラは、複数のストリームを使用して同じ外部リソース(この場合はファイル)を変更した場合に何が起こるかを約束できるとは思いません。 。fstreamの内部実装に加えて、書き込み先のOSとハードウェアによって異なります。私が正しければ、この操作はデフォルトで未定義の動作になります。

2つの異なるストリームを使用する場合、ほとんどの場合、それぞれが独自のputおよびgetポインターを管理し、それぞれにバッファリングがあります。つまり、flush()を使用しない場合、操作の順序を判別できません。ファイルに対して実行されます。

1つのストリームを使用して読み取りと書き込みの両方を行う場合、動作は予測可能であり、より簡単に理解できると思います。

于 2012-04-07T07:45:39.333 に答える