将数据读入C中的浮点数组

时间:2009-12-05 17:22:47

标签: c pointers file-io fread

我正在制作一个程序,我需要从文件中加载格式的一些浮点数据 103.45
123.45
456.67
......

我想知道如何使用fread()将这些数据直接存储到浮点数数组中。我想使用指针并不难,但我对它们并不是那么好。任何人都可以告诉我如何

5 个答案:

答案 0 :(得分:4)

要从文件中读取数据,请使用fgets()sscanf()

/* needs validation and error checking */
fgets(buf, sizeof buf, fp);
sscanf(buf, "%f", &tmp);

要管理浮动数,您有两种选择。

  1. 使用固定大小的数组
  2. 使用malloc()realloc()和朋友使用可扩展的数组

  3. /* 1. use an array of fixed size */
    float array[1000];
    

    /* 2. use `malloc()`, `realloc()` and friends for a growable array */
    float *array;
    array = malloc(1000 * sizeof *array);
    /* ... start loop to read floats ... */
        if (array_needs_to_grow) {
            float *tmp = realloc(array, new_size);
            if (tmp == NULL) /* oops, error: no memory */;
            array = tmp;
        }
    /* end reading loop */
    /* ... use array ... */
    free(array);
    

答案 1 :(得分:3)

不确定你还需要什么,但这解决了问题的本质:

int j = 0;
double flts [20000];
while (!feof(f))
{
    if (fscanf (f, "%g", &flts [j]) == 1) 
        ++j; // if converted a value okay, increment counter
}

答案 2 :(得分:2)

您无法使用fread,因为它不会解析您拥有的文件格式。 fread只是将字节读入一个字节数组,你所拥有的数字是以人类可读的十进制形式写出来的。

我认为对于这种格式,您可以使用的最直接方式是在循环中使用fscanf,确保检查返回值,并在失败时ferror和/或{ {1}}检查您是否遇到文件末尾或其他错误。

答案 3 :(得分:2)

除非您的数据文件是二进制格式,否则您无法使用。你正在显示一个plaint文本文件:为了将它变成一个数组,你需要做几件事:找出数组中需要多少项(行数?),分配数组,然后转换和将每个值放在数组中。例如,可以使用scanf完成转换。

答案 4 :(得分:0)

由于这看起来像是一个带有ASCII的文件,我发布了以下策略。但是,您似乎建议该文件包含二进制数据。这个假设是基于你试图用fread()读取它的事实。

一直从文件中读取一行,并将文件中的字符串输入解析为浮点数,直到文件返回EOF为止。