0

エラーなしでうまく動作するプログラムを書きました。テキスト ファイルを読み取り、内容を配列に書き込みます (行ごとに、この行の文字列を 1 つずつ区切ります)。次に、2 番目のテキスト ファイルを追加し、再度コンテンツを読み取ろうとしましたが、プログラムをデバッグするときにのみ報告されるクレイジーなセグメンテーション エラーが発生しました。

これは、エラーの原因となるプログラムの一部です。

vrFile = fopen("file.txt","r");

//some temporary arrays
    float taz[5000], tel[5000], ttime[5000], tvr[5000][nbins], tdbz[5000][nbins];

    int size = 1024, pos;
    int c;
//buffer for the line to read
    char *buffervr = (char *)malloc(size);
    int lin=0;

    if(vrFile) {
      do { // read all lines in file
        pos = 0;
        do{ // read one line
            c = fgetc(vrFile);
          if(c != EOF) buffervr[pos++] = (char)c;
          if(pos >= size - 1) { // increase buffer length if line is too long - leave room for 0
            size *=2;
            buffervr = (char*)realloc(buffervr, size);
          }
        }while(c != EOF && c != '\n');
        buffervr[pos] = 0;
        // line is now in buffer


        char *ptr;
        ptr = strtok(buffervr,"\t");
        int abs=1;
        while(ptr != NULL) {
            if(abs==1){
                taz[lin] = atof(ptr);
            }
            else if(abs==2) {
                tel[lin] = atof(ptr);
            }
            else if (abs==3) {
                ttime[lin] = atof(ptr);
            }
            else {
                tvr[lin][abs-4]=atof(ptr);
            }
            abs++;

            ptr = strtok(NULL, "\t");

        }
            lin++;
      } while(c != EOF);
      fclose(vrFile);
    }
    //free(buffervr);

まず、バッファを割り当てようとするとセグメンテーション違反が発生しchar *buffervr = (char *)malloc(size);ます。配列を割り当てる前にこれを行うと、float taz[5000], tel[5000], ttime[5000], tvr[5000][nbins], tdbz[5000][nbins];機能しますか?!

c = fgetc(vrFile);2つ目は、ファイルを開くことはできますが、ファイルを読み取る ことができないことです。ここで、別のセグメンテーション違反が発生しますか?!

誰かが私にそれが間違っていたことを教えてもらえますか?

ありがとうございました!

編集:実際のコード:

int size = 1024, pos;
    int c, cdbz;
    char *buffervr = (char *)malloc(size);
    char *bufferdbz = (char *)malloc(size);
    int lin=0;
    char *taz, *tel, *ttime, **tvr, **tdbz;
    taz=(char *) malloc(5000*sizeof(char));
    tel=(char *) malloc(5000*sizeof(char));
    ttime=(char *) malloc(5000*sizeof(char));

    tvr = malloc(5000 * sizeof(char *));
    int i;
    for(i = 0; i < 5000; i++) {
    tvr[i] = malloc(nbins * sizeof(char));
    }

    tdbz = malloc(5000 * sizeof(char *));
    for(i = 0; i < 5000; i++) {
    tdbz[i] = malloc(nbins * sizeof(char));
    }


    //float taz[5000], tel[5000], ttime[5000], tvr[5000][nbins], tdbz[5000][nbins];
    if(vrFile!=NULL) {
      do { // read all lines in file
        pos = 0;
        do{ // read one line
            c = fgetc(vrFile);
          if(c != EOF) buffervr[pos++] = (char)c;
          if(pos >= size - 1) { // increase buffer length - leave room for 0
            size *=2;
            buffervr = (char*)realloc(buffervr, size);
          }
        }while(c != EOF && c != '\n');
        buffervr[pos] = 0;
        // line is now in buffer

        char *ptr;
        ptr = strtok(buffervr,"\t");
        int abs=1;
        while(ptr != NULL) {
            if(abs==1){
                taz[lin] = (ptr);
            }
            else if(abs==2) {
                tel[lin] = (ptr);
            }
            else if (abs==3) {
                ttime[lin] = (ptr);
            }
            else {
                tvr[lin][abs-4]=(ptr);
            }
            abs++;

            ptr = strtok(NULL, "\t");

        }
            lin++;
      } while(c != EOF);
      fclose(vrFile);
    }
    free(buffervr);


.
.
.


int lins,abss;
    for (lins=0; lins<lin; lins++)
    {
        time[0]=ttime[lins];
        az[0]=taz[lins];
        el[0]=tel[lins];
        for (abss=0; abss<nbins; abss++)
        {
            vr[abss]=tvr[lins][abss];
            //dbZ[abss]=tdbz[lins][abss];
        }

    }

注: time、lat、lon、az、el、および vr はポインターです。

編集:私はこの方法で問題を解決しました:

vrFile = fopen("file.txt","r");

if (vrFile != NULL){
    while ((getline(&line, &len, vrFile)) != -1) {
        NumberOfLines++;
        if(NumberOfLines == 1){
            line = strtok(line, "\t");
            while(line != NULL){
                NumberOfDoubles++;
                line = strtok(NULL, "\t");
            }
        }
    }
}

rewind(vrFile);

int i,j;

float*  taz;
float*  tel;
float*  ttime;
float** tvr;
float** tdbz;

//1D Arrays
taz   = (float*) malloc (sizeof(float)*NumberOfLines);
tel   = (float*) malloc (sizeof(float)*NumberOfLines);
ttime = (float*) malloc (sizeof(float)*NumberOfLines);

//2D Arrays
tvr   = (float**) malloc (sizeof(float*)*NumberOfLines);
for(i=0;i<NumberOfLines;i++){
    tvr[i]   = (float*) malloc (sizeof(float)*NumberOfDoubles);
}
tdbz   = (float**) malloc (sizeof(float*)*NumberOfLines);
for(i=0;i<NumberOfLines;i++){
    tdbz[i]   = (float*) malloc (sizeof(float)*NumberOfDoubles);
}


if (vrFile != NULL){
    i = 0;
    while ((getline(&line, &len, vrFile)) != -1) {
        line = strtok(line, "\t");
        j = -3;
        while(line != NULL){
            switch(j){
                case -3: taz[i]    = strtod(line, NULL);break;
                case -2: tel[i]    = strtod(line, NULL);break;
                case -1: ttime[i]  = strtod(line, NULL);break;
                default: tvr[i][j] = strtod(line, NULL);break;

            }
            line = strtok(NULL, "\t");
            j++;
        }
        i++;
    }
}
4

0 に答える 0