我正在制作一个程序,我需要从文件
103.45
123.45
456.67加载一些格式的浮点数据
......
我想知道如何使用 fread() 将这些数据直接存储到浮点数数组中。我想使用指针并不难,但我对它们不太好。谁能告诉我怎么做
要从文件中读取数据,请使用fgets()
和sscanf()
。
/* needs validation and error checking */
fgets(buf, sizeof buf, fp);
sscanf(buf, "%f", &tmp);
要管理浮点数,您有两种选择。
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);
不知道你还需要什么,但这解决了问题的本质:
int j = 0;
double flts [20000];
while (!feof(f))
{
if (fscanf (f, "%g", &flts [j]) == 1)
++j; // if converted a value okay, increment counter
}
除非您的数据文件是二进制 fromat,否则您不能。您正在显示一个纯文本文件:为了将其放入数组中,您需要做几件事:找出数组中需要多少项目(行数?),分配数组,然后转换和将每个值放入数组中。例如,可以使用 scanf 进行转换。
您不能使用fread
它,因为它不会解析您拥有的文件形式。fread
只是将字节读入一个字节数组,而你所拥有的是以人类可读的十进制形式写出的数字。
我认为对于这种格式,您可以使用的最直接的方法是fscanf
在循环中使用,确保检查返回值,如果失败,ferror
和/或feof
检查您是否遇到文件末尾或其他错误。
由于这看起来像一个包含 ASCII 的文件,因此我发布了以下策略。但是,您似乎建议该文件包含二进制数据。这个假设是基于您尝试使用 fread() 读取它的事实。
继续从文件中一次读取一行,并将文件中的字符串输入解析为浮点数,这样做直到文件返回 EOF。