将十六进制数转换为十进制格式

将十六进制数转换为十进制格式

问题描述:

该代码读取一个带十六进制格式数字的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);'是未定义的行为!为什么你将流作为参数传递? –

  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 - 你能否把代码添加到你的答案中所以其他人可能受益? –