zoukankan      html  css  js  c++  java
  • google protocol buffer试用

    http://code.google.com/p/protobuf/上下载protobuf-2.3.0,解压后,打开vsprojects文件夹,然后用VS2005打开protobuf开始编译,然后生成libprotobuf,libprotobuf-lite,libprotoc三个lib,同时生成了include文件夹。。。具体操作看vsprojects下面的readme文件来看。。。。

    之后新建一个记事本txt文件(book.txt)在里面写

    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 phone = 4;
    }
     
    message AddressBook {
     repeated Person person = 1;
    }

    然后在dos命令行下对该文件进行重命名:rename book.txt book.proto,然后在dos命令行下protoc.exe -I=. --cpp_out=. book.proto,就可以生成两个文件book.pb.cpp, book.pb.h。

    代码:(转载)

    void PromptForAddress(tutorial::Person* person);
    void ListPeople(const tutorial::AddressBook& addressbook);

    int AddPerson();
    int ViewPerson();

    int main()
    {

     AddPerson();
     ViewPerson();
     return 0;
    }

    void PromptForAddress(tutorial::Person* person)
    {
     std::cout <<"Enter person ID number: ";
     int id;
     std::cin>> id;
     person->set_id(id);
     std::cin.ignore(256, '/n');

     std::cout <<"Enter name: ";
     std::getline(std::cin, *person->mutable_name());

     std::cout <<"Enter email address (blank for none): ";
     std::string email;
     std::getline(std::cin, email);
     if (!email.empty())
      person->set_email(email);

     while (true)
     {
      std::cout <<"Enter a phone number (or leave blank to finish): ";
      std::string number;
      std::getline(std::cin, number);
      if (number.empty())
       break;

      tutorial::Person::PhoneNumber* phonenum = person->add_phone();
      phonenum->set_number(number);

      std::cout <<"Is it a mobile, home or work phone? ";
      std::string type;
      std::getline(std::cin, type);
      if ("mobile" == type)
       phonenum->set_type(tutorial::Person::MOBILE);
      else if ("home" == type)
       phonenum->set_type(tutorial::Person::HOME);
      else if ("work" == type)
       phonenum->set_type(tutorial::Person::WORK);
      else
       std::cout <<"Unknown phone type. Using default." <<std::endl;
     }
    }

    void ListPeople(const tutorial::AddressBook& addressbook)
    {
     for (int i = 0; i <addressbook.person_size(); i++)
     {
      const tutorial::Person& person = addressbook.person(i);
      std::cout <<"Person ID: " <<person.id() <<std::endl;
      std::cout <<"Name: " <<person.name() <<std::endl;
      if (person.has_email())
       std::cout <<"Email: " <<person.email() <<std::endl;

      for (int j = 0; j <person.phone_size(); j++)
      {
       const tutorial::Person::PhoneNumber& phonenum = person.phone(j);
       switch (phonenum.type())
       {
       case tutorial::Person::MOBILE:
        std::cout <<"Mobile phone #: ";
        break;
       case tutorial::Person::HOME:
        std::cout <<"Home phone #: ";
        break;
       case tutorial::Person::WORK:
        std::cout <<"Work phone #: ";
        break;
       }
       std::cout <<phonenum.number() <<std::endl;
      }
     }
    }

    int AddPerson()
    {
     tutorial::AddressBook addressbook;
     const std::string& filename = "addressbook";
     std::fstream input(filename.c_str(), ios::in | ios::binary);
     if (!input)
      std::cout <<filename <<": File not found. Creating a new file." <<std::endl;
     else if (!addressbook.ParseFromIstream(&input))
     {
      std::cerr <<"Failed to parse address book." <<std::endl;
      return -1;
     }
     PromptForAddress(addressbook.add_person());
     std::fstream output(filename.c_str(), ios::out | ios::trunc | ios::binary);
     if (!addressbook.SerializeToOstream(&output))
     {
      std::cerr <<"Failed to write address book." <<std::endl;
      return -1;
     }
     return 0;
    }

    int ViewPerson()
    {
     tutorial::AddressBook addressbook;
     const std::string& filename = "addressbook";
     std::fstream input(filename.c_str(), ios::in | ios::binary);
     if (!addressbook.ParseFromIstream(&input))
     {
      std::cerr <<"Failed to parse address book." <<std::endl;
      return -1;
     }
     ListPeople(addressbook);
     return 0;
    }

    注意:编译库的时候是使用的debug非release。。。

    把工程设置成:C C++;代码生成;多线程DLL(/MD)才行。

  • 相关阅读:
    uva 11294 Wedding
    uvalive 4452 The Ministers’ Major Mess
    uvalive 3211 Now Or Later
    uvalive 3713 Astronauts
    uvalive 4288 Cat Vs. Dog
    uvalive 3276 The Great Wall Game
    uva 1411 Ants
    uva 11383 Golden Tiger Claw
    uva 11419 SAM I AM
    uvalive 3415 Guardian Of Decency
  • 原文地址:https://www.cnblogs.com/kex1n/p/2286426.html
Copyright © 2011-2022 走看看