从文件加载协议缓冲区不成功

问题描述 投票:0回答:1

我想通过“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
c++ protocol-buffers ifstream
1个回答
0
投票

试试这个:

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

© www.soinside.com 2019 - 2024. All rights reserved.