разбора — Лучший двоичный ридер для C ++?

Я смотрю в Интернете лучший способ чтения бинарных файлов, и все они ведут к ifstream или istream.

Я не говорю, что они плохие, но мне не удается ужиться. много, так как я могу только читать цифры.

Я ищу какой-то эквивалент BinaryReader C # в C ++, и даже если это сложнее, я хотел бы найти где-нибудь некоторые рекомендации, с которых можно начать, я могу найти только руководства людей, читающих полный файловый буфер и ничего больше

Я попытался использовать двоичный читатель System :: IO из C #, но так как я использую мьютекс, я не могу перейти к этой опции.

Вот как я читаю материал.

std::ifstream f(filename, std::ios::binary); //Open the file

f.read((char*)&header, sizeof(4)); //ReadInt32

SCNObject obj(f);

Конструктор:

SCNObject::SCNObject(std::ifstream& f)
{
f.read((char*)&ID, sizeof(4));
name = (ReadString(f));
parentName = (ReadString(f));
}

Моя функция ReadString:

std::string ReadNTString(std::ifstream& file)
{
char ch = 0;
std::string str = "";
while (ch != '\0')
{
ch = file.get();
str += ch;
}
return str;
}

В этот момент я думал, что собираюсь получить то, что искал, но у меня просто есть числа на строках.
Журнал:

Name: 1288880
Parent Name: 1288880

И они вообще не имеют одно и то же имя, так что я сейчас немного сбит с толку, и я не хочу представлять, как мне это удастся, когда я попытаюсь читать float.

я знаю, что это не способ сделать это, и я держу пари, что есть лучший способ сделать это, но я просто не могу найти его в Интернете, это одно и то же учебное пособие снова и снова, и я не понимаю, как чтобы сделать это, или я просто не делаю это правильно, изучать только C ++ сложно …

если кто-то может дать мне несколько советов о том, как научиться анализировать основные данные, такие как числа с плавающей запятой, строки с нулевым символом в конце, и если есть лучший способ чтения целочисленных значений, я был бы очень признателен, я так потерян и я не знаю что делать

Заранее большое спасибо

0

Решение

Вы можете использовать библиотеку сериализации Boost

http://www.boost.org/doc/libs/1_57_0/libs/serialization/doc/index.html

Он поддерживает двоичную сериализацию примитивов c ++ и контейнеров STL и предоставляет платформу для расширения сериализации на ваши собственные типы. (Но имейте в виду, что он не переносим на разные машинные архитектуры)

Вот как будет выглядеть сериализация для простых строк и чисел с плавающей запятой.

//writer.cpp
#include <boost/serialization/string.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <fstream>

int main() {
std::ofstream out("mydata.bin");
boost::archive::binary_oarchive oarchive(out);
std::string s = "abc";
float x = 123.0f;
oarchive << s << x;
return 0;
}

//reader.cpp
#include <boost/serialization/string.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <fstream>

int main() {
std::ifstream in("mydata.bin");
boost::archive::binary_iarchive iarchive(in);
std::string s;
float x;
iarchive >> s >> x;
std::cout << s << x << '\n';
return 0;
}
0

Другие решения

Ты можешь использовать std::getline читать в std::string, Вы можете указать конец строки или использовать новую строку по умолчанию.

Лучший способ чтения из файлов — это читать большими блоками, а затем манипулировать этими блоками из памяти. Это уменьшает количество запросов к входному потоку.

0