【发布时间】:2014-05-17 21:26:15
【问题描述】:
我是 Protocol Buffers 和 c++ 的新手,但我的任务要求我使用这两者。我想多次将数据结构(消息)写入单个文件并能够读取数据。我可以读取和写入一条消息,但事实证明多条消息更难。我已经寻找了几个小时的答案,但我似乎无法将数据作为结构读取。任何示例代码或指针都会很有帮助。
这是我的结构的格式:
typedef struct Entry
{
char name[ NAME_MAX];
int id;
int age;
char DoB[32];
} entry;
这是我一直用来写入文件的内容:
Person_File file;
fstream output("file", ios::out | ios::trunc | ios::binary);
file.SerializeToOstream(&output);
我尝试将文件编辑选项更改为追加而不是截断,但这不允许我以我想要的格式读取数据。
这是我用来阅读的:
fstream input("file", ios::in | ios::binary);
file.ParseFromIstream(&input);
这些是我的 .proto 文件的内容:
message Person {
message File {
required string pname =1;
required int32 id =2;
required int32 age =3;
required string DoB =4;
}
repeated File file =1;
}
从我所做的所有搜索来看,CodedInputStream/CodedOutputStream 似乎是我最好的选择,但我无法找到任何详细的示例或解释来帮助我理解。我知道协议缓冲区不是自定界的,这可能是我无法以原始格式读回消息的原因。 任何帮助,将不胜感激。谢谢
编辑: 我尝试根据收到的消息使用 CodedOutputStream,但它似乎没有将任何内容写入文件。
int fd = open("file.txt",O_WRONLY | O_APPEND | O_CREAT);
FileOutputStream* file_ostream_ = new FileOutputStream(fd);
CodedOutputStream* ostream_ = new CodedOutputStream(file_ostream_);
ostream_->WriteLittleEndian32(file.ByteSize());
file.SerializeToCodedStream(ostream_);
使用此代码后,文件变为空白。我哪里错了?
【问题讨论】:
-
file变量的定义在哪里? -
我不了解协议缓冲区库,但我知道您可以使用
std::fstream.write使用sizeof(Entry)将Entry写入文件并使用std::fstream.read将其读回。这是一个POD结构。它不应该需要任何特殊的库 imo.. -
我已经添加了文件的定义
-
最简单的方法是在消息前写上size;看看stackoverflow.com/questions/5586323/… 和developers.google.com/protocol-buffers/docs/…
标签: c++ structure protocol-buffers