我想通过“ParseFromIstream”从文件加载 Google Protocol Buffer 编码数据。但这个调用只是返回 false(没有可用的附加错误信息?)并且仅读取部分数据(例如,各种子消息为空)。
当我预先将数据加载到内存然后使用“ParseFromArray”时,解析器成功并且所有数据都存在。
我想找出为什么 ParseFromIstream 失败以及如何修复此行为。
这是我的示例代码:
// Test 1 - read data from memory -> works
// Read data from file to memory
int numBytes;
char* bytes = ReadFileToMemory(L"C:\\MyData.bin", &numBytes);
// Parse protobuf
mytest::ProtoRoot root1{};
bool loadFromMemoryOk = root1.ParseFromArray(bytes, numBytes); // OK
// Parsing worked, root1 contains all data
// Test 2 - read data from file -> does not work
// Open file stream
std::ifstream ifs(L"C:\\MyData.bin", std::ifstream::in);
// Parse protobuf
mytest::ProtoRoot root2{};
bool loadFromFileOk = root2.ParseFromIstream(&ifs); // Not OK
// Parsing failed, root2 only contains some data, most fields are empty
试试这个:
std::ifstream ifs("C:\\MyData.bin", std::ios::binary);
重点是
std::ios::binary
部分。 Protobuf 文件是二进制文件而不是文本文件,因此您希望以二进制模式打开输入文件流。
有关更多信息,请参阅:https://en.cppreference.com/w/cpp/io/c/FILE#Binary_and_text_modes