Вопрос:

Чтение двоичных данных в структуру с помощью ifstream

c++ struct binary ifstream

20031 просмотра

2 ответа

539 Репутация автора

Я пытаюсь прочитать двоичные данные из файла, используя ifstream.

В частности, я пытаюсь заполнить эту структуру "Заголовок" данными, считанными из файла:

struct Header {
    char id[16];
    int length;
    int count;
};
  1. Теперь, если я прочитаю файл таким образом, результат будет именно тем, что я хочу:

    input.read((char*)&hdr, sizeof(hdr));
    
  2. Но если я вместо этого читаю каждую переменную структуры вручную, результаты будут бессмысленными:

    input.read((char*)&hdr.id,     sizeof(hdr.id));
    input.read((char*)&hdr.length, sizeof(hdr.length));
    input.read((char*)&hdr.count,  sizeof(hdr.count));
    

У меня вопрос: что здесь происходит, что заставляет эти два метода возвращать разные результаты?

Автор: Dan Источник Размещён: 05.03.2014 08:25

Ответы (2)


2 плюса

1816 Репутация автора

Решение

Как говорится в приведенном выше комментарии, вам, вероятно, не хватает hdr.length и hdr.count. Я попробовал это с gcc 4.8 и clang 3.5, и он работает правильно.

#include <iostream>
#include <fstream>

#pragma pack(push, r1, 1)
struct Header {
    char id[15];
    int length;
    int count;
};
#pragma pack(pop, r1)

int main() {
  Header h = {"alalalala", 5, 10};

  std::fstream fh;
  fh.open("test.txt", std::fstream::out | std::fstream::binary);
  fh.write((char*)&h, sizeof(Header));
  fh.close();

  fh.open("test.txt", std::fstream::in | std::fstream::binary);

  fh.read((char*)&h.id, sizeof(h.id));
  fh.read((char*)&h.length, sizeof(h.length));
  fh.read((char*)&h.count, sizeof(h.count));

  fh.close();

  std::cout << h.id << " " << h.length << " " << h.count << std::endl;
}
Автор: Blaz Bratanic Размещён: 05.03.2014 08:48

1 плюс

363 Репутация автора

Также возможно прочитать структуру за один шаг.

т.е. fh.read((char*)&h, sizeof(Header));

Автор: Marcel Zebrowski Размещён: 25.08.2018 05:54
Вопросы из категории :
32x32