2013-10-09 294 views
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); 

    } 

我一直在使用無符號長長的數量嘗試,但它像FFFFFFFFFFFFFFF六角失敗。我應該能夠讀取這樣的內容,形式爲0x ....最多64位十六進制數。

這是爲什麼會失敗? Size_t打印出無意義,而未識別的long long因數量過大而失敗。

+4

'的printf (「%size_t \ n」,數字);'似乎關閉,'%s'表示字符串。 –

+2

而[這裏](http://stackoverflow.com/questions/2125845/platform-independent-size-t-format-specifiers-in-c)是一個問題,問'size_t'的格式說明符應該是什麼是。 –

+0

@JoachimIsaksson我可以改變這一點,我仍然得到錯誤的東西。 –

回答

1

小的重寫內循環。

1不需要size_t
2使用errno檢查strtull()是否成功。
3使用正確的unsigned long long說明符修飾符"ll"
失敗,因爲%s意味着假設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 
    } 
} 
+0

我不認爲unsigned long long會削減它,它無法在更大值。 –

+0

@PaulthePirate,如果'unsigned long long'不起作用,你的'strtoull'調用將會成爲一個問題。它*由定義*向你返回一個'unsigned long long'。你的'size_t'可能不是64位類型? –

+0

@CarlNorum是否有strt的size_t版本?或者有什麼方法可以存儲一行文本以直接進行比較?這可能會更容易。 –

1

%size_t是無稽之談 - 使用%zx打印十六進制值size_t。您%x不會工作,要麼 - 如果因爲您使用的非C99的編譯器/庫你沒有z修改,確保你匹配的變量類型和格式字符串:

printf("%llx\n", (unsigned long long)number); 
+0

哈,謝謝你清理他爲什麼會遇到'%zx'問題。 –