2

私は奇妙な方法でfreadまたはそれに似たものを使いたいと思っています。それが可能かどうかはわかりません... ケースを説明しましょう:

「ダミー」という名前のバイナリファイルがあります。このファイルには unsigned char 配列が含まれています。ただし、4x のメモリ空間を格納する float 配列にそれらを取り込みたいと考えています。

次のように目標を達成できます。

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;
}

私は(実際には実際には試していませんが)この方法がおそらくうまくいくことを知っています。しかし、それを行うためのより良い(より速い)方法があるかどうかに興味がありますか?たぶん、ループなしで..?

前もって感謝します、

言った。

4

3 に答える 3

2

この例は問題ないように見えます (ただし、一部のエラー チェックは適切である可能性があります)。考えられるパフォーマンスの改善の 1 つfreadは、ループの前に移動し、1000 個のエントリすべてを一度に (割り当てられた char 配列に) 読み取ることです。しかし、fread がバッファリングされるため、おそらくわずかに高速になるだけです。

于 2012-05-04T12:52:18.740 に答える
1

カフから:

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

マイナーニット:

  • C では、戻り値をキャストする必要はありません。malloc
  • #include適切なヘッダー
  • 成功したかどうかをテストfopenし、完了したらファイルを閉じます
  • floatarray一度完了した割り当てを解除する
于 2012-05-04T13:00:56.467 に答える
0

fread からの戻り値の EOF をチェックすると、余分なループが回避され、残りの floatArray がガベージでいっぱいになる可能性があります。

ファイルのサイズを取得することもできます

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

float 配列に割り当てるメモリを減らしたい場合

于 2012-05-04T12:55:43.110 に答える