2013-01-22 26 views
0

有人可以告诉我我要在哪里出错吗?基本上我写了一些应该从文件中获取值的代码,然后从文件中输出第一个值作为输出以及文件中的值的数量。未从输入文件中打印正确的值

尽管我获得了正确数量的值,但我输出的第一个值与我的文件中的第一个值不同。这里是代码:

#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 

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

+0

你可以发布输入文件 - 至少是它的一部分吗? – user93353

+0

当然是 - 我现在编辑我的帖子 – user1988898

+1

'a [t] == EOF'?!? (是的,EOF是一个'int',但我非常怀疑你想要这个...... – vonbrand

回答

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项目的读取数量。

+0

你建议的作品!非常感谢你 - 我完全理解你的想法,所以希望我不应该再次遇到这个问题(另外感谢下面那个评论过同样想法的人,真的很感激)。 – user1988898

+0

请不要像那样使用'realloc'。如果你不分配一个临时变量,'realloc'失败将导致'a'的内存泄漏。 –

+0

嗯,我已经做了一些关于realloc应该如何使用的说明,并且我明白了你的意思。我一直在尝试上面提到的@jakber,但现在,当我尝试打印部分数组时,没有任何反应。我将继续摆弄几件事情,并希望它能够工作。 – user1988898

4

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

由于N设置为0,所以你分配0字节?这似乎很有问题。

+0

中 - 但我不确定它还有什么作用?我尝试了各种不同的东西,但我似乎无法得到正确的结果。 – user1988898

0

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