2012-01-03 14 views
0

可能性の重複:
C dynamically growing array未知数のフロートをファイルから読み取るには?

私はプログラムを持っていると私は、ファイルから山車を読む必要があります。各行は1つの浮動小数点数です。問題は、このファイルが非常に大きい可能性があるということです。

float tab[1000];  
  
f = fopen ("data.txt", "r"); 
 i=0;   
 while (feof(f) == 0) {         
    fscanf (f, "%f\n", &tab[i]);                 
    i++;     
} 

小さすぎる場合、どうすれば配列動力学のサイズを変更できますか?

+1

これは間違いなく重複しているはずです:Cで成長する配列を扱う一般的なイディオムは何ですか? –

+1

'float'を読み込むための変換指定子が' f'でない 'd' – ouah

+0

http://stackoverflow.com/questions/3536153/c-dynamically-growing-array、http://stackoverflow.com/questions/3294396/ reallocating-an-array-c99、http://stackoverflow.com/questions/8338431/dynamic-array-using-ansi-c –

答えて

6

適切なサイズ(malloc)から始めて、必要に応じてreallocに移動してください。

double *tab; 
int num = 1000; 

tab = malloc(num * sizeof *tab); 

while (..) { 
    if (i >= num) 
     num *= 2; 

    tab = realloc(tab, num * sizeof *tab); 
    /* ... */ 
} 
  • あなたはサイズを2倍にするとあなたはおそらく結果をチェックする必要がありますちょうど1
  • である、あなたは異なるreallocの戦略を試すことができますあまりにも多くのメモリ
  • を必要とせずに、ほとんどの入力をカバーして初期サイズを試してみてくださいmallocrealloc
0

のは手動を使用してメモリを割り当てる必要が。小額の電話を受ける場合はreallocとしてください。

0

スタックに割り当てられている場合、アレイのサイズを動的に変更することはできません。あなたは、同時にメモリにそれらすべてが必要な場合@cnicutarが示唆するように、おそらく最良の解決策である、mallocrealloc

tab = calloc(1000, sizeof(float)); 

... 

// need to resize 
tmp = realloc(tab, (1000 + NUM_NEW_ELEMENTS) * sizeof(float)); 
if (tmp != NULL) 
    tab = tmp; 
+0

'calloc()'は割り当てられたスペースを全ビットゼロに設定します。これはしばしば無駄です。標準では、浮動小数点0が保証されていません。0は全ビット0で表され、コードが正しく書かれていれば、配列の要素を参照することはありません。 'float * tab; tab = malloc(1000 * sizeof * tab);はよりクリーンです。 (または、 'tab'を' NULL'に初期化し、* every *割り当てに 'realloc()'を使用するだけです) –

3

:あなたはこのようなものが必要。

しかし、多くの問題では、一度に1つの値を処理する必要があります。あなたがファイルの終わりに達するまで読書を続けてください。それは問題の性質に依存します。

そして、あなたはあなたのコード内のいくつかの問題修正する必要があります。

  • "%d"int*引数を期待します。 "%f"を使用してfloatデータを読んでください。
  • feof(f)を使用してファイルの終わりを検出しないでください。 fscanf()(または使用している入力ルーチン)の値を確認してください。 feof()は、ファイルの通常の終了条件とエラー条件を区別するために使用され、入力機能が既にデータが不足していることを通知した後にのみ使用する必要があります。
+0

*ファイルの終わりを検出するためにfeof(f)を使用しないでください* +1、 。 – cnicutar

関連する問題