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



我正在从一个文件中读取一些数据。格式规定为

具有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*’

然而,十六进制值是无符号的,并且被强制转换为长剂量,这有什么关系?最重要的一位通知标志需要多长时间?还是我会遇到问题?还是我的理解偏离了目标?

感谢

您应该支持与警告状态相同的指针类型,否则,如果您想将代码移植到longint大小不同的其他体系结构(例如:64位体系结构),您将遇到严重问题。如果使用指针,这一点尤其棘手。(我曾经有一个错误源于正是这个问题)

只要使用int data_size,你就会没事的。

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

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

最新更新