Нарушение прав чтения: дерево было 0xAE0A74BF - PullRequest
0 голосов
/ 01 июля 2019

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

void treeprintprime(tNode* tree) {

FILE* lasttree = fopen("lasttree.txt", "a");

if (tree != NULL) {
    fprintf(lasttree, "%d ", tree->key); //error happens here
    treeprintprime(tree->right);
    treeprintprime(tree->left);
    cout << tree->key << " ";
}
fclose(lasttree);
}

void delete_node() {
int key;
FILE* lasttree = fopen("lasttree.txt", "r+");
struct tNode* root = NULL;
while (fscanf(lasttree, "%d", &key) == 1)
{
    root = addNode(key, root);
}
printf("What element and his subtree do you want to delete? \n");
printf(">> ");
fclose(lasttree);
key = scanfunction(); 
searchtodeleteNode(key, root);
treeprintprime(root);
freemem(root);
printf("\n");
printf("\n");
}

Я изменил код.

1 Ответ

1 голос
/ 01 июля 2019

Функция treeprintprime является рекурсивной функцией.

Он открывает файл, добавляет значение ключа, а затем повторяется. Если это был NULL-узел, файл был открыт без всякой цели. И только после того, как рекурсия вернулась, он закрывает файл.

Итак, вы открыли несколько (одинаковых) файлов, которые не закрываете до позднего времени.

В случае отсутствия кода, который можно попробовать, я предлагаю открыть и закрыть файл непосредственно до и после добавления, например

void treeprintprime(tNode* tree) {
    if (tree != NULL) {
        FILE* lasttree = fopen("lasttree.txt", "a"); // move the open function to here
        // ** note check result of fopen() **
        fprintf(lasttree, "%d ", tree->key);
        fclose(lasttree);                            // move the close function to here
        treeprintprime(tree->right);
        treeprintprime(tree->left);
        cout << tree->key << " ";                    // note this is C++ in tagged C code
    }
}

Но еще лучше было бы открыть файл перед обходом дерева и затем закрыть его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...