c - C语言从文件中读取字符

标签 c scanf

这是我正在尝试做的事情。我写了一个简短的 C 代码,它将打开一个文件,读取前 2 个字节(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”签名进行比较。

如果我可以使用十六进制字节来完成,那就太好了,因为稍后我需要对十六进制字节执行一些操作。

谢谢。

最佳答案

#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;
}

关于c - C语言从文件中读取字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14973719/

相关文章:

c - 读取大型文本文件并在 C 程序中按字母顺序快速排序

c - fscanf() fclose() 或读取文件退出并结束程序

c - 为什么我的程序在调试时崩溃了?

c - c 中的命令行参数和 scanf 函数有什么区别?

c++ - 使用 sprintf 和 sscanf 替换给定数字中的所有 0's with 5'

c - 扫描不同类型的变量

c - 如何删除 char 数组转换为无符号 char 数组的警告

c - ANSI C 图形扩展

c - 如何将/proc/bus/usb/devices 条目映射到/dev/sdX 设备?

c - 如何在没有内存泄漏的情况下删除 C 中的前导/尾随空格