字符串到二进制文件
Strings to binary files
我的问题是这样的:我有一个名为"Register"的类。它有一个名为"trainName"的字符串属性及其setter:
class Register {
private:
string trainName;
public:
string getTrainName();
};
事实上,它更长,但我想让它更简单。
在其他类中,我将几个寄存器对象复制到一个二进制文件中,之前设置 trainName。
Register auxRegister = Register();
auxRegister.setName("name");
for(int i = 0; i < 10; i++) {
file.write(reinterpret_cast<char*>(&auxRegister),sizeof(Register));
}
稍后,我尝试从二进制文件中检索寄存器:
Register auxRegister = Register();
while(!file.eof()) { //I kwnow this is not right. Which is the right way?
file.read(reinterpret_cast<char*>(&auxRegister), sizeof(Register));
}
它发生它不起作用。事实上,寄存器确实有更多的属性(它们是 int),我可以正常检索它们,但字符串并非如此。
我做错了什么吗?在处理二进制文件和字符串时,我应该考虑一些事情吗?
谢谢。
std::string
类包含一个指向存储字符串的缓冲区的指针(以及其他成员变量)。字符串缓冲区本身不是类的一部分。因此,写出类实例的内容是行不通的,因为如果你这样做,字符串永远不会成为你转储到文件中的一部分。你需要获取一个指向字符串的指针并写入它。
Register auxRegister = Register();
auxRegister.setName("name");
auto length = auxRegister.size();
for(int i = 0; i < 10; i++) {
file.write( auxRegister.c_str(), length );
// You'll need to multiply length by sizeof(CharType) if you
// use a wstring instead of string
}
稍后,要读取字符串,您必须跟踪写入文件的字节数;或者可能从文件本身获取该信息,具体取决于文件格式。
std::unique_ptr<char[]> buffer( new char[length + 1] );
file.read( buffer, length );
buffer[length] = ' '; // NULL terminate the string
Register auxRegister = Register();
auxRegister.setName( buffer );
你不能以这种方式编写字符串,因为它几乎肯定包含指向一些结构和其他根本无法序列化的二进制内容的指针。你需要编写自己的序列化函数,并写入字符串长度+字节(例如)或使用完整的库,例如protobuf,可以为您解决序列化问题。
编辑:参见 Praetorian 的答案。 比我的好得多(即使在这次编辑时得分较低)。
相关文章:
- 如何从二进制文件中读取字符串
- 将位字符串转储到二进制文件的最佳方法是什么
- 如何检查二进制文件中是否存在字符串
- 将大型二进制字符串写入二进制文件
- 如何在 c++ 中将二进制文件读取为字符串
- 在C++中使用 fread 从二进制文件中读取字符串及其长度
- C++实现代码中的字符串不应存在于输出二进制文件中.如何解决
- 无法使用 fstream 从二进制文件中读取字符串,而是显示奇怪的符号
- C 字符串到C char数组,以写入二进制文件
- 将"8 bit"(字节)字符串写入二进制文件?
- 我正在尝试读取一个包含字符串和整数的二进制文件..并打印出与字符串对应的整数
- 从二进制文件 C++ 读取的字符串数组写入
- 如何在 c++ 中使用二进制文件输入/输出读取/写入结构的字符串类型成员
- 将从二进制文件读取的字符串转换为整数
- 将 int 的二进制文件读取到字符串 c++
- 在二进制文件中读取字符串C
- C/C++ 读取具有多个字符串和字符的二进制文件
- 调试读/写字符串到二进制文件
- 如何用C++递归地从二进制文件中读取自定义字符串
- 将二进制字符串写入二进制文件