【问题标题】:Strings to binary files字符串到二进制文件
【发布时间】:2016-08-30 21:39:54
【问题描述】:

我的问题是这样的:我有一个名为“注册”的类。它有一个名为“trainName”的字符串属性及其设置器:

class Register {

 private:
    string trainName;

 public:
    string getTrainName();
};

事实上,它更长,但我想让它更简单。

在其他类中,我将几个 Register 对象复制到一个二进制文件中,之前设置了 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));
}

它发生它不起作用。实际上,Register 确实有更多属性(它们是 int),我可以正常检索它们,但字符串并非如此。

我做错了吗?在处理二进制文件和字符串时我应该考虑什么?

非常感谢。

【问题讨论】:

    标签: c++ string file binary


    【解决方案1】:

    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] = '\0'; // NULL terminate the string
    Register auxRegister = Register();
    
    auxRegister.setName( buffer );
    

    【讨论】:

      【解决方案2】:

      你不能用这种方式编写字符串,因为它几乎肯定包含指向某些结构和其他根本无法序列化的二进制内容的指针。 你需要自己写序列化函数,写字符串长度+字节(例如)或者使用完整的库,例如protobuf,可以为你解决序列化问题。

      编辑:见普力夺的回答。比我的好得多(即使在此编辑时得分较低)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多