不从输入文件中打印正确的值

时间:2013-01-22 02:02:37

标签: c

有人能告诉我这里哪里出错吗?基本上我已经编写了一些代码,它们应该从文件中获取值,然后从文件中输出第一个值作为输出以及文件中的值数。

虽然我得到正确数量的值,但输出中打印的第一个值与我文件中的第一个值不同。这是代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    const char Project_Data[] = "filedata.dat";
    FILE *input = fopen(Project_Data, "r");

    int t = 0;
    int N = 0;
    float *a;

    a = (float*)malloc(N*sizeof(float));

    if(input != (FILE*) NULL)
    {
        while(fscanf(input, "%e", &a[t]) == 1)
        {
            N++;
            if(a[t] == EOF)
                break;
        }

        printf("first value in file: %e\n",a[0]);
        printf("number of values in file: %d\n", N);
    }
    else
        printf("coudlnt read input file.\n");

    return(0);
}

我觉得这与我如何使用malloc函数有关。如果是这样,我该如何正确使用它?我想从文件中读取我的值到数组大小N,但如果我事先不知道N的值,我怎么能这样做呢?


编辑:

这是文件中的一些值。这些值一个接一个地排序,它们之间有一个空格。因为值的数量非常大,所以它们在整个页面上形成了几个对角线(如果你之前已经有过)。

   9.0100000e+00   8.9663752e-01
   9.0200000e+00   1.5041077e+00
   9.0300000e+00   2.5992505e+00
   9.0400000e+00   1.5242828e+00
   9.0500000e+00   3.6815660e-01
   9.0600000e+00   5.4889676e-01
   9.0700000e+00   1.2371257e+00
   9.0800000e+00   1.2163317e+00
   9.0900000e+00   5.4318479e-01
   9.1000000e+00   1.5906641e+00
   9.1100000e+00   2.6775285e+00
   9.1200000e+00   1.1608307e+00
   9.1300000e+00   1.2084299e+00
   9.1400000e+00  -7.8752191e-01
   9.1500000e+00   6.4048690e-01
   9.1600000e+00   2.2727416e-02
   9.1700000e+00   1.0307653e+00
   9.1800000e+00   1.9435864e+00
   9.1900000e+00   2.9422693e+00
   9.2000000e+00   3.2184945e+00
   9.2100000e+00   1.3041157e+00
   9.2200000e+00   1.1018038e+00

左边的值不是订单;它们是真正的价值观,只是其他数据意味着我认为数据中的“噪音”。

3 个答案:

答案 0 :(得分:4)

a =(float *)malloc(N * sizeof(float));

由于N设置为0,你分配0个字节?这似乎非常错误。

答案 1 :(得分:0)

为什么不首先将数组分配给一个大的任意数字,比如1024,然后如果你确实需要节省空间,在知道你将收到多少输入后重新分配? 如果您获得的条目超过1024个,则重新分配到2048并继续保存值?

答案 2 :(得分:0)

您可以先分配一个数组,例如10个元素。在读取文件时,请记住增加索引变量(在您的示例中为t)。如果t大于分配的大小,请使用realloc将数组大小加倍。就我所知,这就是大多数动态矢量实现的工作方式。

这样的事情:

int capacity = 10;
float* a = (float*)malloc(capacity*sizeof(float));
int t = 0;    

while(fscanf(input, "%e", &a[t]) == 1) {
   t++;
   if (t >= capacity) {
      capacity *= 2;
      void* temp = realloc(a, capacity*sizeof(float));
      if (temp == 0) exit(1); // or handle allocation failure properly, a is still valid
      a = (float*)temp;
   }
}

此时a应包含您的商品,t应包含的商品数量。