【问题标题】:How to read float from a file in C如何从C中的文件中读取浮点数
【发布时间】:2011-05-08 07:05:05
【问题描述】:

假设文件是​​这样组织的:

1.2 # 3.4 # 4.0

2.3 # 2.3 # 1.2

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

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

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

【问题讨论】:

  • 这是作业吗?如果是的话,你应该这样标记它。
  • 我闻到了一道作业题...

标签: c


【解决方案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 中,您必须 resize() 保留空间以便适合另一个新项目:

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

现在您必须使用新大小调用 realloc()。

基本上就是这样。如果你想要更好的性能,你还可以引入向量的容量,这样就不必每次添加新值时都让它增长。例如,使用 C++ 构建 STL 的人每次超过容量时都会使向量类增长一倍。但是,无论如何,那是另一回事了。

【讨论】:

    【解决方案2】:

    atof (ascii to float):

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

    【讨论】:

      【解决方案3】:

      使用fscanf:

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

      【讨论】:

        【解决方案4】:

        以下代码从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

        【讨论】:

          【解决方案5】:

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

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

          祝你作业顺利!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-10-19
            • 1970-01-01
            • 1970-01-01
            • 2011-02-15
            • 2012-01-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多