我正在制作一个程序,我需要从文件中加载格式的一些浮点数据
103.45
123.45
456.67
......
我想知道如何使用fread()将这些数据直接存储到浮点数数组中。我想使用指针并不难,但我对它们并不是那么好。任何人都可以告诉我如何
答案 0 :(得分:4)
要从文件中读取数据,请使用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);
答案 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为止。