c++ - 使用 iostream 进行数据序列化

标签 c++ serialization

我正在尝试记录时间状态数据。 此状态数据每 8 毫秒从机器人发送一次。 所以我想把完整的状态数据记录到一个文件中(state.bin)。

我想序列化向文件写入/读取状态数据。 而且我发现写作一切都很好。

但是当从文件中读取时,文件很可能被读取到文件末尾。

我尝试了 while(!in.eof())while(in) 检查文件结尾。 但都失败了。

我该如何解决这个问题?

谢谢。

序列化类

class RobotState
{
public:
   RobotState()
   {

   }

   void printState(std::ostream& stream)
   {
       //Intended for console output
   }

   double time;
   int32_t mode;
   double q[2];
   std::string err_msg;
   friend std::ostream& operator<<( std::ostream& stream, const RobotState& rs );
   friend std::istream& operator>>( std::istream &stream,  RobotState& rs );
};

序列化/反序列化

// write to the stream
std::ostream& operator<<( std::ostream &stream,  const RobotState& rs )
{
    stream.write((char*)&rs.time, sizeof(rs.time));
    stream.write((char*)&rs.mode, sizeof(rs.mode));
    stream.write((char*)rs.q, sizeof(rs.q[0])*2);

    //serialize string
    int32_t sz_err_msg = rs.err_msg.size();
    stream.write((char*)&sz_err_msg, sizeof(sz_err_msg));
    stream.write(rs.err_msg.c_str(), sz_err_msg);

    return stream;
}

// read from the stream
std::istream& operator>>( std::istream &stream,  RobotState& rs )
{
    stream.read((char*)&rs.time, sizeof(rs.time));
    stream.read((char*)&rs.mode, sizeof(rs.mode));
    stream.read((char*)rs.q, sizeof(rs.q[0])*2);
    int32_t sz_err_msg; 
    stream.read((char*)&sz_err_msg, sizeof(sz_err_msg));
    char buffer[100];
    stream.read(buffer, sz_err_msg);
    buffer[sz_err_msg] = 0;
    rs.err_msg = buffer;

    return stream;
}

主要代码

int main(void)
{
   RobotState rs_data;

   /******************Serializing************************/
   std::ofstream out;
   out.open( "robotstate.bin", 
std::ios::out | std::ios::trunc | std::ios::binary );
   //Serialize data with contrived state data
   out.close();

    /******************Deserializing************************/
   std::fstream in;
   in.open("robotstate.bin", std::ios::in | std::ios::binary);
   while(in)
   {
       in >> rs_data;
       rs_data.printState(std::cout);
   }
}

最佳答案

这可能无法解决您遇到的问题,但是......

你应该改变

while(in)
{
    in >> rs_data;
    rs_data.printState(std::cout);
}

while(in >> rs_data)
{
    rs_data.printState(std::cout);
}

这确保您仅在读取成功时调用 printState

关于c++ - 使用 iostream 进行数据序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31751443/

相关文章:

c++ - 为什么我的 VS2010 native C++ 应用程序不会突然启动,并给出并排错误?

java - 未序列化的 Arraylist 始终为空

java - 如何在 BouncyCaSTLe 中序列化 PKCS10CertificationRequest 以通过网络发送?

json - 带有 POJO 类而不是接口(interface)的 GWT AutoBean

mysql - 如何将队列和堆栈持久化到数据库

.net - "Type not expected",使用 DataContractSerializer - 但它只是一个简单的类,没有什么有趣的东西?

c++ - 转换为 char* C++ 后丢失字符串数据

c++ - realloc() 上的堆已损坏

c++ - 理解第 nth_element

c++ - c/c++ 相对包含路径与 Makefile 包含标志