c从/到二进制文件读/写类
作者:互联网
我需要写一个类到二进制文件,然后我需要读回来.
我有Triangle和BinaryFile类,以及其他一些类.我不确定我写错了还是读错了.读取时发生错误.调试后,我认为它为我的私有变量获取了不适当的数据.如果有人能就如何使其正常工作给我一些建议,我将非常高兴.
我不确定是否应该粘贴整个代码,所以我会给你一小段代码.以防万一,这是我的源代码的下载链接:
https://my.pcloud.com/publink/show?code=XZJ7CYZbsLWLglqV5p83csijcEUTFqqpM3k
我是编程的新手,我不会说英语,所以我提前为我的错误道歉.
class Point
{
private:
int x;
int y;
};
class Figure
{
private:
string name;
string type;
};
class Triangle: public Figure
{
private:
Point p1, p2, p3;
};
class BinaryFile
{
private:
string FileName;
fstream File;
public:
//...
void AddNewFigure(istream& stream)
{
File.open(this->FileName, ios::binary | ios::app);
if(!this->File)
{
cerr<<"File error <"<<this->FileName<<">\n";
exit(1);
}
Triangle fig;
fig.MakeNewFigure(stream);
File.write((char*)&fig, sizeof(Triangle));
File.close();
}
Triangle GetTriangle()
{
Triangle trig;
Point p;
string str(""); int x(0);
File.open(this->FileName, ios::binary | ios::in);
if(!this->File)
{
cerr<<"File error <"<<this->FileName<<">\n";
exit(1);
}
File.read((char*)&trig, sizeof(Triangle));
File.close();
return trig;
}
};
解决方法:
由于您的源代码较大且数据文件丢失,因此重现错误并不容易.但快速检查显示您使用bloc操作读取和写入二进制数据:
Triangle trig;
...
File.read((char*)&trig, sizeof(Triangle));
不幸的是,只有当您要保存/加载的对象是一个类为trivially copyable的类时,这种方法才有效,如下面的代码所示:
if (is_trivially_copyable<Triangle>::value)
cout << "Triangle is trivially copyable" << endl;
else cout << "Triangle is not trivially copyable" << endl;
因此,您必须按字段序列化对象内容写入字段,而不是使用bloc操作.这个FAQ on serialization应该可以帮助您考虑替代方案.
标签:c,serialization,binaryfiles 来源: https://codeday.me/bug/20190926/1820261.html