Text File Analysis for Google Protocol Buffer

According to the https://developers.google.com/protocol-buffers/docs/cpptutorial code example, they show how to parse in a proto file that is in binary format. using

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; } } 

I tried to remove ios::binary for my input file, which is in text format, but this still cannot be read in the file. What do I need to do to read in a proto file in text format?

+7
source share
3 answers

Ok, I figured it out. Read in a text proto file to an object ....

 #include <iostream> #include <fcntl.h> #include <fstream> #include <google/protobuf/text_format.h> #include <google/protobuf/io/zero_copy_stream_impl.h> #include "YourProtoFile.pb.h" using namespace std; 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; Tasking *tasking = new Tasking(); //My protobuf object bool retValue = false; int fileDescriptor = open(argv[1], O_RDONLY); if( fileDescriptor < 0 ) { std::cerr << " Error opening the file " << std::endl; return false; } google::protobuf::io::FileInputStream fileInput(fileDescriptor); fileInput.SetCloseOnDelete( true ); if (!google::protobuf::TextFormat::Parse(&fileInput, tasking)) { cerr << std::endl << "Failed to parse file!" << endl; return -1; } else { retValue = true; cerr << "Read Input File - " << argv[1] << endl; } cerr << "Id -" << tasking->taskid() << endl; } 

My program takes the input file for proto buff as the first parameter when I execute it on the terminal. For example ./myProg inputFile.txt

Hope this helps anyone who has the same question

+12
source

What do I need to do to read in a proto file in text format?

Use TextFormat :: Parse . I don't know enough C ++ to give you a complete code sample, but TextFormat is where you should look.

+3
source

Just to summarize:

 #include <google/protobuf/text_format.h> #include <google/protobuf/io/zero_copy_stream_impl.h> #include <fcntl.h> using namespace google::protobuf; 

(...)

 MyMessage parsed; int fd = open(textFileName, O_RDONLY); io::FileInputStream fstream(fd); TextFormat::Parse(&fstream, &parsed); 

Tested with protobuf-3.0.0-beta-1 on g++ 4.9.2 on Linux.

0
source

All Articles