Есть ли лучший способ читать сложные двоичные данные в C? - PullRequest
2 голосов
/ 07 февраля 2011

Я написал некоторый код на C для чтения двоичного файла, содержащего комплексные числа.Это работает, но мне неудобно с актерами, которые мне нужно выполнить.Есть ли способ лучше?Скорость имеет решающее значение в моей программе (я удвоил время выполнения, изменив код с Cost iostreams на функции C stdio).Можно ли сделать это также быстрее?

Вот мой код:

#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 инвертирует порядок байтов одного комплексного числа.Мне это еще более неудобно, но я не хочу, чтобы мой вопрос стал слишком большим.

1 Ответ

2 голосов
/ 07 февраля 2011

Объявите zbuff напрямую, без необходимости промежуточного буфера. Для этого вам понадобятся следующие изменения в соответствующих местах. В fread вместо чтения размера 1 читайте sizeof (dcomplex). Это должно сделать это.

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

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

    /* The cast I'm referring to */
    //zbuff = (dcomplex*)buffer;

    .......

    free(zbuff);

Заменить все вхождения 'buffer' на 'zbuff'.

...