1

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

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

  }

我尝试使用 unsigned long long 作为数字,但它在 FFFFFFFFFFFFFFF 等十六进制上失败。我应该能够以 0x.... 最多 64 位十六进制数的形式读取类似的内容。

为什么会失败?Size_t 在太大的数字上打印出无意义的和 unsinged long long 失败。

4

2 回答 2

1

内部循环的小重写。

1 不需要size_t
2errno用于检查strtull().
3 使用正确的unsigned long long说明符修饰符"ll"
4printf("%size_t \n",number)失败,因为%s假设的手段number是一个字符串。
5printf("%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
  }
}
于 2013-10-09T17:21:38.303 回答
1

%size_t是废话 - 用于%zx打印十六进制size_t值。你%x也不会工作 - 如果你没有z修饰符,因为你使用的是非 C99 感知编译器/库,请确保你匹配变量类型和格式字符串:

printf("%llx\n", (unsigned long long)number);
于 2013-10-09T17:22:37.353 回答