zoukankan      html  css  js  c++  java
  • protobuf在c++的使用方法以及在linux安装

     
    https://blog.csdn.net/wangyin668/article/details/80046798






    https://www.cnblogs.com/zhouyang209117/p/7218719.html




    https://blog.csdn.net/zmzsoftware/article/details/17356199
    自己云服务器上有demo learing/Protobuf //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, '
    ');//忽略最后的回车
    
        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
  • 相关阅读:
    python 一个二维数组和一个整数,判断数组中是否含有该整数
    DDD 全称 “Domain-Driven Design”,领域驱动设计
    pytest + allure 生成测试报告
    AttributeError: module 'pytest' has no attribute 'allure'
    BDD的概念
    在im4java中使用GraphicsMagick
    缓存穿透与缓存雪崩
    Linux安装ImageMagick与JMagick完成过程及配置
    Windows/Linux下引用jar包,并用javac/java编译运行
    在CentOS4上安装JMagick
  • 原文地址:https://www.cnblogs.com/zhangkele/p/10280190.html
Copyright © 2011-2022 走看看