2013-07-11 266 views
2

我想读这个二进制文件并在屏幕上打印数字,但它打印奇怪的字符。我从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; 
} 
+0

这样做:'cout <<(int)memblock [i] << endl;' – sgarizvi

+1

@ sgar91如果原始数据的类型为“char”,那么只会这样做。 OP没有告诉我们数据类型是什么。 – paddy

+0

请记得删除后面的[] memblock,以防止内存泄漏 – Enigma

回答

0

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

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

另一种方式去了解它是直接读入的double数组开始。将这个作为一个练习。

1

要打印char s到输出,在输出char的表示是一个字符,如果你发送到std::cout的字未见诸报端,你会看到什么或在某些情况下,你会看到奇怪的字符(或者在某些情况下会发出哔哔声!)。

尝试投的charint

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

你迭代印刷时的数据,你会只得到8位大小的数据的方式(或者你char是大小),让我们supose你有你的文件中的以下数据:

00000FFF 

你的输出将是:

但是,如果你有其他尺寸(int为例)的数据时,你会想到的4095输出(或0如果你的数据是16位宽的,则为4095)。

如果是你的情况下,尝试将数据读入数据的数组你期待:

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();:为什么要转换为另一种类型?使用您所调用的功能的相同功能!演员阵容可能会导致开销。
  • 尝试在最小范围内以及将要使用它们的位置附近声明变量:这将使您的代码更具可读性和可维护性。
0

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

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; 
} 

仅使用一个指针来回收内存,不要试图多次删除它!