2009-05-26 10 views
0

私はこのようなコードがあります。C++に.binファイルを作成する関数がありますか、またはこのコードに何かがありませんか?

int main() { 
    fstream file; 
    file.open("test.bin", ios::out | ios::binary); 
    if(!file.is_open()) 
    { 
     return -1; 
    } 
    int n = 3; 
    file.write(reinterpret_cast<char*>(&n), sizeof(n)); 
    file.close(); 
    return 0; 
} 

を、私は一人でそれを実行すると、それは「test.bin」を開くことができませんでしたので、明らかに、-1で終了します。しかし、空白のメモ帳ファイルを "test.bin"として保存して実行すると正常に動作します。私が疑問に思うのは、 "test.bin"というファイルが既に存在しない場合、空のファイル "test.bin"を自動的に生成するために私のC++プログラムを得る方法です。

+1

もう一度お試しください。あなたはios :: inをios :: outに変更して以来、うまく動作します。 – paxdiablo

+0

'file.write'とは何の関係もありません。なぜなら、プログラムは' file.write'の前に 'return -1'に達し、問題は' test.bin'をまったく開いていないからですそれが 'file.write'に到達する前に終了します。 –

+0

そのプログラムは、VS2008でうまく動作するので、ファイルがすでに存在するかどうか、そのパーミッションは何か、どのディレクトリにそれを作成しようとしているかなどを調べることができます。コードは問題ありません。 binファイルを作成し、整数3を書き込みます。失敗した場合のrdstate()は何ですか? – paxdiablo

答えて

1

あなたのコードスニペットは、入力用に開いたファイルに書き込もうとしているので間違っています。ファイルに書き込む場合は、ios::inの代わりにios::outを使用するだけです。

あなたが読み取り用ファイルを開くが、それが存在しない場合は、それを作成したい場合は、あなたが使用することができます。

file.open("test.bin", ios::in | ios::binary); 
if(!file.is_open()) { 
    file.open("test.bin", ios::out | ios::binary); 
    int n = 3; 
    file.write(reinterpret_cast<char*>(&n), sizeof(n)); 
    file.close(); 
    file.open("test.bin", ios::in | ios::binary); 
    if(!file.is_open()) { 
     return -1; 
    } 
} 

それはdoesnの場合、これは、デフォルトの内容として整数3でファイルを初期化しますすでに存在していません。

存在する場合、内容はそのままになります。どちらの場合でも、最初のバイトにファイルをオープンします。

2

私はあなたがおそらく開くことによってそれを行うと、ファイルを閉じることができ前提としたい:

if (GetFileAttributes("test.bin") == INVALID_FILE_ATTRIBUTES) 
{ 
    fstream file; 
    file.open("test.bin", ios::out); 
    file.close(); 
} 
+0

これは、空のtest.binを作成します。 +1。 – RedBlueThing

+1

おそらくGetFileAttributesがWindows特有であることに気付くでしょう(これはOPにとっては問題ありませんが、今後の到着者は気にするかもしれません)。 – dmckee

+0

POSIXシステムでstat(2)を使用します。 – dmckee

1

1つのオプションは、読み取り/書き込みのために開くと、ファイルの先頭に追求することです。

あなたが読んだり、書くことができます。

+0

ios:appはファイルの末尾に*すべての*書き込みを強制します。 – paxdiablo

関連する問題