protobuf在c++的使用方法以及在linux安装

匿名 (未验证) 提交于 2019-12-02 21:53:52
https://www.cnblogs.com/zhouyang209117/p/7218719.html      //SRC_DIR     .proto文件存放目录    //--cpp_out   指示编译器生成C++代码,DST_DIR为生成文件存放目录    //XXXX.proto  待编译的协议文件    protoc  -I=$SRC_DIR  --cpp_out=$DST_DIR $SRC_DIR/XXXX.proto 

  

syntax = "proto2"; package tutorial; message Person {     required string name = 1;     required int32 id = 2;     optional string email = 3;     enum PhoneType {         MOBILE = 0;         HOME = 1;         WORK = 2;     }     message PhoneNumber {         required string number = 1;         optional PhoneType type = 2 [default = HOME];     }     repeated PhoneNumber phones = 4; } message AddressBook {     repeated Person people = 1; }

 把proto文件转化成c++代码.执行下面命令.

protoc --cpp_out=. addressbook.proto   

#include <iostream> #include <fstream> #include <string> #include "addressbook.pb.h" using namespace std; // This function fills in a Person message based on user input. void PromptForAddress(tutorial::Person *person) {     cout << "Enter person ID number: ";     int id;     cin >> id;     person->set_id(id);     cin.ignore(256, '\n');//忽略最后的回车      cout << "Enter name: ";     getline(cin, *person->mutable_name());      cout << "Enter email address (blank for none): ";     string email;     getline(cin, email);     if (!email.empty()) {         person->set_email(email);     }     while (true) {         cout << "Enter a phone number (or leave blank to finish): ";         string number;         getline(cin, number);         if (number.empty()) {             break;         }         tutorial::Person::PhoneNumber *phone_number = person->add_phones();         phone_number->set_number(number);         cout << "Is this a mobile, home, or work phone? ";         string type;         getline(cin, type);         if (type == "mobile") {             phone_number->set_type(tutorial::Person::MOBILE);         } else if (type == "home") {             phone_number->set_type(tutorial::Person::HOME);         } else if (type == "work") {             phone_number->set_type(tutorial::Person::WORK);         } else {             cout << "Unknown phone type.  Using default." << endl;         }     } } // Main function:  Reads the entire address book from a file, //   adds one person based on user input, then writes it back out to the same //   file. int main(int argc, char *argv[]) {     // Verify that the version of the library that we linked against is     // compatible with the version of the headers we compiled against.     GOOGLE_PROTOBUF_VERIFY_VERSION;     if (argc != 2) {         cerr << "Usage:  " << argv[0] << " ADDRESS_BOOK_FILE" << endl;         return -1;     }     tutorial::AddressBook address_book;     {         // Read the existing address book.         fstream input(argv[1], ios::in | ios::binary);         if (!input) {             cout << argv[1] << ": File not found.  Creating a new file." << endl;         } else if (!address_book.ParseFromIstream(&input)) {             cerr << "Failed to parse address book." << endl;             return -1;         }     }     // Add an address.     PromptForAddress(address_book.add_people());     {         // Write the new address book back to disk.         fstream output(argv[1], ios::out | ios::trunc | ios::binary);         if (!address_book.SerializeToOstream(&output)) {             cerr << "Failed to write address book." << endl;             return -1;         }     }     // Optional:  Delete all global objects allocated by libprotobuf.     google::protobuf::ShutdownProtobufLibrary();     return 0; }

#include <iostream> #include <fstream> #include <string> #include "addressbook.pb.h" using namespace std; // Iterates though all people in the AddressBook and prints info about them. void ListPeople(const tutorial::AddressBook &address_book) {     for (int i = 0; i < address_book.people_size(); i++) {         const tutorial::Person &person = address_book.people(i);         cout << "Person ID: " << person.id() << endl;         cout << "  Name: " << person.name() << endl;         if (person.has_email()) {             cout << "  E-mail address: " << person.email() << endl;         }         for (int j = 0; j < person.phones_size(); j++) {             const tutorial::Person::PhoneNumber &phone_number = person.phones(j);             switch (phone_number.type()) {                 case tutorial::Person::MOBILE:                     cout << "  Mobile phone #: ";                     break;                 case tutorial::Person::HOME:                     cout << "  Home phone #: ";                     break;                 case tutorial::Person::WORK:                     cout << "  Work phone #: ";                     break;             }             cout << phone_number.number() << endl;         }     } } // Main function:  Reads the entire address book from a file and prints all //   the information inside. int main(int argc, char *argv[]) {     // Verify that the version of the library that we linked against is     // compatible with the version of the headers we compiled against.     GOOGLE_PROTOBUF_VERIFY_VERSION;     if (argc != 2) {         cerr << "Usage:  " << argv[0] << " ADDRESS_BOOK_FILE" << endl;         return -1;     }     tutorial::AddressBook address_book;     {         // Read the existing address book.         fstream input(argv[1], ios::in | ios::binary);         if (!address_book.ParseFromIstream(&input)) {             cerr << "Failed to parse address book." << endl;             return -1;         }     }     ListPeople(address_book);     // Optional:  Delete all global objects allocated by libprotobuf.     google::protobuf::ShutdownProtobufLibrary();     return 0; }

g++ addressbook.pb.cc   read_data.cpp   -o  read.out     -lprotobuf g++ addressbook.pb.cc   write_data.cpp  -o  write.out    -lprotobuf

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!