【问题标题】:Read double values from text file从文本文件中读取双精度值
【发布时间】:2020-06-26 12:32:47
【问题描述】:

我使用以下函数从文本文件中读取双精度值,然后将其转换为浮点数组,但最终在程序运行期间意外终止。谁能告诉我这里出了什么问题。

float *readFile_double_to_float(char *fileName, int fileSize)
{
    double *array = (double *)malloc(fileSize * sizeof(double *));
    float *array_float = (float *)malloc(fileSize * sizeof(float *));

    FILE *fp = fopen(fileName, "r");
    if (fp == NULL)
    {
        printf("Error: Cannot open file for reading ===> %s\n", fileName);
        exit(1);
    };
    for (int i = 0; i < fileSize; i++)
    {
        fscanf(fp, "%lf", array + i);
    };
    fclose(fp);

    for (int i = 0; i < fileSize; i++)
    {
        array_float[i] = (float)array[i];
    };

    printf("CHECK VAL DOUBLE TO FLOAT : float: %.20f | double: %.20f\n", array_float[0], array[0]);

    printf("FILE READ COMPLETED ===> %s\n", fileName);

    free(array);
    return array_float;
}

【问题讨论】:

  • sizeof(double *) 是指向double 的指针 的大小,而不是double 值。例如在32 位平台sizeof(double) 通常大于 比sizeof(double *),这意味着您不会分配足够的内存。
  • 为什么是临时的double 数组?为什么不直接读入float 数组呢?
  • 为什么要选角?除非你需要,否则不要施放。
  • 关于:double *array = (double *)malloc(fileSize * sizeof(double *)); 和 float *array_float = (float *)malloc(fileSize * sizeof(float *)); 1) 分配 double 或 float NOT double * 或 float * 2) 返回的类型是 void* 可以分配给任何指针,铸造只会使代码混乱并且容易出错。 3) 始终检查 (!=NULL) 返回值以确保操作成功。如果不成功 (==NULL) 则调用 perror( "malloc failed" ); 以便通知用户该问题。

标签: c floating-point


【解决方案1】:

分配了错误的大小。 @Some programmer dude

//                                          vvvvvvvvvvvvvvvv  size of a pointer
double *array = (double *)malloc(fileSize * sizeof(double *));

避免错误,drop the cast 并分配给引用数据的大小。更容易正确编码、审查和维护。

double *array = malloc(sizeof *array * fileSize);
//                     ^^^^^^^^^^^^^ Sizeof referenced data      

更好的代码也可以测试分配是否成功。

if (array == NULL) {
  fprintf(stderr, "Out of memory");
  return NULL;
}

更多信息请使用"%e"、"%g" 或"%a"。

//printf("CHECK VAL DOUBLE TO FLOAT : float: %.20f | double: %.20f\n", 
printf("CHECK VAL DOUBLE TO FLOAT : float: % .20e | double: % .20e\n", 
    array_float[0], array[0]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多