如何从文件中恢复数据,就好像它是Linux终端中的'od -D filename'

问题描述 投票:0回答:1

我有一个类型为data的文件,我想用与查看命令相同的方式读取该文件

Linux上的od -D文件名

换句话说,文件的内容是:

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

但是在Linux上使用od -D filename命令,我看到:

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命令一样消除这些零

c++ ifstream
1个回答
0
投票

数据看起来像32位二进制整数,格式为little endian(PC)。八进制转储有点误导,因为您用-D指示它读取16位值。一个具有2值的16位int是字节序列0x2 0x0,但是作为八进制整数,它是2(或者,如果打印前导0,则为000002)。

如果您逐字节阅读它,您会看到的。

您的问题的解决方案是简单地fread 32位整数,只要您使用的是Intel兼容平台。

© www.soinside.com 2019 - 2024. All rights reserved.