阅读二进制文件

时间:2013-07-11 05:01:58

标签: c++ c++11

我想阅读这个二进制文件并在屏幕上打印数字,但它正在打印奇怪的字符。我从MATLAB生成了这个二进制文件。如何正确显示数据?

#include <iostream>
#include <fstream>
using namespace std;

ifstream::pos_type size;
char * memblock;

int main ()
{
   ifstream file ("seg.bin", ios::in|ios::binary|ios::ate);

   if (file.is_open())
   {
        size = (int)file.tellg();
        memblock = new char [size];
        file.seekg (0, ios::beg);
        file.read (memblock, size);
        file.close();

        cout << "the complete file content is in memory";

        for (int i=0;i<size;i++)
        {
            cout<<memblock[i]<<endl;
        }
    }
    else cout << "Unable to open file";
    return 0;
}

3 个答案:

答案 0 :(得分:1)

您正在将char打印到输出中,输出中char的表示形式为字符,如果您发送给std::cout的字符不是打印你什么也看不见,或者在某些情况下你会看到奇怪的字符(或者在某些情况下会发出哔哔声!)。

尝试将char值转换为int

std::cout << static_cast<int>(memblock[i]) << std::endl;
             ^^^^^^^^^^^^^^^^

您迭代打印数据的方式只能获得8位大小的数据(或char的大小),让我们知道您的文件中包含以下数据:

00000FFF

您的输出将是:

  

0

     

0

     

15

     

255

但是,如果您正在使用其他尺寸的数据(例如int),那么如果您的数据输出为4095(或04095是16位宽。)

如果是这种情况,请尝试将数据读入您期望的数据数组中:

const ifstream::pos_type size = file.tellg(); // do not cast the size!
const size_t elements = size / sizeof(int);   // <--- beware of the sizes!
memblock = new int [elements];                // Elements, not size

for (int i = 0; i < elements; ++i) // Elements! not size
{
    std::cout << memblock[i] << std::endl;
}

另一个提示:

  • sizeelements声明为const(阅读后您不会更改它们):这表明您和您的同事有意将此变量视为只读。
  • 不要将size投射到int,使用tellg()的返回类型或使用autoconst auto size = file.tellg();:为什么要投放到其他类型?使用与您正在呼叫的功能相同的功能!演员阵容可能导致开销。
  • 尝试在最小的范围内以及您将要使用它们的地方声明您的变量:这将使您的代码更具可读性和可维护性。

答案 1 :(得分:0)

您需要知道文件中存储的数据类型是什么。我们说它是double。在这种情况下,您可以这样做:

for (int i = 0; i < size; i += sizeof(double))
{
    cout << *(double*)&memblock[i] << endl;
}

另一种方法是直接读入double数组开始。将此作为练习。

答案 2 :(得分:0)

memblock是char类型,这就是为什么cout将使char打印(ascii字符)。 在这种情况下,您想要的是将memblock指针重新解释为指向您需要的类型的指针。 说你需要加倍:

size = (int)file.tellg();
memblock = new char [size];
file.seekg (0, ios::beg);
file.read (memblock, size);
file.close();
double * fileContent = reinterpret_cast<double *>(memblock);
cout << "the complete file content is in memory";

int sizeOfFileContent = sizeof(memblock)/sizeof(double);
for (int i=0; i<sizeOfFileContent; i++)
{
   cout<<fileContent[i]<<endl;
}

只使用一个指针回收内存,而不是多次尝试删除它!