使用ifstream :: get逐字节读取文件

时间:2012-11-14 15:54:54

标签: c++ ifstream

我在互联网上的教程后写了这个二进制阅读器。 (我正试图找到链接......)

代码逐字节读取文件,前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:这个实现包含在另一个程序中并且工作得很好......很奇怪。

1 个答案:

答案 0 :(得分:3)

strcmp假设两个字符串都以nul结尾(以nul字符结尾)。当你想要比较未终止的字符串时,比如在这种情况下,你需要使用strncmp并告诉它要比较多少个字符(在这种情况下为4)。

if (strncmp(magic, "MAGI", 4) != 0){

当你尝试使用strcmp比较非空终止的char数组时,它无法判断数组有多长(你不能仅仅通过查看数组本身来判断C / C ++中数组的长度 - 您需要知道分配的长度。标准库不能免除此限制。因此它会读取恰好在char数组之后存储在内存中的任何数据,直到它达到0字节为止。

顺便说一下:请注意Lightness Races in Orbit对您问题的评论,这与您现在遇到的问题无关,但暗示了一个可能导致您出现问题的不同错误以后。