2

このようにオブジェクトofstreamの値を変更すると、問題が発生します。ofstream

ofstream o_save; 

/*code*/

o_save = ofstream(filename);  //Problem is here

...上の行はファイルの内容を完全に消去します。

問題は、オブジェクトfilenameの値を合法的に変更するにはどうすればよいですか?ofstream

PSグローバルにしたいので、どの保存ファイルを選択するのかわからないので、宣言するときに定義できません。

4

3 に答える 3

3

質問はかなり曖昧で矛盾しており、OPは質問をした後に眠っていたようです。だから私は彼の頭の中をのぞき、彼が何を望んでいるのかを詳しく説明しようとします。

ファイルを開くには、そのための多くのモードがあります。このように開きます。

ofstream o_value ;
o_value.open("file.txt") ;

そのファイルの元の内容を保持する場合は、を使用します。

o_value.open("file.txt", ios::app) ;

後で閉じて別のものを開きたい場合は、...を使用して閉じます。

o_value.close() ;

の場合、ファイル名の変更は通常許可されていませんofstreamrenameから使用できます<cstdlib>remove("file.txt")を使用してファイルを削除できます<cstdio>

于 2012-11-24T12:07:42.957 に答える
1

ofstreamオブジェクトの「名前を変更する」とはどういう意味ですか?オブジェクトが持つ唯一の「名前」ofstreamは、変数の名前です。ofstreamオブジェクトはデータストリームです。(一部のシステムでは)を使用して、関連付けられているファイルの名前を変更できますrenameが、どういうわけか、これもあなたが望むものではないと思います。ストリームを閉じて、別のファイルで再度開くこともできます。

iostreamオブジェクト間で割り当てることはできません。悪化した場合は、グローバルオブジェクトをポインタとして宣言し、それに割り当てることができます(*o_save書き込みに使用)。

最後に、標準では、ファイルを開くときにofstream、ファイルが存在する場合はファイルを切り捨てるとされています。これがあなたのやりたいことではない場合は、オープンモードにいくつかのフラグを追加する必要があります。たとえば、を追加するstd::ios_base::appと、ファイルは切り捨てられなくなり、すべての書き込みはファイルの最後になります(システムがサポートしている場合は、原子的には)。または(非常に驚くべきことですが)、std::ios::inフラグに追加することもできます。ファイルが存在しない場合、これは失敗しますが、ファイル内のどこにでも書き込むことができます。これは、ファイルを読みたくない場合でも、ファイルのどこにでも書き込めるようにする場合に、書き込み用にファイルを開く唯一の方法です。

于 2012-11-24T12:14:11.220 に答える
0

ofstreamには、ある種の抽象的な属性はありません。name名前は、そのメンバー関数の一部に対する単なるパラメーターであり、その意味で、

オブジェクトfilenameの値を変更するofstream

無意味です。

一般に、ファイルの名前をstd::renamefromで変更する<cstdlib>か、Boost.Filesystemを使用できます。

于 2012-11-24T12:06:51.120 に答える