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 の値がわからない場合はどうすればよいですか?


編集:

ファイルの値の一部を次に示します。値は、間に 1 つのスペースを入れて順番に並べられます。値の数が非常に多いため、ページ全体にいくつかの対角線が形成されます (以前に使用したことがある場合)。

   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

左側の値は注文ではありません。それらは本物の値です。他のデータは、私が考えるデータの「ノイズ」であることを意図しているだけです。

4

3 に答える 3

4

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

Nが0に設定されているので、0バイトを割り当てていますか?それは非常にバグがあるようです。

于 2013-01-22T02:05:47.550 に答える
0

最初は、たとえば 10 個の要素を持つ配列を割り当てることができます。ファイルの読み取り中は、インデックス変数を増やすことを忘れないでください (例では t )。t が割り当てられたサイズよりも大きくなる場合は、realloc を使用して配列のサイズを 2 倍にします。これは、私の知る限り、ほとんどの動的ベクトル実装がどのように機能するかです。

このようなもの:

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

于 2013-01-22T03:05:11.260 に答える
0

最初に配列を 1024 などの大きな任意の数に割り当ててから、実際にスペースを節約する必要がある場合は、受信する入力の量を把握してから再割り当てしないでください。1024 を超えるエントリを取得した場合は、2048 に再割り当てして値を保存し続けますか?

于 2013-01-22T02:58:25.607 に答える