fwrite/fread 对于复杂数据类型数字,结果为零

fwrite/fread for complex datatype numbers giving zero as result

我已尝试 fwrite/fread 处理 int、char 和复杂数据类型。除了复杂之外,它们都运作良好。实部和虚部的读取值都为零。

代码:

int main()
{
    typedef complex<float> cf;
    
    FILE *stream;
    stream = fopen("fread.out", "w+t");
    
    unsigned int n1 = 6;
    char *c1 = "this is a test";   
    cf cp1{2.0, 3.0};
    
    fwrite(&n1, sizeof(unsigned int), 1, stream);
    fwrite(c1, sizeof(char), strlen(c1), stream);
    fwrite(&cp1, sizeof(cf), 1, stream);
    fclose(stream);
    
    stream = fopen("fread.out", "r+t");
    unsigned int n2;
    char c2[20];
    cf cp2;
    
    fread(&n2, sizeof(unsigned int), 1, stream);
    fread(&c2, sizeof(char), strlen(c2), stream);
    fread(&cp2, sizeof(cf), 1, stream);
    
    fclose(stream);   
    return 0;
}

输出:

n2 = 6,c2 = this is a test, cp2 = 0.000000 + i*0.000000

你这里有问题:

 fread(&c2, sizeof(char), strlen(c2), stream);

strlen(c2) 给你垃圾,因为 c2 没有初始化。 您应该在此 strlen 函数中将 c2 更改为 c1 以使该示例有效。

对于生产就绪代码,应该选择一种更复杂的序列化技术,可能是现有解决方案之一。