2

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

我想知道如何使用 fread() 将这些数据直接存储到浮点数数组中。我想使用指针并不难,但我对它们不太好。谁能告诉我怎么做

4

5 回答 5

4

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

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

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

  1. 使用固定大小的数组
  2. 使用malloc(),realloc()和朋友组成一个可增长的数组

/* 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);
于 2009-12-05T17:53:56.897 回答
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
}
于 2009-12-05T17:45:57.243 回答
2

除非您的数据文件是二进制 fromat,否则您不能。您正在显示一个纯文本文件:为了将其放入数组中,您需要做几件事:找出数组中需要多少项目(行数?),分配数组,然后转换和将每个值放入数组中。例如,可以使用 scanf 进行转换。

于 2009-12-05T17:26:51.307 回答
2

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

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

于 2009-12-05T17:26:11.917 回答
0

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

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

于 2009-12-05T17:27:40.077 回答