我想阅读这个二进制文件并在屏幕上打印数字,但它正在打印奇怪的字符。我从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 :(得分: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
(或0
和4095
是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;
}
另一个提示:
size
和elements
声明为const(阅读后您不会更改它们):这表明您和您的同事有意将此变量视为只读。size
投射到int
,使用tellg()
的返回类型或使用auto
:const 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;
}
只使用一个指针回收内存,而不是多次尝试删除它!