According to the example code https://developers.google.com/protocol-buffers/docs/cpptutorial , 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 removing the ios::binary
for my input file that is in text format, but that still fails at reading in the file. What do I need to do to read in a proto file in text format?
Alright, I got this figured out. To read in a text proto file into 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 in the input file for the proto buff as the first parameter when i execute it at the terminal. For example ./myProg inputFile.txt
Hope this helps anyone with the same question
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 full sample code, but TextFormat
is where you should be looking.
Just to summarize the essentials:
#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);
Checked with protobuf-3.0.0-beta-1
on g++ 4.9.2
on Linux.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.