我正在尝试从文本文件中读取十六进制,目前这就是我所拥有的
void hexReader(char* file, node* head){
FILE *fp;
char str[MAXCHAR];
size_t number = 0;
fp = fopen(file, "r");
if (fp == NULL){
printf("Could not open file %s",filename);
//return 1;
}
while (fgets(str, MAXCHAR, fp) != NULL) {
//while ((number = getline(&line, &len, fp)) != -1)
number = strtoull(str, NULL, 16);
if (number > 0){
printf("%size_t \n",number);
printf("%x \n",number);
}
}
fclose(fp);
}
我已尝试使用无符号long long作为数字,但它在十六进制上失败,如FFFFFFFFFFFFFFF。我应该能够以0x的形式读取类似的东西......最多64位十六进制数。
为什么会失败? Size_t打印出无意义,并且未经编辑的long long会因太大的数字而失败。
答案 0 :(得分:1)
重新编写内循环。
1无需size_t
2使用errno
检查strtull()
是否成功
3使用正确的unsigned long long
说明符修饰符"ll"
4 printf("%size_t \n",number)
失败,因为%s
表示假设number
是一个字符串
5 printf("%x \n",number)
失败,sizeof(number)
我的sizeof(unsigned)
大于%x
,与number
一起使用,只使用while (fgets(str, MAXCHAR, fp) != NULL) {
errno = 0;
char *endptr;
unsigned long long X = strtoull(str, &endptr, 16);
// Use these tests as desired to catch overflow, no convert, unexpected extra.
if (errno || (endptr == str) || (*endptr != '\n')) {
printf("Error\n");
}
else {
printf("%llx\n", X); // print hex
printf("%#llx\n", X); // print hex with leading 0x
printf("%#llu\n", X); // print decimal
}
}
的某些内容。
{{1}}
答案 1 :(得分:1)
%size_t
是无意义的 - 使用%zx
打印十六进制size_t
值。您的%x
也不会工作 - 如果您没有z
修饰符,因为您使用了非C99感知的编译器/库,请确保您匹配变量类型和格式字符串:
printf("%llx\n", (unsigned long long)number);