C++ 从文件中读/写 N 个字节(甚至是 '00' 字节)

标签 c++ file byte ifstream

我的任务是读取文件内容并将它们放入 std::strings 的 vector 数组中,然后从 vector 输出到另一个文件。

我设法解决了只包含普通文本的文件,但失败了,假设是 .bmp 这是 .bmp 文件头:

BM)(     6   (   —  к        Р((

十六进制显示这些是 NULL 字节,而不是空格

42 3d 06 29 28 00 00 00 00 00 36 00 00 00 ...

结果,执行了下面的代码

char *buffer = new char [50];

ifstream ifs( "file.bmp" , std::ifstream::binary );
ifs >> std::noskipws;

ifs.read( buffer, 50 );

std::string abc(buffer); //output it to other file next

我最终得到缓冲区和 abc 字符串等于 "BM)(6(—кР(( ..."并跳过所有空字节。 ifs.read() 直到现在都很棒。那么从文件中读取/写入 N 个精确字节的最舒适方式是什么?

(我进行了搜索,但结果很困难)

最佳答案

那是蹩脚的,但有一天有人可能会用谷歌搜索这个,所以我会写一个答案。

如果在调试时您在调用 ifs.read() 后将鼠标悬停在缓冲区上,您会看到 "BM)(6(—кР(( ...",但空字节实际上在那里。但是(在 MSVS 中)除非将缓冲区重新定义为

,否则您看不到实际的字节缓冲区
char buffer[50];

接下来,当 std::string 超出缓冲区时,做

string abc(buffer); // would not copy null bytes to std string,

所以这样做:

string abc(buffer, 50); //copies all bytes.

现在我在字符串中有了真实的文件内容,如果我将 abc 输出到其他文件,我将得到相同的数据。

附言检查结果时使用十六进制编辑器查看真实字节,不要相信记事本。

关于C++ 从文件中读/写 N 个字节(甚至是 '00' 字节),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21805661/

相关文章:

c++ - 从 char 获取字节值

c++ - 在 C++20 中不能使用 { } 初始化,但在 C++17 中

c++ - 为 tile 中的线程将数据复制到 tile_static

c++ - Cygwin: g++ 5.2: ‘to_string’ 不是 ‘std’ 的成员

python - 如何提高读取文件程序的运行时性能

linux - 在 Linux 中如何检查 2 个不同的模式是否在连续的行中

python - 你如何在python中组合两个字节?

c++ - 指针段错误问题

C程序打不开文件

c# - 如何将 UI RawImage 转换为字节数组