1

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

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

4

1 回答 1

3

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

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

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

顺便说一句:请注意Lightness Races in Orbit对您的问题的评论,这与您现在遇到的问题无关,但它暗示了一个不同的错误,可能会在以后给您带来一些问题。

于 2012-11-14T16:00:36.283 回答