Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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++ fwrite/fread用于结果为零的复杂数据类型数_C++_Fwrite_Fread_Complex Numbers_Complex Data Types - Fatal编程技术网

C++ 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、char和复杂数据类型的fwrite/fread。除了复杂之外,他们都工作得很好。实部和虚部的读取值均为零

代码:

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终止字符。将字符串保存到二进制文件时,您还必须在写入字符串之前将长度写入文件,以便读取长度并知道后面有多少个字符。