2009-07-14 12 views
0

MacOSでgcc4.2を使用すると、次のコードが存在しない場合、新しいファイルを作成する必要がありますか?MacOSでのC++ std :: fstreamの動作

#include <fstream> 

void test() { 
    std::fstream file ("myfile.txt", std::ios::in | std::ios::out); 
} 

論理的には、既存のファイルを読み書きするか、読み書き用に新しい空のファイルを作成する必要があります。しかし、私が得る動作は、 'myfile.txt'が存在しない場合、新しいファイルを作成しないということです。

fopen( "myfile.txt"、 "r +")と同じ動作をするにはどうすればよいですか。 ?

さらに、

#include <fstream> 

void test() { 
    std::ofstream file ("myfile.txt", std::ios::in | std::ios::out); 
} 

常に

が、これは標準的な動作です...既存のファイルを切り捨てるだろうか?

答えて

4

まず最初に、fopen("r+")が存在しない場合、それがファイルを作成するとは考えられません.ISO C & C++に従って、読み書き用に既存のファイルを開きます。 fopenでファイルを作成する場合は、"w+"を使用します。

ストリームの場合、あなただけのtruncを指定:

std::ofstream file ("myfile.txt", 
    std::ios::in | std::ios::out | std::ios::trunc); 

しかし、この両方とfopen("w+")は、ファイルが切り捨てられます。存在する場合は切り捨てることなくファイルを開く標準的な方法はありませんが、単一の呼び出しで存在しない場合は作成します。あなたは、開こうとすると、失敗を確認してから、作成/切り詰めを試みることができます。ただし、チェック後、切り捨て前のファイルが別のプロセスによって作成された場合は、競合状態になる可能性があります。

POSIXでは、openO_CREATとし、O_TRUNCを使用することはできません。

+0

あなたの権利は間違いです。私は "r +"の代わりにPOSIXを考えていました。愚かな質問のためのappologies :)。 – Akusete

0

最初のケースでは、ファイルの読み取りと書き込みの両方を指定しています。したがって、ファイルが存在しない場合は失敗します。 2つの別々のストリーム(読み込み用と書き込み用)を使い、最初に出力ストリームを構築することができます。 2番目のケースでは、 "std :: ios :: app"(追加モードで開く)を使用すると、切り捨てを防ぐことができます。 [Mac OS X 10.4.11、GCC 4.0.1でテスト済み]

関連する問題