我正在处理一个包含文件的项目。 该项目的第1部分是添加/删除并将一些obejct排序到文本文件中,所以我已经实现了这些功能。 现在,第2部分也支持二进制文件 - 添加/删除和排序二进制文件的方法。 我的想法是有一些“魔术函数”将二进制文件转换为文本文件,而不是使用上面的函数(因为它们只支持文本文件),做任何要求 - 添加\删除obejcts;比从文本文件到二进制文件的“魔术功能”再次转换它。 我的文本文件中的每一行都是一个名为'Candidate'的对象。它包含以下字段:字符串ID,字符串名称,字符串姓氏,字符串方 例如,第一行看起来像: 201,唐纳德,特普,共和 有什么建议在哪里找到这个“神奇的功能”? 谢谢你提前。
答案 0 :(得分:0)
没有一种在文本和二进制数据之间进行转换的通用方法,因为您需要知道数据意味着什么,这一点并不清楚,特别是在二进制数据的情况下。
您的班级已经知道您的数据意味着什么,因此只有您的班级可以将自己可靠地读作文本并将其自身写为二进制,反之亦然。但是,一旦你在课堂上实现了文本或二进制的阅读和写作,转换的需求就会消失。
我很确定在你的课堂上实现阅读和写作文本或二进制文件是你首先被要求做的事情。
您的课程仅包含std::string
个。没有标准的方法将它们写成二进制文件,但一种方法是首先编写长度,然后编写内容:
void WriteString(const std::string& s, std::ofstream& os)
{
size_t size = s.size();
os.write(reinterpret_cast<char*>(&size), sizeof(size_t));
os.write(s.c_str(), size);
}
阅读的逆过程意味着先读取长度,然后再读取内容。您无法直接将内容读入std::string
,因为其内存缓冲区不保证是连续的,因此您需要使用std::vector<char>
作为中介:
std::string ReadString(std::ifstream& is)
{
size_t size;
is.read(reinterpret_cast<char*>(&size), sizeof(size_t));
std::vector<char> buffer(size);
is.read(&buffer[0], size);
return std::string(&buffer[0], size);
}
现在以二进制形式写入或读取Candidate
个对象,您只需要使用这两个函数一次写入或读取一个字段:
void Candidate::Write(std::ofstream& os) const
{
WriteString(id, os);
WriteString(name, os);
WriteString(last_name, os);
WriteString(party, os);
}
void Candidate::Read(std::ifstream& is)
{
id = ReadString(is);
name = ReadString(is);
last_name = ReadString(is);
party = ReadString(is);
}
你需要一个Candidate
类的默认构造函数来创建“空”对象以供阅读,你可能想要在文件顶部写下候选者的数量,这样你就知道读了多少回来。
二进制文件还有很多东西 - 你可能想要实现随机访问以获得好处 - 但这应该让你开始。