C ++从文件读取/写入N个精确字节(甚至是'00'字节)

时间:2014-02-16 00:28:59

标签: c++ file byte ifstream

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

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

BM)(     6   (   —  к        Р((

hex表示这些是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(-кР((...)跳过所有nullbytes。 ifs.read()直到现在都很棒。那么从文件中读取/写入N个精确字节的最舒适方式是什么?

(我做了搜索,但结果有困难)

1 个答案:

答案 0 :(得分:2)

那太蹩脚了,但是有一天有人可能会谷歌,所以我会写一个答案。

如果在调试时你会在调用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输出到其他文件,我将拥有相同的数据。

P.S。检查结果时使用十六进制编辑器查看实际字节,不要相信记事本。