2010-12-12 25 views
0

Cを使用してファイルを書き込もうとすると、 voidをデータとして受け入れるfwriteは、テキストエディタでは解釈されません。cとC++を使用してファイルに書き込む

struct index 
{ 
    index(int _x, int _y):x(_x), y(_y){} 
    int x, y; 
} 

index i(4, 7); 

FILE *stream; 
fopen_s(&stream, "C:\\File.txt", "wb"); 
fwrite(&i, sizeof(index), 1, stream); 

しかし、私はC++で試してみます。バイナリモードでofstream write、それは可読です。 fwriteを使って書いたのと同じようになるのはなぜですか?

+1

'fwrite'を間違って使用したようですね。いくつかのコードを投稿できますか? –

+0

私は 'fwrite'のために投稿しました。 – user963241

+0

あなたの 'ストリーム'は何ですか? – chrisaycock

答えて

0

これはC++でストリームを使用してバイナリデータを書き込むための方法である:

struct C { 
    int a, b; 
} c; 

#include <fstream> 
int main() { 

    std::ofstream f("foo.txt",std::ios::binary); 
    f.write((const char*)&c, sizeof c); 
} 

fwriteと同じように。これは、同じようにオブジェクトを保存しなければなりません。それがあなたのためでなければ、あなたのコードをストリームで投稿してください - 間違っていることがわかります。

+0

@Kos私はf << cをオーバーロードしようとしましたが、その後はbを挿入しました。 – user963241

+0

これは、テキスト出力を受け取った理由を説明しています。生のバイナリ出力が必要な場合は、今何をすべきかを知っています。 – Kos

+0

CとC++ファイルストリームを生のバイナリモードで使って2つのファイルを書きましたが、Cを使って書かれたファイルは、C++を使って書いたものより90%サイズが大きくなりましたか? – user963241

0

C++のストリームストリーム挿入はテキストのみを行います。バイナリ対テキストモードでiostreamを開くことの違いは、天気か行末の文字の変換が起こらないことです。 32ビットintが32ビットを正確に取るバイナリ形式を書こうとするならば、C++のc関数を使います。

のostreamのwriteメソッドは、関数fwriteの多かれ少なかれクローンである(それが唯一の代わりにfwriteのの4のバイト配列と長さがかかるので、それは少しあまり有用であることを除い:fwriteのが良い選択かもしれ理由について

編集params)しかし、fwriteに固執することによって、間違ってストリーム挿入を1つの場所で使用し、別の場所に書き込む方法はありません。安全メカニズムはそれほど重要ではありません。柔軟性に余裕がある間は、ファイルを書き換えるコードを変えずに出力を圧縮するiostreamの派生物を作ることはできません。

+0

C++のストリームオブジェクトは、バイナリデータにも完全に適しています... Cの選択肢よりも好む理由の1つは、オブジェクトのデストラクタでファイルを閉じた状態に安全性が接続されていることです。 – Kos

+0

@Kosはtrueですが、fwriteはより良いインターフェースを提供します。 – stonemetal

関連する問題