我的任务是读取文件内容并将它们放入 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/