以十六进制读取

时间:2013-10-09 17:07:33

标签: c

我正在尝试从文本文件中读取十六进制,目前这就是我所拥有的

     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会因太大的数字而失败。

2 个答案:

答案 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);