从C中的文件中读取字符

时间:2013-02-20 06:38:48

标签: c scanf

这是我想要做的。我写了一个简短的C代码,它将打开一个文件,读取前2个字节(2个字符)并将其与2个字符串进行比较。这有助于识别文件类型(让前两个字节调用文件的签名)。

现在,一旦我从文件中读取了2个字节,我想将它与预定义的签名进行比较,并根据该打印文件类型进行比较。

代码:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
FILE *fp;
char signature[2];

if(argc!=2)
{
printf("usage: fileio.c <filename>\n");
exit(1);
}

if((fp=fopen(argv[1],"r"))!=NULL)
{
fscanf(fp,"%c %c", &signature[0], &signature[1]);
printf("%x %x\n",signature[0],signature[1]);
}

}

如果我在Windows平台上为可执行文件运行它,它会将输出显示为:4a 5d,因为它是MZ签名。

现在,我想做这样的事情:

将签名数组的2个字节与0x4d5a进行比较,如果它们相等则打印出它是可执行文件。

我想的另一种方式是,将它与字符串“MZ”进行比较。但后来我需要使用fscanf从文件中读取前2个字节并将它们存储在一个字符串中。然后将其与“MZ”签名进行比较。

如果我可以使用十六进制字节来完成它会很棒,因为我需要稍后对十六进制字节执行一些操作。

感谢。

2 个答案:

答案 0 :(得分:1)

#include <stdio.h>
#include <stdint.h>

int main(int argc, char *argv[]){
  FILE *fp;
  const char mz_sig[] =  {0x4d, 0x5a};
  char signature[2];

  fp=fopen(argv[1],"r");
  fscanf(fp,"%c %c", &signature[0], &signature[1]);
  printf("%x %x\n", signature[0], signature[1]);

  if (*(uint16_t*)signature == *(uint16_t*)mz_sig) {
    printf("match\n");
  }

  return 0;
}

答案 1 :(得分:0)

首先,您应该以二进制模式("rb")打开文件。

至于阅读,您可以使用fread将两个第一个字节作为单个uint16_t读取,然后进行比较。