使用 ifstream::get 逐字节读取文件
Reading file byte by byte with ifstream::get
我在互联网上的教程之后写了这个二进制阅读器。(我正在尝试找到链接...
代码逐字节读取文件,前 4 个字节一起是魔术词。(比方说MAGI!我的代码如下所示:
std::ifstream in(fileName, std::ios::in | std::ios::binary);
char *magic = new char[4];
while( !in.eof() ){
// read the first 4 bytes
for (int i=0; i<4; i++){
in.get(magic[i]);
}
// compare it with the magic word "MAGI"
if (strcmp(magic, "MAGI") != 0){
std::cerr << "Something is wrong with the magic word: "
<< magic << ", couldn't read the file further! "
<< std::endl;
exit(1);
}
// read the rest ...
}
现在问题来了,当我打开文件时,我得到此错误输出: Something is wrong with the magic word: MAGI?, couldn't read the file further!
所以在单词MAGI之后总是有一个(主要是随机的)字符,就像在这个例子中,字符?
!我确实认为这与C++中的字符串如何存储和相互比较有关。我是对的吗,我怎样才能避免这种情况?
PS:此实现包含在另一个程序中,并且工作完全正常...奇怪。
strcmp 假定两个字符串都是以 nul 结尾的(以 nul 字符结尾)。当您要比较未终止的字符串时,例如在本例中,您需要使用 strncmp 并告诉它要比较多少个字符(在本例中为 4)。
if (strncmp(magic, "MAGI", 4) != 0){
当您尝试使用 strcmp 比较未以 null 结尾的 char 数组时,它无法判断数组有多长(您无法仅通过查看数组本身来判断 C/C++ 中数组的长度 - 您需要知道分配的长度。标准库不能免除此限制)。因此,它会读取恰好在 char 数组之后存储在内存中的任何数据,直到它达到 0 字节。
顺便说一下:请注意 Lightness Races in Orbit 对您的问题的评论,它与您现在遇到的问题无关,但它暗示了一个不同的错误,这可能会在以后给您带来一些问题。
相关文章:
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 读取文件的最后一行并输入到链接列表时出错
- 为什么在读取文件大小时文件IO速度会发生变化
- 读取文件时运行时的未知行为
- 如何逐行读取文件,每行中的内容都用空格分隔并将其写入新文件中
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- C++ 读取文件读取文件不正确
- 读取文件并将其存储在unordered_map中时出现问题
- 读取文件时无法使用 OpenMP 获得加速
- 使用istringstearm和get行缓慢读取文件
- 如何继续读取不同功能中的文件,而不是从头开始再次读取文件?
- 读取文件时引发异常
- 从标准输入读取文件后读取用户输入
- 在读取文件后重置句柄
- 如何在C++编译时读取文件?
- std::ifstream 在读取文件中最后一项时设置 eofbit,但仅在读取数值类型时发生
- 读取文件在第二次调用时返回INVALID_HANDLE
- 通过指针读取文件
- 逐行读取文件,并将数据插入变量和数组中