gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:37:21 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com