私は、複素数を含むバイナリファイルを読むために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機能は、単一の複素数のバイト順序を逆:
は、ここに私のコードです。私はそれをさらに不快にしていますが、私の質問が大きすぎるようにはしたくありません。
バッファを 'dcomplex * buffer;'として宣言していない理由 – Neo
おそらく私が最初にchar *からdcomplex *へのreinterpret_castを使ったC++バージョンのアドバイスを受け取ったためです。おそらく、Cバージョンでは私はそれを直接行っていたはずです。 –