2016-11-05 257 views
0

該代碼讀取一個帶十六進制格式數字的csv文件,將它們轉換爲十進制格式並將十進制數寫入另一個文件。將十六進制數轉換爲十進制格式

/* Author: Madalina Erascu*/ 
/* Input: csv file with numbers in hexa fomat 
    Output: csv file with numbers in decimal fomat with 80 decimals 
    Usage: main list_input_files list_output_files 
    Attention: function hex2double - the specifier llx might not give the same output on computers with other OS than Windows, MinGW compiler, etc. 
*/ 
#include <stdio.h> 
#include <stdlib.h> 

long double hex2double(const char *); 

int main(int argc, char *argv[]) 
{ 
    char buffer[1024] ; 
    char *record,*line; 
    long double x; 
    int i,j; 

    printf("argc = %d\n", argc); 
    for(i = 1; i <= argc/2; ++i) { 
     printf("argv[ %d ] = %s\n", i, argv[ i ]); 
     printf("argv[ %d ] = %s\n", (argc/2) + i, argv[ (argc/2) + i ]); 

     FILE *fstream_in = fopen(argv[ i   ],"r"); 
     FILE *fstream_out = fopen(argv[ (argc/2) + i ],"w"); 

     if(fstream_in == NULL) { 
      printf("\nFile opening failed:", fstream_in); 
      return -1 ; 
     } 

     int idx = 0; 

     while((line=fgets(buffer,sizeof(buffer),fstream_in))!=NULL) { 
      record = strtok(line,","); 
      while(record != NULL) { 
        idx++; 
        printf("String : %d|%s|\n",idx,record) ; 
        x = hex2double(record) ; 
        fprintf(fstream_out,"%.80e\n", x); 
        record = strtok(NULL,","); 
      } 
     } 
    } 
    return 0 ; 
    } 

long double hex2double(const char *s) 
{ 
    long double d = 0.0; 
    sscanf(s, "%llx", &d); 

    return d; 
} 

當我使用該文件在此鏈接輸入:

https://dl.dropboxusercontent.com/u/64621064/trigon_batch2.csv

文件中的第61個數字被分成2個數字。 hexa格式的數字實際上是浮點數,不是整數...

任何解釋?

+0

'unsigned long long'sscanf的'llx'。 – BLUEPIXY

+0

這個'printf(「\ nFile打開失敗:」,fstream_in);'是未定義的行爲!爲什麼你將流作爲參數傳遞? –

回答

0
  1. 不要使用sscanf()爲,使用strtoll()而不是像這樣

    return (double) strtoll(s, NULL, 16); 
    

    如果要檢查錯誤,通過非NULL指針作爲endptr並檢查沒有轉換的字符,你也可以用sscanf()查詢,但它不適合這種情況。

    此外,我不會寫這樣的代碼。我只是幫助你解決你的問題,我認爲這會做到。雖然,如果不讀取任何十進制值,將整數轉換爲double值沒有意義,那麼將其轉換爲double值沒有意義。

  2. 還有一個問題,你必須爲這個

    printf("\nFile opening failed:", fstream_in); 
    

    這是錯誤的多種原因:

    • 換行符用於控制的標準輸入輸出輸出功能的緩衝,他們據說是線緩衝,因此,'\n'字符「衝」「緩衝區,所以它是有道理的,它被放置在一個一行的結尾。

    • 這是不確定的行爲,因爲你將參數傳遞給printf()但沒有說明符吧,如果你想有一個消息,告訴該文件沒有打開的用戶,傳遞文件名這樣

      printf("failure opening %s\n", argv[i]); 
      
  3. 您也應該檢查你打開針對NULL寫文件,fopen()的唯一原因失敗是不是該文件不存在。考慮沒有權限寫入目標目錄,它也會返回NULL,然後你的代碼將調用UNDEFINED BEHAVIOR。

+0

return(double)strtoll(s,NULL,16);沒有解決。另外兩個建議是正交的,並且不能解決它......我編輯了最初的帖子;實際上在文件中第61個數字被分成2個數字。六進制格式的數字實際上是浮點數,而不是整數......所以很奇怪! –

+0

@MadalinaErascu你好,我已經解決了這個問題!你是對的,它們是浮點值,從 - * pi *到* pi * ...如果你想要代碼,請寫信給[email protected] –

+0

@iharob - 你能否把代碼添加到你的答案中所以其他人可能受益? –

相關問題