将十六进制数转换为十进制格式
该代码读取一个带十六进制格式数字的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格式的数字实际上是浮点数,不是整数...
任何解释?
-
不要使用
sscanf()
为,使用strtoll()
而不是像这样return (double) strtoll(s, NULL, 16);
如果要检查错误,通过非
NULL
指针作为endptr
并检查没有转换的字符,你也可以用sscanf()
查询,但它不适合这种情况。此外,我不会写这样的代码。我只是帮助你解决你的问题,我认为这会做到。虽然,如果不读取任何十进制值,将整数转换为double值没有意义,那么将其转换为double值没有意义。
-
还有一个问题,你必须为这个
printf("\nFile opening failed:", fstream_in);
这是错误的多种原因:
换行符用于控制的标准输入输出输出功能的缓冲,他们据说是线缓冲,因此,
'\n'
字符“冲”“缓冲区,所以它是有道理的,它被放置在一个一行的结尾。-
这是不确定的行为,因为你将参数传递给
printf()
但没有说明符吧,如果你想有一个消息,告诉该文件没有打开的用户,传递文件名这样printf("failure opening %s\n", argv[i]);
您也应该检查你打开针对
NULL
写文件,fopen()
的唯一原因失败是不是该文件不存在。考虑没有权限写入目标目录,它也会返回NULL
,然后你的代码将调用UNDEFINED BEHAVIOR。
return(double)strtoll(s,NULL,16);没有解决。另外两个建议是正交的,并且不能解决它......我编辑了最初的帖子;实际上在文件中第61个数字被分成2个数字。六进制格式的数字实际上是浮点数,而不是整数......所以很奇怪! –
@MadalinaErascu你好,我已经解决了这个问题!你是对的,它们是浮点值,从 - * pi *到* pi * ...如果你想要代码,请写信给[email protected] –
@iharob - 你能否把代码添加到你的答案中所以其他人可能受益? –
'unsigned long long'sscanf的'llx'。 – BLUEPIXY
这个'printf(“\ nFile打开失败:”,fstream_in);'是未定义的行为!为什么你将流作为参数传递? –