gpt4 book ai didi

C++读取二进制文件

转载 作者:搜寻专家 更新时间:2023-10-31 00:09:20 25 4
gpt4 key购买 nike

我想了解如何在 C++ 中读取二进制文件。我的代码:

int main() {
ifstream ifd("input.png",ios::binary |ios::ate);
int size = ifd.tellg();
ifd.seekg(0, ios::beg);
vector<char> buffer;
buffer.reserve(size);
ifd.read(buffer.data(), size);

cout << buffer.data();
return 0;
}

我以为如果我 cout 我的缓冲区,我会得到二进制的结果,但事实并非如此。

我的输出是:˙Ř˙á6Exif

如果我读取文本文件,它会以正常格式而不是二进制格式显示文本。显然我的逻辑不在这里。如何将文件读取到缓冲区以便它包含二进制值?附言我这样做是为了实现 Shannon-Fano 算法,所以如果有人对读取二进制文件有任何建议,我将不胜感激。

最佳答案

您需要调整 vector 的大小,而不是保留它:

int main()
{
ifstream ifd("input.png", ios::binary | ios::ate);
int size = ifd.tellg();
ifd.seekg(0, ios::beg);
vector<char> buffer;
buffer.resize(size); // << resize not reserve
ifd.read(buffer.data(), size);

cout.write(buffer.data(), buffer.size()); // you cannot just output buffer to cout as the buffer won't have '\0' ond-of-string terminator
}

否则您的代码会尝试将 size 字符读入空缓冲区。您也可以使用设置 vector 大小的 vector 构造函数:vector<char> buffer(size);

您可以通过这种方式输出缓冲区的字节值:

void dumpbytes(const vector<char>& v)
{
for (int i=0; i<v.size(); ++i)
{
printf("%u ", (unsigned char)v[i]);
if ((i+1) % 16 == 0)
printf("\n");
}
printf("\n");
}

或者类似于常见的十六进制编辑器对十六进制输出所做的事情:

void dumphex(const vector<char>& v)
{
const int N = 16;
const char hex[] = "0123456789ABCDEF";
char buf[N*4+5+2];
for (int i = 0; i < v.size(); ++i)
{
int n = i % N;
if (n == 0)
{
if (i)
puts(buf);
memset(buf, 0x20, sizeof(buf));
buf[sizeof(buf) - 2] = '\n';
buf[sizeof(buf) - 1] = '\0';
}
unsigned char c = (unsigned char)v[i];
buf[n*3+0] = hex[c / 16];
buf[n*3+1] = hex[c % 16];
buf[3*N+5+n] = (c>=' ' && c<='~') ? c : '.';
}
puts(buf);
}

用“Hello World!”缓冲数据将打印如下:

48 65 6C 6C 6F 20 57 6F 72 6C 64 21                  Hello World!

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

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