如何从C中的文件中读取float

时间:2011-05-08 07:05:05

标签: c

假设文件以这种方式组织:

1.2 # 3.4 # 4.0

2.3 # 2.3 # 1.2

在C中读取文件并将数据存储在数组中。同时,你应该判断有多少行。

我的问题是1)我不知道如何声明数组,因为我不知道文件中存在多少个数字,所以我应该先查看该文件并计算数字?

2)我不知道如何判断行号,因为文件中的最后一个'\ n'可能存在或不存在。

5 个答案:

答案 0 :(得分:1)

atof(ascii to float):

http://en.wikipedia.org/wiki/Atof

答案 1 :(得分:1)

使用fscanf

  

fscanf()函数应从命名输入流中读取。 [...]每个函数读取字节,根据格式解释它们,并将结果存储在其参数中。作为参数,每个都需要一个下面描述的控制字符串格式,以及一组指示转换输入应存储位置的指针参数。

答案 2 :(得分:1)

答案1)如果您事先不知道元素的数量,如何声明数组,使用原始向量无法解析,您将必须创建自己的增长能力向量。

typedef struct {
    double * v;
    unsigned int size;
} Vector;

此结构是新数据类型的基础。您需要一个API,例如:

Vector createVector();

void addToVector(Vector *v, double x);
double getFromVector(Vector *v, unsigned int pos);
void modifyInVector(Vector *v, unsigned int pos, double x);
unsigned int sizeOfVector(Vector * v);

void destroyVector(Vector *v);

API的关键成员是createVector,destroyVector和addToVector。由于这可能是家庭作业,我不会解决这个问题。

在createVector中,您基本上必须将所有字段都设置为0。 在destroyVector中,你必须free()v; 在addToVector中,您必须调整保留空间的大小(),以便另一个新项目适合:

size_t newSize = ( v->size +1 ) * sizeof( double );

现在你必须用新的大小调用realloc()。

这基本上都是。如果想要更好的性能,还可以引入向量的容量,这样每次添加新值时都不必增长。例如,在C ++中构建STL的人使每次超出容量时矢量类增长到两倍。但是,无论如何,这是另一个故事。

答案 3 :(得分:0)

以下代码从stdin控制台读取,以您提供的格式处理数字并再次打印出来,以便检查是否正确。

#include <stdio.h>

int main(int ac, char *av[])
{
    float a, b, c;
    scanf("%f # %f # %f", &a, &b, &c);
    printf("%f # %f # %f", a, b, c);
    printf("\n");
}

尽管此代码有效,但它不是很强大。它需要数字之间字符的精确序列' # ',并且在连续的最后一个数字之后只允许换行。

对于更强大的解决方案,您必须找到每个数字开头的字符索引,并在该位置执行fscanf

答案 4 :(得分:0)

浮点具有小数分数的精度损失。例如,像“0.1”这样的简单数字需要无限多的位来准确表示它。

对于您显示的数字(小数点后只有一位数字),更好的想法是将每个数字乘以10,以避免浮点引起的精度损失。这将涉及编写您自己的“ASCII到整数”转换例程,该例程假装小数点位于其实际位置右侧的一个位置。它还可以节省空间,因为(对于您显示的数字,没有数字大于25.6)您可以将它们存储在8位整数(字符)数组中。

祝你的作业好运!