2011-02-06 4 views
2

私は、複素数を含むバイナリファイルを読むためにC言語でいくつかのコードを書いています。それは動作しますが、私は実行する必要があるキャストに不快です。より良い方法がありますか?私のプログラムではスピードが重要です(私はC++のiostreamからCのstdio関数にコードを変更することによって実行時間を2倍にしました)。もっと速くすることもできますか?Cで複雑なバイナリデータを読み取るには、より良い方法がありますか?

#include<complex.h> 
#include<errno.h> 

#define spaceh 6912 
#define Nc 3 
#define dirac 4 

... ... 

typedef double complex dcomplex; 

long size; 
size_t result; 

char filename[84]; 
char* buffer; 
dcomplex* zbuff; 

int i, j, k, srccol, srcdir; 
srcdir = 1; 
srccol = 2; 

/* allocate array dcomplex QM[dirac][Nc][space] on the heap */ 

sprintf(filename, "/<path>/file.%d.%d.bin", srcdir, srccol); 

FILE* input; 
input = fopen(filename, "rb"); 

if(readfile) 
{ 
    fseek(input, 0, SEEK_END); 
    size = ftell(input); 
    rewind(input); 

    buffer = (char*)malloc(sizeof(char)*size); 
    if(buffer == NULL) 
    { 
     fputs("Buffer allocation failed.", stderr); 
     exit(1); 
    } 

    result = fread(buffer, 1, size, input); 
    if(result != size) 
    { 
     fputs("File reading failed.", stderr); 
     exit(2); 
    } 

    /* The cast I'm referring to */ 
    zbuff = (dcomplex*)buffer; 
} 
else 
{ 
    printf("File was not successfully opened: %s\n", strerror(errno)); 
} 

count = 0; 
for(k = 0; k < space; k++) 
{ 
    for(j = 0; j < Nc; j++) 
    { 
     for(i = 0; i < dirac; i++) 
     { 
      QM[i][j][k] = convert_complex(zbuff(count)); 
      count++; 
     } 
    } 
} 

free(buffer); 
fclose(input); 

convert_complex機能は、単一の複素数のバイト順序を逆:

は、ここに私のコードです。私はそれをさらに不快にしていますが、私の質問が大きすぎるようにはしたくありません。

+0

バッファを 'dcomplex * buffer;'として宣言していない理由 – Neo

+0

おそらく私が最初にchar *からdcomplex *へのreinterpret_castを使ったC++バージョンのアドバイスを受け取ったためです。おそらく、Cバージョンでは私はそれを直接行っていたはずです。 –

答えて

2

中間バッファを必要とせずにzbuffを直接宣言します。そのためには、適切な場所に以下の変更が必要です。 freadでは、サイズ1を読み込む代わりに、sizeof(dcomplex)を読み込みます。これはそれを行う必要があります。

「バッファ」のすべての箇所を「zbuff」に置き換えます。

+0

あなたのアドバイスありがとう、ありがとうございました。 –

+0

@ Marty_McFly - あなたのために働く場合、私の答えをアップアップし、それを受け入れることを忘れないでください。ありがとう。 – Neo

+0

回答は受け入れられましたが、私は彼らが完全に登録されたユーザーになることを奨励するためにupvotingを無効にすると思います! :) –

関連する問題