c++ 读取protobuf
时间: 2023-09-02 09:11:45 浏览: 97
要在 C++ 中读取 protobuf,你需要按照以下步骤操作:
1. 定义 proto 文件并使用 protobuf 编译器将其编译为 C++ 代码。
2. 在你的 C++ 代码中包含生成的头文件。
3. 创建一个 protobuf 对象,并使用 `ParseFromFileDescriptor()` 或 `ParseFromIstream()` 函数从文件或流中读取 protobuf 数据。
以下是一个简单的示例:
1. 假设你有一个名为 `person.proto` 的 proto 文件,其中定义了一个 `Person` 消息类型:
```
syntax = "proto3";
message Person {
string name = 1;
int32 age = 2;
repeated string hobbies = 3;
}
```
2. 使用 protobuf 编译器将 `person.proto` 编译为 C++ 代码:
```
protoc person.proto --cpp_out=.
```
这将生成一个名为 `person.pb.h` 的头文件和一个名为 `person.pb.cc` 的源文件。
3. 在你的 C++ 代码中包含头文件,并使用 `ParseFromFileDescriptor()` 函数从文件中读取 protobuf 数据:
```c++
#include "person.pb.h"
#include <fstream>
#include <iostream>
int main() {
// 创建一个 Person 对象
Person person;
// 打开文件并将其读入 protobuf 对象
std::fstream input("person.dat", std::ios::in | std::ios::binary);
if (!input) {
std::cerr << "无法打开文件" << std::endl;
return -1;
}
if (!person.ParseFromIstream(&input)) {
std::cerr << "无法解析 protobuf 数据" << std::endl;
return -1;
}
// 输出 Person 对象的属性
std::cout << "姓名:" << person.name() << std::endl;
std::cout << "年龄:" << person.age() << std::endl;
std::cout << "爱好:";
for (const auto& hobby : person.hobbies()) {
std::cout << hobby << " ";
}
std::cout << std::endl;
return 0;
}
```
在上面的示例中,我们首先创建了一个 `Person` 对象,然后使用 `ParseFromIstream()` 函数从名为 `person.dat` 的文件中读取 protobuf 数据。最后,我们输出了 `Person` 对象的属性。
注意,在使用 `ParseFromIstream()` 函数时,必须通过引用传递一个 `std::istream` 对象的指针。如果解析成功,该函数将返回 true,否则返回 false。
阅读全文