我有一个类型为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命令一样消除这些零
数据看起来像32位二进制整数,格式为little endian(PC)。八进制转储有点误导,因为您用-D
指示它读取16位值。一个具有2值的16位int是字节序列0x2 0x0,但是作为八进制整数,它是2(或者,如果打印前导0,则为000002)。
如果您逐字节阅读它,您会看到的。
您的问题的解决方案是简单地fread
32位整数,只要您使用的是Intel兼容平台。