Чтение / запись файла BSON - PullRequest
1 голос
/ 08 января 2020

Я использую библиотеку https://github.com/nlohmann/json для записи моего объекта в BSON. Я проверил создание экземпляра json, записав файл в json для проверки, так что часть кода работает как положено. У меня возникли проблемы с ним, как только я вернусь обратно в bson.

Вот фрагмент кода, с которым я работаю:

//I have written out json_triangle_container to verify it looks correct
//so I am sure the problem is not here
json json_instance = <my function to create this instance>
std::vector<std::uint8_t> v_bson = json::to_bson(json_instance);

//writing the vector out here
auto bsonFilename = std::string("json_instance.bson");
std::ofstream bsonfile(bsonFilename, std::ios::out | std::ios::binary);
bsonfile.write((char*)&v_bson[0], v_bson.size() * sizeof(v_bson[0]));
bsonfile.close();

//reading it back in here
std::ifstream r_file(bsonFilename, std::ios::in | std::ios::binary | std::ios::ate);
std::streampos size = r_file.tellg();
r_file.seekg(0, std::ios::beg);
char* memblock = new char[size];
r_file.read(memblock, size);
r_file.close();

//printing out the json object for testing
auto json_instance_read = json::from_bson(memblock); //this is where it is blowing up
std::cout << json_instance_read << std::endl; 

Я получаю исключение, которое говорит:

Exception thrown at 0x00007FFF4EE6A839 in test.exe: Microsoft C++ exception: nlohmann::detail::parse_error at memory location 0x0000006AB4D5F470.

Стоит также отметить, если я позвоню json::from_bson(v_bson ) разбирает нормально. Я проверил, что размер читаемого массива совпадает с размером записанного вектора. Так что это наводит меня на мысль, что я сделал что-то не так в том, как изначально написал bson.

Редактировать
Использование некоторых онлайн-инструментов для преобразования сгенерированного мной файла bson в json кажется, что запись написана правильно. Так что это указывает на проблему с моей функцией чтения.

При дальнейшей отладке похоже, что в v_bson vector элемент 3 имеет значение '\0', которое, я думаю, выбрасывает читателя и он останавливается перед чтением всего файла. Я подтвердил это, проверив размер memblock, и он всего 3 символа.

Таким образом, вопрос немного меняется:
Как мне сказать ifstream читателю игнорировать то, что он считает символом EOF?

Все, что я нашел, говорит, чтобы убедиться, что инициализировать его с std::ios::binary, что я делаю:

std::ifstream r_file(bsonFilename, std::ios::in | std::ios::binary | std::ios::ate);
...