gpt4 book ai didi

c++ - 读取二进制文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:27:07 26 4
gpt4 key购买 nike

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

最佳答案

您正在将 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()的返回类型或者使用auto : const auto size = file.tellg();: 为什么转换为另一种类型?使用与您正在调用的功能相同的功能!转换可能会导致开销。
  • 尝试在最小范围内并在您将要使用它们的位置附近声明您的变量:这将使您的代码更具可读性和可维护性。

关于c++ - 读取二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17585395/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com