Чтение данных из двоичного файла - PullRequest
0 голосов
/ 02 февраля 2011

Я пытаюсь прочитать данные из двоичного файла, и возникли проблемы. Я сократил это до самого простого случая здесь, и он все еще не будет работать. Я новичок в c ++, поэтому я могу делать что-то глупое, но, если кто-нибудь мог бы посоветовать, я был бы очень благодарен.

Код:

int main(int argc,char *argv[]) {
    ifstream myfile;
    vector<bool> encoded2;

    cout << encoded2 << "\n"<< "\n" ;

    myfile.open(argv[2], ios::in | ios::binary |ios::ate );
    myfile.seekg(0,ios::beg);
    myfile.read((char*)&encoded2, 1 );
    myfile.close();


    cout << encoded2  << "\n"<< "\n" ;

}

Выход

00000000

000000000000000000000000000011110000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Compression_Program (58221) malloc: * ошибка для объекта 0x10012d: освобожден невыровненный указатель * установить точку останова в malloc_error_break для отладки

Заранее спасибо.

Ответы [ 6 ]

4 голосов
/ 02 февраля 2011

Не применяйте vector<bool>* к char*. Это не делает ничего предсказуемого.

1 голос
/ 02 февраля 2011

Язык C ++ не обеспечивает эффективный метод ввода / вывода для чтения битов как битов. Вы должны читать биты в группах. Кроме того, вам нужно беспокоиться о Endianess при чтении битов.

Я предлагаю старомодный метод выделения буфера, считывания в буфер и последующего воздействия на буфер.

Выделение буфера

const unsigned int BUFFER_SIZE = 1024 * 1024; // Let the compiler calculate it.
//...
unsigned char * const buffer = new unsigned char [BUFFER_SIZE];  // The pointer is constant.

Чтение данных

unsigned int bytes_read = 0;
ifstream data_file("myfile.bin", ios::binary); // Open file for input without translations.
data_file.read(buffer, BUFFER_SIZE); // Read data into the buffer.
bytes_read = data_file.gcount();  // Get actual count of bytes read.

Напоминания:

  • delete буфер, когда вы покончил с этим.
  • Закройте файл, когда вы закончите с этим.
1 голос
/ 02 февраля 2011

Вы перезаписываете std::vector, чего не следует делать.std::vector - это фактически указатель на массив данных и целое число (вероятно, size_t), содержащее его размер;если перезаписать их практически случайными битами, произойдет повреждение данных.

Поскольку вы читаете только один байт, этого будет достаточно:

char c;
myfile.read(&c, 1);
1 голос
/ 02 февраля 2011

Вы читаете в кодированном2: myfile.read((char*)&encoded2, 1 );. это не верно. Вы можете прочитать bool и затем положить его в закодированный2

bool x;
myfile.read( &x, 1 );
encoded2[0] = x;
1 голос
/ 02 февраля 2011

Здесь две ошибки:

  • вы предполагаете, что адрес вектора является адресом первого элемента
  • , на который вы полагаетесь vector<bool>

Преобразование вектора в char * не очень хорошая вещь, потому что вектор является объектом и хранит некоторое состояние вместе с его элементами.

Здесь вы, вероятно, перезаписываете состояние вектора, таким образом,деструктор неудач.

Может быть, вы хотели бы привести элементы вектора (которые гарантированно будут храниться в памяти).Но другая ловушка заключается в том, что vector<bool> может быть оптимизирован для реализации.

Поэтому вы должны сделать encoded2.reserve(8) и использовать myfile.read(reinterpret_cast<char *>(&encoded2[0])).

Но, вероятно, вы хотите сделать что-то еще, и мынужно знать, для чего здесь цель.

0 голосов
/ 02 февраля 2011
myfile.read((char*) &encoded2[0], sizeof(int)* COUNT);

или вы можете использовать push_back ();

int tmp;
for(int i = 0; i < COUNT; i++) {
  myfile.read((char*) &tmp, 4);
  encoded2.push_back(tmp);
}
...