Ошибка сегментации при доступе к файлу - PullRequest
1 голос
/ 14 января 2012

Могу я просто спросить, почему этот фрагмент кода приводит к ошибке сегментации.Я пытаюсь получить ввод из текстового файла, и я не могу понять, в чем проблема.

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

Ответы [ 2 ]

3 голосов
/ 14 января 2012
int k, n, maxval1, maxval2, classnum;
char dataArray[n][3];

n не инициализируется, поэтому может иметь любое значение, и, следовательно, ваш код имеет неопределенное поведение .

эээ ... это не используется в любом случае.

Другая проблема в коде - ваш буфер данных:

char str[50];

должен быть достаточно большим, чтобы вместить содержимое файла, что, вероятно, не является и вызывает неопределенное поведение .

0 голосов
/ 14 января 2012

Одна проблема в том, что ваш буфер может быть недостаточно большим.

Сначала вы должны получить размер файла, затем создать динамический буфер этого размера и, наконец, прочитать файл.

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
...