我正在尝试记录时间状态数据。
此状态数据每 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/