Чтение бинарных файлов - PullRequest
       28

Чтение бинарных файлов

1 голос
/ 20 апреля 2011

Я должен читать данные из двоичного файла.Этот двоичный формат данных: 0x00 0x00 0x01 - это разделитель, после этого разделителя существует массив байтов необработанных данных.Итак, чтобы подвести итог, мой двоичный файл выглядит так:

0x00 0x00 0x01 (здесь байт необработанных данных) 0x00 0x00 0x01 (вот еще один блок байтов необработанных данных) 0x00 0x00 0x01 ....

Итак, я написал такой код для разбора моего файла (я не очень знаком с C)

ifstream inp("myfile.bin",ios::binary);
char b1, b2, b3;
while (!inp.eof())
    {
        inp.read(&b1,sizeof(b1));
        inp.read(&b2,sizeof(b2));
        inp.read(&b3,sizeof(b3));
        //finding first delimiter (data starts from delimiter)
        while (!((0==b1)&&(0==b2)&&(1==b3)))
        {
            b1=b2;
            b2=b3;
            if (inp.eof())
                break;      
            inp.read(&b3,sizeof(b3));
        }
        if (inp.eof())
            break;              
        char* raw=new char[65535];
        int rawSize=0;

        inp.read(&b1,sizeof(b1));
        inp.read(&b2,sizeof(b2));
        inp.read(&b3,sizeof(b3));

        raw[rawSize++]=b1;
        raw[rawSize++]=b2;
        if (inp.eof())
            break;  

        //reading raw data until delimiter is found
        while (!((0==b1)&&(0==b2)&&(1==b3)))
        {
            raw[rawSize++]=b3;
            b1=b2;
            b2=b3;
            if (inp.eof())
                break;      
            inp.read(&b3,sizeof(b3));
        }
        rawSize-=2; //because of two bytes of delimiter (0x00 0x00) would be added to raw

        //Do something with raw data

        if (inp.eof())
            break;

        inp.putback(1);
        inp.putback(0);
        inp.putback(0);

        delete []raw;
    }

Но иногда этот код попадает в бесконечный цикл.Не могли бы вы посоветовать мне что-нибудь?Спасибо

Ответы [ 2 ]

1 голос
/ 20 апреля 2011

Я думаю, что проблема в том, что putback терпит неудачу.Насколько я помню, putback гарантированно будет работать только один раз;Второй вызов завершится неудачно, если внутренний буфер чтения выровнен (то есть очень редко; похоже на вашу ситуацию).

Чтобы исправить, избавьтесь от putback.Прежде всего, переместите закомментированный цикл как «поиск первого разделителя» из внешнего цикла while: комментарий предполагает, что этот код должен выполняться только один раз.После того, как вы это сделаете, обратите внимание, что в начале внешнего цикла while последовательность 0x00 0x00 0x01 была только что найдена, поэтому код не должен использовать putback и искать его снова.

0 голосов
/ 20 апреля 2011
  • Вы используете feof() неправильно, оно действительно только после чтения было предпринято попытка и не удалось.

  • Как сделатьВы знаете, что ваша магическая последовательность байтов 0 0 1 не появляется внутри данных?Если данные являются просто «двоичным массивом», который не звучит так, как будто он дает большую гарантию ...

...