1

Ubuntu 11.04 で NetBeans 6.9 を使用して C++ で開発しています。このように、入力および出力ファイル名文字列とファイル ストリームを宣言しました。

ifstream    fpInputFile, fpOutputFile;
string  inputFileName="", outputFileName="";

入力ファイル名には、アプリケーションへの入力引数として既存のファイルの名前が割り当てられます。出力ファイル名は、最後のピリオドの前に「_output」が挿入されることを除いて、入力名と同じ名前が付けられます。したがって、出力は入力と同じディレクトリに書き込まれます。また、私はnetbeansを開始します

su netbeans

そのため、IDE にはディレクトリに対するルート権限があります。ファイルを開こうとして、このように開いているかどうかを確認します。

fpInputFile.open(inputFileName.c_str(), ifstream::in);
fpOutputFile.open(outputFileName.c_str(), ifstream::out);
if (!(fpInputFile.is_open())) throw ERROR_OPENING_FILE;
if (!(fpOutputFile.is_open())) throw ERROR_OPENING_FILE;

入力ファイルは正常に開きますが、出力ファイルは開きません。

出力ファイルが書き込み用に開かれていない理由を特定するための助けをいただければ幸いです。

4

2 に答える 2

4

ofstream出力ファイルをではなくとして宣言しますifstream

fstream入力ファイルと出力ファイルの両方にa を使用することもできます。

于 2012-09-23T21:00:57.680 に答える
3

明らかな問題は、おそらく。std::ofstreamではなくを使用してファイルを開くことを意図していたことですstd::ifstream。これは、実際にストリームに書き込むのに役立ちますがstd::ifstream、読み取り用に開かれている限り、に書き込む方法はあります。たとえば、std::streambufインターフェイスを直接使用することも、を使用してstd::streambufとを作成することもできますstd::ostream

std::ios_base::in | std::ios_base::outさらに興味深い質問は、オープンモードで使用されているときに、ファイルが書き込み用に開かれないのはなぜですか?std::ifstream自動的に追加しますstd::ios_base::in。このモードでstd::ios_base::in | std::ios_base::outはファイルは作成されませんが、既存のファイルは正常に開くことがわかります。本当にstd::ifstream存在しない可能性のある出力用のファイルを開くためにを使用する場合は、次のいずれstd::ios_base::out | std::ios_base::truncかを使用する必要がありstd::ios_base::out | std::ios_base::appます。

  • 前者は、ファイルが存在する場合、ファイルを強制的に作成または切り捨てます。
  • 後者は、すべての場合に書き込みをファイルに追加するように強制します

ただし、私の個人的な推測では、std::ofstreamファイルを読み取りと書き込みの両方で開く場合は、またはを使用するのが最善です(ただし、ファイルが存在しない場合は、ファイルを作成するためにファイルを追加するstd::fstream必要がありstd::ios_base::truncます)。std::ios_base::app

于 2012-09-23T21:26:22.353 に答える