[protobuf] Problem with C++ -writing multiple messages with a repeated field to a file

2011-05-13 Thread Nigel Pickard
I'm having a problem writing multiple messages to a file and reading
them back in c++ using GPB 2.3.0.  What I'm trying to do:

I have a GPB generated object that contains a repeated field, e.g.
myobject.proto is:

message MyObject {
required uint64 x =1;
required uint32 y =2;
repeated uint32 z =3 [packed = true];
}

I am taking the object, populating it with some random data and
writing it to a file with the name filename.  E.g. for method
populateMyObject I have:

void populateMyObject(const char * filename){
google::protobuf::uint64 x;
google::protobuf::uint32 y;
google::protobuf::uint32 z;

//open file for writing
int fd = open(filename, O_CREAT | O_TRUNC | O_RDWR, S_IREAD |
S_IWRITE);

//create codedoutputstream
FileOutputStream output(fd);
CodedOutputStream codedOutput(output);

//create 5 objects with dummy data
for (int i = 0; i  5; i++) {
boost::shared_ptrMyObject myObject =
boost::shared_ptrMyObject(new MyObject());
x = i;
y = (i + 1);
myObject-set_x(x);
myObject-set_y(y);

//populate repeated field with 10 values
for (ofs::UInt32 idx = 0; idx  10; idx++) {
z = idx;
myObject-add_z(z);
}
google::protobuf::uint32 myObjectSize = myObject-ByteSize();
//write size of this serialized object
codedOutput.WriteVarint32(sparseImageSize);
//serialize this object to file
myObject-SerializeToCodedStream(codedOutput)) {
}
output.Flush();
output.Close();
close(fd);
}

However, when I run this method, I get the following error:

libprotobuf FATAL google/protobuf/io/zero_copy_stream_impl_lite.cc:
346] CHECK failed: (buffer_used_) == (buffer_size_):  BackUp() can
only be called after Next().

Any ideas on what I'm doing wrong here?  The problem is that the fatal
error exits, so I can't continue to any other code, even though it
appears (and I've read the file created successfully) that the file is
created OK with multiple MyObjects being serialized.  Should I be
using some buffer of some kind?  If any one can supply any sample code
that does this successfully I'd be very grateful, thanks.

-- 
You received this message because you are subscribed to the Google Groups 
Protocol Buffers group.
To post to this group, send email to protobuf@googlegroups.com.
To unsubscribe from this group, send email to 
protobuf+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/protobuf?hl=en.



Re: [protobuf] Problem with C++ -writing multiple messages with a repeated field to a file

2011-05-13 Thread Evan Jones

On May 13, 2011, at 10:12 , Nigel Pickard wrote:

libprotobuf FATAL google/protobuf/io/zero_copy_stream_impl_lite.cc:
346] CHECK failed: (buffer_used_) == (buffer_size_):  BackUp() can
only be called after Next().


Off the top of my head, I *believe* this is happening because the  
CodedOutputStream destructor is trying to reposition the  
FileOutputStream, but the FileOutputStream has already been closed. In  
this case, you either want to put the CodedOutputStream into its own  
enclosing scope, to force the destructor to run before you close the  
FileOutputStream, or just let the FileOutputStream destructor flush  
and close the file automatically.


I hope this helps,

Evan

--
http://evanjones.ca/

--
You received this message because you are subscribed to the Google Groups Protocol 
Buffers group.
To post to this group, send email to protobuf@googlegroups.com.
To unsubscribe from this group, send email to 
protobuf+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/protobuf?hl=en.