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

时间:2011-06-29 15:30:12

标签: c formatting hex

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

  

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

e.g

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 :(得分:0)

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

只需使用int data_size就可以了。

答案 1 :(得分:0)

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

#include <inttypes.h>

...

int32_t data_size;
fscanf(fp, "%" SCNx32, &data_size);