1

アプリケーションはRapidXMLを使用してXMLファイルを編集します。編集は自動化されておらず、時々行われます。XMLコンテンツはGUIに表示され、ユーザーはXMLを変更するいくつかのアクションを実行します。各変更はすぐにディスクに保存する必要があります。

RapidXMLドキュメントオブジェクトをロードするには、ファイルの内容を文字列にコピーする必要があります。ドキュメントを変更するたびに、ドキュメントオブジェクトのコンテンツがファイルにコピーされます。

この例では、ファイルは入力と出力の両方に使用されます。この場合、すべての入出力操作に単一のオブジェクトを使用する必要がありますか?std::fstreamこれは、アプリケーションの起動時に一度開かれ、入出力に使用され、アプリケーションの終了時に閉じられます。

std::ifstreamstd::ofstreamまたは、ファイルの入出力を実行する必要があるときはいつでも、のローカル(一時的な)インスタンスを使用する必要がありますか?たとえばstd::ifstream、ファイルを読み取るために最初に使用されます(開く、読み取る、閉じる)。同様に、std::ofstreamDOMをファイルにエクスポートする必要がある場合(開く、書き込む、閉じる)に使用されるインスタンス。

ここでは(アプリケーションの性質上)パフォーマンスについては心配していませんが、この場合のファイルストリームオブジェクトの適切な選択については興味があります。

4

2 に答える 2

3

再書き込みするデータの量が元のデータと異なる場合にファイルを編集することは、非常に困難です。ファイル形式でデータがシーケンシャルある必要があり、ホールの構文がない場合は、ファイルを(少なくとも変更された位置の先頭から)再書き込みする以外に選択肢はありません。

また、追加の制約があります。続行する前にデータをディスクにフラッシュするstd::fstream必要がある場合は、1つを使用して複数の編集を行うことができる場合があります。flush()オペレーティングシステムは通常、ファイルストリームでメソッドを呼び出した場合でも、ファイルをディスクにフラッシュしません。一部のプラットフォームは、実際に書き込みを強制するための非ポータブルソリューションを提供します。したがって、ディスクにフラッシュする必要がある場合は、実際にファイルを閉じるのが最善の策です。

したがって、特に重要なアプリケーションの場合は、2番目のアプローチ(ifstream初期ロードofstream時、各書き込み時)をお勧めします。また、一時ファイルに書き込んでから、完全な再書き込みを希望の場所に移動して、元のファイルを置き換えることをお勧めします。これにより、データが失われることはありません(少なくともアトミックファイル移動を提供するシステムでは)。

于 2011-06-21T17:27:04.313 に答える
2

私は間違いなくとのローカルの一時的なインスタンスを好みstd::ifstreamます std::ofstream。そうでなければうまくいくかどうかさえわかりません。空を開く std::ofstreamと、既存のファイルの内容が空になります。最初にシークして上書きしても、以前のコンテンツは削除されません。変更の結果、ファイルが短くなった場合でも、以前のコンテンツの残りの文字が残ります。

于 2011-06-21T17:11:59.997 に答える