C++ fwrite/fread用于结果为零的复杂数据类型数
我尝试了int、char和复杂数据类型的fwrite/fread。除了复杂之外,他们都工作得很好。实部和虚部的读取值均为零 代码:C++ fwrite/fread用于结果为零的复杂数据类型数,c++,fwrite,fread,complex-numbers,complex-data-types,C++,Fwrite,Fread,Complex Numbers,Complex Data Types,我尝试了int、char和复杂数据类型的fwrite/fread。除了复杂之外,他们都工作得很好。实部和虚部的读取值均为零 代码: int main() { typedef complex<float> cf; FILE *stream; stream = fopen("fread.out", "w+t"); unsigned int n1 = 6; char *c1 = "
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,以使这个示例正常工作
对于准备就绪的代码,应该选择更复杂的序列化技术,可能是现有解决方案之一。< / P>不要混合C和C++这样的方式。如果你想使用C++的特性,那么就充分利用它们。没有用于I/O的C函数。使用
std::fstream
每个fread
的返回值是否与预期一致?另外,c2
未初始化,因此strlen(c2)>=sizeof c2
可能为真,这是一个问题。您需要的是一个写入所有字节的固定长度字段(使用sizeof
,而不是strlen
),或者一种确定动态长度字段长度的方法(例如,在字符串之前写入长度,然后读取长度并使用它读取字符串)。typedef complex cf代码>逻辑上,您是否使用C,fwrite(c1,sizeof(char),strlen(c1),stream)代码>不写入nul终止字符。将字符串保存到二进制文件时,您还必须在写入字符串之前将长度写入文件,以便读取长度并知道后面有多少个字符。