0

構造体を作成しましたが、その ID 番号、値、およびステータスがあります。データで構成されるファイルがあります(1 199 0 2 199 1...) 1 は数値、199 は値、0 はステータスで、このように続けます... filldata( という 1 つの関数を使用しました) を使用して、一度に 3 つの数値 (たとえば 1 199 0) を読み取り、それを構造体配列の渡された要素に入れます。次に、別の関数を使用して this 関数を呼び出し、構造体配列を埋めました。fillAll 関数は、ファイルから構造体配列にコピーされたデータのセットを返しますが、セグメンテーション違反を受け取りました。理由はありますか?コードはよりよく説明します:

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;
    }
4

2 に答える 2

2

filename を繰り返し開きますfilelocationが、ファイル ハンドルは決して閉じません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);
 }
于 2012-04-13T19:12:58.173 に答える
0

while ループが原因で、セグメンテーション違反が発生しています。これは、filldata が 0 を返すまで決して停止しません。それが起こる前に、プログラムは &a[index] を渡すときに、配列の境界を既に超えています。また、プログラムが最初に fscanf() で範囲外のメモリにアクセスしようとするため、filldata が 0 を返すという保証はなく、実行時エラーが発生するか、ガベージ値を取得してそれを成功。

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

于 2012-04-13T19:22:13.510 に答える