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 以使该示例有效。
对于生产就绪代码,应该选择一种更复杂的序列化技术,可能是现有解决方案之一。
我已尝试 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 以使该示例有效。
对于生产就绪代码,应该选择一种更复杂的序列化技术,可能是现有解决方案之一。