Thread 1: EXC_BAD_ACCESS (code=1, address=0x68) Xcode Си

Рейтинг: -1Ответов: 1Опубликовано: 14.08.2023
void readFile(FILE *dataBaseFile) {

    char gameName[100] = "\0";
    int publishingYear = 0;
    enum genre genre;
    long numberOfSells;
    char criticsChoice[5] = "\0";

    while (fscanf(dataBaseFile, "%s %d %d %ld %s", gameName, &publishingYear, &genre, &numberOfSells, criticsChoice) == 5) {
        lineCount++;
        if (strlen(gameName) > maxLen)
            maxLen = strlen(gameName);
        for (int j = 0; j < strlen(gameName); j++) {
            if (gameName[j] == '_')
                gameName[j] = ' ';
        }
        addNode(gameName, publishingYear, genre, numberOfSells, criticsChoice);
        for (int i = 0; i < maxLen; i++)
            gameName[i] = '\0';
    }
}
int main() {

    FILE *dataBaseFile = fopen("DataBaseItself.txt", "r+");
    readFile(dataBaseFile);
    fclose(dataBaseFile);
}

Еще раз добрый день. Вот такая процедура. Несколько часов пытаюсь разобраться в чем беда. Ошибка выдается в первом while. Не понимаю почему не работает... Более опытные люди, очень жду вашей помощи.

Ответы

▲ 2

Без файла с исходными данными сказать что-то конкретное трудно.
Но скорее всего у вас ошибка с enum.
Вот на эту запись компилятор выдает предупреждение, которое вы скорее всего проигнорировали - вы пытаетесь в переменную типа 'enum genre' вводить данные по формату переменной типа int.

fscanf(dataBaseFile, "%s %d %d %ld %s", gameName, &publishingYear, &genre, &numberOfSells, criticsChoice)

В принципе конечно genre и является int, но дьявол в деталях. Вы не привели файл исходных данных, но если в нем запись такая же, как в enum, то вы получите неопределенное поведение

enum genre{ One, Two, Three };

fscanf(..., "%s %d %d %ld %s", ..., ..., &genre, ..., ...)
// входные данные в файле
Doom 1999 One 5 А++  // ошибка, приводящая к UB!!!
Doom 1999 0 5 А++  // <--- должно быть так

В данном случае fscanf() в адрес переменной типа int начнет читать строку и данные в остальных переменных сместятся. Считывайте просто в переменную типа int, т.к. вы всё равно не проверяете на совпадение с каким-либо значением из enum. И записывайте так же.

int game_genre;
fscanf(..., "%s %d %d %ld %s", ..., ..., &game_genre, ..., ...)

addNode(..., ..., game_genre, ..., ...);

Ну и замечание - нет необходимости затирать gameName[100] нулями, т.к. функция scanf(), fscanf() при вводе строки дописывает ограничивающий ноль.

// вот это вообще не нужно!
for (int i = 0; i < maxLen; i++)
    gameName[i] = '\0';