gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:54:58 26 4
gpt4 key购买 nike

此代码读取包含十六进制格式数字的 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 个数字。十六进制格式的数字实际上是 float ,而不是整数...

有什么解释吗?

最佳答案

  1. 不要使用sscanf(),而是使用strtoll(),如下所示

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

    如果要检查错误,请传递一个非 NULL 指针作为 endptr 并检查未转换的字符,您还可以使用 sscanf 检查(),但它根本不适合这种情况。

    另外,我不会写这样的代码。我只是帮助你解决你的问题,我想这样就可以了。尽管如此,如果您在没有任何小数值的情况下读取整数,那么将整数转换为 double 是没有意义的,那么转换为 double 也是没有意义的。

  2. 您遇到的另一个问题是这个

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

    由于多种原因,这是错误的:

    • NEW LINE 字符用于控制 stdio 输出函数的缓冲,它们被称为行缓冲,因此,'\n' 字符“刷新”缓冲区,因此将其放置在行尾是有意义的。

    • 这是未定义的行为,因为您正在向 printf() 传递一个参数,但没有说明符,如果您想要一条消息告诉用户文件未打开,像这样传递文件名

      printf("failure opening %s\n", argv[i]);
  3. 您还应该检查您打开的写入文件是否为 NULLfopen() 失败的唯一原因并不是文件没有写入存在。考虑没有权限在目标目录中写入,它也会返回NULL,然后你的代码将调用UNDEFINED BEHAVIOR。

关于将十六进制数转换为十进制格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40437367/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com