您的位置:首页 > 其它

protobuf read/write multiple messages from/to a file

2013-03-05 10:12 453 查看
由于在protobuf论坛上发过相关问题,但,根据https://developers.google.com/protocol-buffers/docs/techniques提供的相关解决办法,自己测试下想再反馈给论坛,下面是测试过的,当想放到论坛时,好像那个问题已经关闭了。

其实和自定义一种数据结构没什么区别。

proto file中的定义是:

enum FileAction {

FILE_ACTION_ADD = 3;

FILE_ACTION_DEL = 2;

FILE_ACTION_MODIFY = 1;

FILE_ACTION_RENAME = 0;

}

message FileState {

required string name = 1; // file name

required FileAction state = 2; // file state

}

#include "GFileState.pb.h"
#include <fstream>
#include <string>
#include <iostream>
using std::string;
using std::fstream;
using std::cout;
int main(int argc,char* argv[])
{
string      fPath("message.txt");
string      strMsg;
char        buf[1024] = {0};
fstream     f;
int         size;
f.open(fPath.c_str(),std::ios_base::app | std::ios_base::binary);
FileState msg,msg2;
msg.set_name("D:\\Test1");
msg.set_state(FILE_ACTION_ADD);
msg.SerializeToString(&strMsg);
//msg.SerializePartialToString(&strMsg);
size        = strMsg.length();
f.write((char*)&size,sizeof(size));
f.write(strMsg.c_str(),size);
f.seekg(std::ios_base::end);

msg.set_name("/usr/home/nc/download");
msg.set_state(FILE_ACTION_MODIFY);
msg.SerializeToString(&strMsg);

size        = strMsg.length();
f.write((char*)&size,sizeof(size));
f.write(strMsg.c_str(),size);
f.close();

f.open(fPath.c_str(),std::ios_base::in | std::ios_base::binary);
f.seekg(std::ios_base::beg);
strMsg.clear();
size = 0;
while(!f.eof())
{
f.read((char*)&size,sizeof(size));
if(size > 0 && size < sizeof(buf))
{
f.read(buf,size);
msg.ParseFromString(buf);
cout<<"name:\t\t"<<msg.name()<<std::endl;
cout<<"state:\t\t"<<static_cast<int>(msg.state())<<std::endl;
}
msg.Clear();
memset(buf,'\0',sizeof(buf));
size = 0;
}
f.close();
std::cin >>strMsg;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: