2012-01-14 6 views
1

このコードがセグメンテーションフォールトになっている理由を聞いてみてください。私は、テキストファイルからの入力を取得しようとしていると私は問題が何であるか把握することはできません。ファイルアクセスのセグメンテーションフォールト

using namespace std; 
using namespace cv; 

int main() 
{ 
    char str[50]; 
    FILE *trainfile; 
    int k, n, maxval1, maxval2, classnum; 
    char dataArray[n][3]; 

    trainfile = fopen("training.txt", "r+"); 

    if(trainfile == NULL){ 
     perror("Cannot open file.\n"); 
    }else{ 
     while(!feof(trainfile)){ 
      fscanf(trainfile, "%s", str);  
     } 
    } 
    fclose(trainfile); 

    return 0; 
} 
+1

50文字で十分ですか?また、trainfile == NULLならば、fclose(NULL)を呼び出す。 – slezica

答えて

0

1つの問題は、バッファが十分に大きくない可能性があることです。

ファイルのサイズを取得してから、そのサイズの動的バッファを作成し、最後にファイルを読み込む必要があります。

fseek(trainfile,0,SEEK_END); //Go to end 
int size = ftell(trainfile); //Tell offset of end from beginning 
char* buffer = malloc(size); //Make a buffer of the right size 

fseek(ftrainfile,0,SEEK_SET); //Rewind the file 

//Read file here with buffer 
3
int k, n, maxval1, maxval2, classnum; 
char dataArray[n][3]; 

n初期化されませんので、任意の値とすることができるので、あなたのコードが未定義の動作を持っています。

err ...それはとにかく使用されていません。

コード内の他の問題は、データバッファである:

char str[50]; 

は、それはおそらくないと未定義の動作の原因となるファイルの内容を保持するのに十分な大きさでなければなりません。

+0

'str'はファイル全体を保持する必要はありませんが、一般的に連続していない連続した空白以外の文字列を保持する必要はありません。ファイルが英語のプレーンテキストの場合は、おそらく50で十分です。しかし、セグメンテーションがあったので、ファイルはおそらくそうではありませんでした。 –

関連する問題