и заранее благодарю за помощь!
Я нахожусь в процессе изучения C ++. Мой первый проект - написать парсер для формата двоичного файла, который мы используем в моей лаборатории. Мне удалось заставить синтаксический анализатор работать в Matlab довольно просто, используя «fread», и, похоже, это может сработать для того, что я пытаюсь сделать в C ++. Но из того, что я прочитал, кажется, что использование ifstream является рекомендуемым способом.
Мой вопрос двоякий. Во-первых, каковы преимущества использования ifstream перед fread?
Во-вторых, как я могу использовать ifstream для решения моей проблемы? Вот что я пытаюсь сделать. У меня есть двоичный файл, содержащий структурированный набор целых чисел, чисел с плавающей запятой и 64-разрядных чисел. Всего имеется 8 полей данных, и я бы хотел прочитать каждое из них в своем собственном массиве.
Структура данных следующая, в повторяющихся 288-байтовых блоках:
Bytes 0-3: int
Bytes 4-7: int
Bytes 8-11: float
Bytes 12-15: float
Bytes 16-19: float
Bytes 20-23: float
Bytes 24-31: int64
Bytes 32-287: 64x float
Я могу прочитать файл в память в виде массива char * с помощью команды чтения fstream:
char * buffer;
ifstream datafile (filename,ios::in|ios::binary|ios::ate);
datafile.read (buffer, filesize); // Filesize in bytes
Итак, насколько я понимаю, теперь у меня есть указатель на массив, называемый «буфер». Если бы мне нужно было вызвать буфер [0], я бы получил 1-байтовый адрес памяти, верно? (Вместо этого я получаю ошибку сегмента.)
То, что мне сейчас нужно сделать, должно быть очень простым. После выполнения вышеупомянутого кода ifstream у меня должен быть довольно длинный буфер, заполненный числом 1 и 0. Я просто хочу иметь возможность читать эти вещи из памяти, 32-битные за раз, приводить их как целые числа или числа с плавающей запятой в зависимости от того, над каким 4-байтовым блоком я сейчас работаю.
Например, если двоичный файл содержит N 288-байтовых блоков данных, каждый извлекаемый массив должен иметь по N членов. (За исключением последнего массива, который будет иметь 64N членов.)
Поскольку у меня есть двоичные данные в памяти, я просто хочу читать из буфера по одному 32-битному числу за раз и помещать полученное значение в соответствующий массив.
И наконец - могу ли я получить доступ к нескольким позициям массива одновременно, а-ля Matlab? (например, массив (3: 5) -> [1,2,1] для массива = [3,4,1,2,1])