Как восстановить данные из файла, как если бы это было «od -D filename» в терминале linux - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть файл типа: data, и я хочу прочитать этот файл так же, как я вижу содержимое файла с помощью команды

od -D filename в Linux

Другими словами, содержимое файла:

0000000 000002 000000 000002 000000 000002 000000 000002 000000
0000020 000004 000000 000004 000000 000004 000000 000004 000000
0000040 000006 000000 000006 000000 000006 000000 000006 000000
0000060

Но с помощью команды od -D filename на Linux я вижу:

0000000 2 2 2 2
0000020 4 4 4 4
0000040 6 6 6 6
0000060

Я хочу прочитайте этот файл в C ++, чтобы мне не приходилось манипулировать данными, а просто получить 222244446666

В приведенном ниже коде я читаю способом, который работает, но если файл содержит значения = 0, я не смогу спасти их в чтении.

ifstream file2 (file, ios :: in);
        char ch;
        if (file2.is_open ())
        {
            while (! file2.eof ())
            {
                file2.get (ch);
                double num = ch;
                //if (num != 0) {
                    cout << num << endl;
                //}
            }
        }
        file2.close ();

Когда я читаю таким образом, это выглядит так:

2
0
0
0
2
0
0
0
2
0
0
0
2
0
0
0
4
0
0
0
4
0
0
0
4
0
0
0
4
0
0
0
6
0
0
0
6
0
0
0
6
0
0
0
6
0
0
0
0

Я хочу знать, как я Можно прочитать этот файл, чтобы он принимал только реальные значения, то есть 222244446666, но если он содержит 0 значений, мне также нужно их получить. Пример: 000022224444 (поэтому я прокомментировал, если num! = 0, это работает не во всех случаях)

То есть мне нужно исключить эти нули, так как команда od -D filename делает

1 Ответ

0 голосов
/ 01 апреля 2020

Данные выглядят как 32-разрядные двоичные целые числа в формате с прямым порядком байтов (P C). Восьмеричный дамп немного вводит в заблуждение, потому что вы указываете ему -D прочитать 16-битные значения. 16-разрядный тип int со значением 2 является байтовой последовательностью 0x2 0x0, но в виде восьмеричного целого числа он равен 2 (или, если мы печатаем ведущие 0s, 000002).

Если вы читаете его побайтно, ваш см. это.

Решение вашей проблемы - просто fread 32-битные значения, если вы работаете на платформе, совместимой с Intel.

...