protobuf: 通讯录2.1
先引入需要知道的proto3语法:
1.proto3
1.hexdump
作用:
hexdump:是Linux下的⼀个⼆进制⽂件查看⼯具,它可以将⼆进制⽂件转换为ASCII、⼋进制、
⼗进制、⼗六进制格式进⾏查看。
-C: 表⽰每个字节显⽰为16进制和相应的ASCII字符
2.decode
作用:
读二进制的信息并以文本形式打印到 标准输出
格式: protoc --decode=消息类型.package命名 消息所在文件 < contacts.bin(本来是从标准输入中读,现在加上< 就到contacts.bin中读)
3.enum
注意格式和c/c++不同,定义时后面是 ";"
注意:同级的枚举类型,常量名不能相同!!! 否则会报错
与 import 其他的.proto文件中的enum枚举类型中的常量值相同也会报错,除非import 的.proto文件有package包住
3.通讯录2.1
contacts.proto
syntax = "proto3";
package contacts;
message People
{
string name = 1;
int32 age = 2;
//里面是电话的字段和类型
message Phone
{
string num = 1;
enum PhoneType
{
MP = 0; // 移动电话
TEL = 1; // 固定电话
}
PhoneType type = 2;
}
//repeated 表示重复 相当于定义一个数组 里面全是Phone
repeated Phone phone = 3;
}
message Contacts
{
repeated People person = 1;
}
write.cc(只展示新增部分)
for(int i = 0;;i++)
{
std::cout << "请输入联系人的电话: " << i+1 << "(只输入回车完成电话新增): ";
std::string number;
getline(std::cin,number);
if(number.empty())
break;
//接收add_phone返回的phone对象
contacts::People_Phone* phone = person->add_phone();
phone->set_num(number);
std::cout << "请输入联系人的电话类型:(0.移动电话, 1.固定电话): ";
int type;
std::cin >> type;
std::cin.ignore(256,'\n');
switch(type)
{
case 0:
phone->set_type(contacts::People_Phone_PhoneType::People_Phone_PhoneType_MP);
break;
case 1:
phone->set_type(contacts::People_Phone_PhoneType::People_Phone_PhoneType_TEL);
break;
default:
std::cout << "输入有误, 请重新根据提示输入" << std::endl;
break;
}
}
std::cout << "--------------添加联系人成功--------------" << std::endl;
}
read.cc(只展示新增部分)
for(int j = 0;j<person.phone_size();j++)
{
const contacts::People_Phone phone = person.phone(j);
std::cout << "联系人电话" << j+1 << ": "<< phone.num() << " ";
std::cout << "电话类型" << ": ("<< People_Phone_PhoneType_Name(phone.type()) << ")" << std::endl;
}