首页 文章

从文件fscanf格式读取十六进制数据编译时警告

提问于
浏览
1

我正在从文件中读取一些数据 . 格式说明了

带有UNIX样式行结尾的ASCII文本,一系列以十六进制表示的32位有符号整数 .

例如

08000000

我正在使用fscanf来读取这些数据 .

long data_size;

FILE *fp;
fp=fopen("test01.bin", "r"); // open for reading
if (fp==0) {cerr << "Error openeing file"<<endl; return 1;}

fscanf(fp, "%x", &data_size);

我的测试文件一切运行正常,但我收到编译时警告,

warning: format ‘%x’ expects type ‘unsigned int*’, but argument 3 has type ‘long int*’

但是十六进制值是无符号的,并且这个问题被投射到长剂量?只要通知标志,最重要的一点是什么?或者我最终会遇到问题?或者我的理解是不是很好?

谢谢

2 回答

  • 0

    您应该支持与警告状态相同的指针类型,否则如果您想将代码移植到其他体系结构(例如:64位体系结构),那么您将遇到严重的麻烦,其中 long 的大小与 int 不同 . 如果您使用指针,这尤其棘手 . (我曾经有一个来自 exactly 这个问题的bug)

    只需使用 int data_size 就可以了 .

  • 0

    问题是 %x 需要 unsigned int * 来读取值,但你有一个 long * . <stdint.h> header提供具有固定长度的值类型, <inttypes.h> 定义了与 printfscanf 及其派生类一起使用的相应宏 . 我认为使用 <inttypes.h> 提供的宏将 fscanf 数据转换为 int32_t 变量会更好:

    #include <inttypes.h>
    
    ...
    
    int32_t data_size;
    fscanf(fp, "%" SCNx32, &data_size);
    

相关问题