Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有更好的方法在C中读取复杂的二进制数据?_C_Stdio_Complex Numbers - Fatal编程技术网

有没有更好的方法在C中读取复杂的二进制数据?

有没有更好的方法在C中读取复杂的二进制数据?,c,stdio,complex-numbers,C,Stdio,Complex Numbers,我用C写了一些代码来读取包含复数的二进制文件。这很有效,但我对我需要表演的演员阵容感到不舒服。有更好的办法吗?在我的程序中,速度是关键的(我把代码从C++的iOFFROW转换成C STDIO函数,使执行时间加倍)。它也能变得更快吗 这是我的密码: #include<complex.h> #include<errno.h> #define spaceh 6912 #define Nc 3 #define dirac 4 ... ... typedef double

我用C写了一些代码来读取包含复数的二进制文件。这很有效,但我对我需要表演的演员阵容感到不舒服。有更好的办法吗?在我的程序中,速度是关键的(我把代码从C++的iOFFROW转换成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);
#包括
#包括
#定义空格6912
#定义Nc 3
#定义狄拉克4
...  ...
typedef双复数dcomplex;
长尺寸;
结果的大小;
字符文件名[84];
字符*缓冲区;
dcomplex*zbuff;
int i,j,k,srccol,srcdir;
srcdir=1;
srccol=2;
/*在堆上分配数组dcomplex QM[dirac][Nc][space]*/
sprintf(文件名,“//文件。%d.%d.bin”、srcdir、srccol);
文件*输入;
输入=fopen(文件名,“rb”);
如果(读取文件)
{
fseek(输入,0,搜索结束);
大小=ftell(输入);
倒带(输入);
缓冲区=(char*)malloc(sizeof(char)*大小);
if(buffer==NULL)
{
fputs(“缓冲区分配失败”,stderr);
出口(1);
}
结果=fread(缓冲区,1,大小,输入);
如果(结果!=大小)
{
fputs(“文件读取失败”,stderr);
出口(2);
}
/*我指的是演员阵容*/
zbuff=(dcomplex*)缓冲区;
}
其他的
{
printf(“文件未成功打开:%s\n”,strerror(errno));
}
计数=0;
for(k=0;k

convert_complex函数反转单个复数的字节顺序。我甚至对此感到不舒服,但我不希望我的问题变得太大。

直接声明zbuff,而不需要中间缓冲区。为此,您需要在适当的位置进行以下更改。在fread中,不是读取大小1,而是读取大小of(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”

不将缓冲区声明为
dcomplex*缓冲区的任何原因没有理由,可能是因为我最初收到了C++版本的建议,它使用了从char到一个dFix*的RealTytPype。也许在C版本中我应该直接做。谢谢你的建议,非常感谢。@Marty_McFly-如果它对你有用,别忘了“投票”我的答案并接受它。谢谢。答案被接受,但我认为他们禁用upvoting是为了鼓励我成为一个完全注册的用户!:)@Marty_McFly-我想这是因为你没有足够的“声誉”。请注意,
size
仍然是通过
ftell()
获得的,它以字节为单位给出大小,而不是以
sizeof(dcomplex)
为单位。