2016-06-12 6 views
0

У меня проблема с чтением моего двоичного файла. Когда я читаю двоичный файл, содержащий строки, он отлично читается. Но когда я пытаюсь читать файл, который выглядит примерно так:Чтение двоичного файла int в строку C++

1830 3030 3030 3131 3031 3130 3000 0000 
0000 0000 0000 0000 1830 3030 3030 3131 
3030 3030 3100 0000 0000 0000 0000 0000 
1830 3030 3030 3131 3030 3131 3000 0000 
0000 0000 0000 0000 1830 3030 3030 3131 
3031 3030 3000 0000 0000 0000 0000 0000 
1830 3030 3030 3131 3031 3131 3100 0000 
0000 0000 0000 0000 1830 3030 3030 3131 
3130 3130 3100 0000 0000 0000 0000 0000 ... and so on 

он читает только его часть. Это мой код для чтения и преобразования двоичного файла в строку.

string toString (const char *c, int size); 

int main(int argc, char* argv[]) 
{ 
    streampos size; 
    char * memblock; 

    ifstream file (argv[1], ios::in|ios::binary|ios::ate); 
    size = file.tellg(); 
    memblock = new char[size]; 
    file.seekg (0, ios::beg); 
    file.read (memblock, size); 
    file.close(); 

    string input = toString(memblock,size); 
    cout << input << endl; //this prints just portion of it 000001101100 
    return 0; 
} 

string toString (const char *c, int size) 
{ 
    string s; 
    if (c[size-1] == '\0') 
    { 
     s.append(c); 
    } 
    else 
    { 
     for(int i = 0; i < size; i++) 
     { 
      s.append(1,c[i]); 
     } 

    } 

    return s; 
} 

Но когда я пытаюсь читать txt-файл 0 и 1, он читается просто отлично. Я довольно новичок в C++, и я не совсем уверен, почему это так.

+0

Если вы сообщите нам, как вы хотите, чтобы на выходе были предоставлены эти данные, мы, вероятно, можем написать код для вас, чтобы показать вам, как это сделать. –

+0

Также кажется, что вы не освобождаете память, выделенную для переменной memblock. – kyku

+0

hmm ... Я действительно получаю этот файл от сжатия другого .bin-файла с помощью LZW. Когда я сжимаю его до .bin, я получаю 1830 3030 3030 3131 ... но когда он сжат до .txt, я получаю 000001101100. Так что часть .bin такая же, как в .txt. Когда я распаковываю файл .txt, я получаю оригинал без каких-либо ошибок. Но я не могу распаковать .bin, потому что есть только его часть. Я думал, что что-то было с чтением, и что он читает только блок этого. – mihcc

ответ

1

Ваша проблема в том, что вы используете cout. Это предназначено для печати удобочитаемых строк, а не двоичных. Таким образом, линия, что вы помечено:

cout << input << endl; //this prints just portion of it 000001101100 

бы печатать только часть ее.

Двоичные данные вы дали был:

1830 3030 3030 3131 3031 3130 3000 0000 

Вот ASCII для первой строки данных:

<CAN> "000001101100" <NUL> <NUL> <NUL> 

Первый <CAN> является 0x18 - <NUL> имеет значение 0 - и вот где cout останавливается: он печатает человекочитаемые значения ASCII до тех пор, пока не встретит 0 - ваши данные полны.

Вам нужно напечатать шестнадцатеричные значения символов - гораздо более сложный процесс.

+0

Я написал комментарий выше, почему мне нужно прочитать этот файл. – mihcc