2012-04-13 15 views
0

構造体を作成し、そのID番号、その値、およびステータスを持っています。 私は、データ(1 199 0 2 199 1 ...)1から成るファイルを持っています。数字は199、値は0、ステータスは0です。このように進んでいます... 私は1つの関数を呼び出しました一度に3つの数値を読み込むためのfilldata()は、たとえば1 199 0であり、構造体配列の渡された要素に入れます。 そして、私はこの関数をstruct配列を埋めるために呼び出す別の関数を使用しました。 fillAll関数は、ファイルから構造体配列にコピーされたデータセットを返します。 しかし、セグメント化エラーが発生しました。どんな考え?あなた繰り返し開いたファイル名filelocation構造体の配列を扱う際のセグメンテーションエラー

int filldata(struct Data_point *a, const char *filelocation) 
    { 

     FILE *f; 
     if((f=fopen(filelocation,"r"))==NULL) 
      printf("You cannot open"); 

     if(fscanf(f, "%ld%lf%d", &(a->sampleNumber), &(a->value), &(a->status)) == 3) 
      return 1; 
     else 
      return 0; 
    } 

    int fillAll(struct Data_point *a, const char *filelocation)// I will pass the struct array and the location of my file string 
    { 
     int index=0; 
     while(filldata(&a[index], filelocation)) 
      index++; 

     return index; 
    } 
+0

これは明らかに、配列に要素があるよりも多くのトリプレットが含まれていると、データファイルが配列サイズをオーバーランさせることがあります。 –

+0

fopen()が失敗した場合、メッセージを出力するだけでなく、 'return'して残りのコードの実行も停止します。 – karlphillip

+0

@Amardeep、テスト目的のために、私の配列が非常に大きく、私のファイル内のデータセットは非常に小さいです –

答えて

2

が、ファイルハンドルfを閉じることはありません: コードは、より良い説明します。最初の行を何度も何度も読み続けると、最終的にファイルハンドルがなくなります。

あなたは私以下のスニペットを確認するファイルポインタを取るためにfilldataを変更することができますが いくつかの追加のチェックを追加した、あなたもsize of Data_point *aをチェックする必要がありますが

int filldata(struct Data_point *a, File *f) 


    if(fscanf(f, "%ld%lf%d", &(a->sampleNumber), &(a->value), &(a->status)) == 3) 
     return 1; 
    else 
     return 0; 
} 

int fillAll(struct Data_point *a, const int data_point_size,const char *filelocation)// I will pass the struct array and the location of my file string 
{ 

    FILE *f; 
    if((f=fopen(filelocation,"r"))==NULL) { 
     printf("You cannot open"); 
     return 0; 
    } 


    int index=0; 
    while(index < data_point_size && filldata(&a[index])) { 
     index++; 
    } 
    fclose(f); 
    return (index != data_point_size); 
} 
+0

そうです。 最初の行を読み、次に2番目と3番目にどう読むのですか? –

+0

@qwrqwr編集の回答 – keety

+0

あなたはfを最初の関数に複製していますか? –

0

をそれを埋めるよう 割り当てられた範囲内にありますwhileループのためにセグメンテーション違反が発生しています。 filldataが0を返すまでは、決して停止しません。その前に、あなたのプログラムは、& [index]を渡すときに、すでに配列の境界を越えているでしょう。また、プログラムが最初にfscanf()内のバインドされていないメモリにアクセスしようとすると、実行時エラーが発生したり、ガーベジ・バリューを取って、それをaとみなしたりして、filldataが0を返すという保証はないと思います。成功。

私が間違っている場合は私を修正してください。

関連する問題