2012-05-04 6 views
2

私はフリーダイヤルまたはそれに類する方法で使いたいです。私はそれが可能であるかどうかわからない...私はケースを説明してみましょう:フリーダの代替使用

私は「ダミー」という名前のバイナリファイルを、持っています。このファイルには、unsigned char配列が含まれています。しかし、私はそれらを4倍のメモリ空間を格納する浮動小数点配列に入れたいと思っています。

私は、次のように私の目標を達成することができます

FILE* in_file; 
int numberOfCharacters = 1000; // number of unsigned characters to read ... 
in_file = fopen("dummy", "rb"); 

float* floatArray = (float*) malloc(numberOfCharacters * sizeof(float)); 

for(int i=0;i<numberOfCharacters;i++) 
{ 
    unsigned char temp; 
    fread(&temp, sizeof(unsigned char), 1, in_file); 
    floatArray[i] = temp; 
} 

私は(実際には本当にしようとしなかった)この方法はおそらく動作します知っています。しかし、私はそれがより良い(より速い)方法であるかどうかは不思議です。たぶん、ループなしで..?

ありがとうございます。

Sait

+2

何が奇妙ですか?btw:Cの質問のようです。 – BigMike

+0

endiannessがバイナリファイルのソースと宛先(読み込み先)と一致せず、書き込み/読み取りプロセスが気にしない場合は、問題に遭遇する可能性がありますその。 – dirkgently

+0

私が持っている符号なし文字配列の長さは少し大きいです。だから、どんな改善も非常に役に立ちます。 – Sait

答えて

2

この例は問題なく表示されていますが(エラーチェックが有効な場合もあります)ループの前にfreadを移動して、すべての1000個のエントリを一度に(割り当てられたchar配列に)読み込むと、パフォーマンスが向上する可能性があります。しかし、freadはバッファリングされているので、おそらくわずかに速いでしょう。

+1

フレッドを指摘するための+1はバッファリングされる可能性が高い – Nick

+0

@マーク・ウィルキンス:この興味深い考えに感謝します。試してみる価値のある音... – Sait

0

あなたがしたい場合にも

fseek (in_file, 0, SEEK_END); 
size=ftell (in_file); 

とファイルのサイズを取得することができ、余分なループを回避しますEOFのためにfreadからの戻り値をチェックし、おそらくゴミ

でfloatArrayの残りの部分を埋めますカフオフfloat配列

1

ために、より少ないメモリを割り当てる:

  • エンディアンがバイナリファイルのソースと宛先(読み込み先)の間で一致せず、書き込み/読み取りプロセスでエンディアンが処理されない場合は、問題が発生する可能性があります。
  • ファイルのバッファリングモードを設定するには、setvbufを参照してください。
  • ます。また、これはfstream(ファイルストリーム)を使用して、C++ではるかに簡単である
  • mmap)メモリマップファイルを見てみたいことがありとイテレータ(即ち、構文的に)。さらに、パフォーマンスが必要な場合は、適切なメンバーをオーバーライドして、独自の最適化されたファイルストリームを作成できます。さらに読書のために
  • filtering streambufsすぎ

マイナーニット見上げる:Cで

  • を、あなたはmalloc
  • #include適切なヘッダ
  • テストの戻り値をキャストする必要はありませんfopenが成功した場合は、完了したファイルを閉じる。
  • の割り当てを解除するonce done完了