Рекурсивная запись узлов из абинального дерева в файл и последующее чтение значений из файла с помощью системного вызова - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть одна c программа, которая создает двоичное дерево и записывает в файл, используя системный вызов open и write. В другой программе c я пытаюсь открыть файл и прочитать все содержимое. Однако, когда я пытаюсь это сделать, он читает только первую строку файла.

Я изолировал проблему, чтобы что-то пошло не так при записи в файл.

Когда я запускаю первую программу, файл успешно создается, но когда я пытаюсь открыть его в vscode, он говорит, что файл не может быть открыт из-за того, что он кодируется неузнаваемым способом. Однако, когда я использую общий "cat file.txt", он выводит ожидаемое содержимое на консоль. Причина, по которой я думаю, что ошибка заключается в функции записи в файл, заключается в том, что если я вручную создаю файл и ctrl c и ctrl p выводим в него «cat file.txt» и пытаемся прочитать этот файл, все работает. Поэтому я предполагаю, что проблема заключается в том, как я пишу в файл.

КАК ДЕРЕВО ПРОЧИТАЕТ В ФАЙЛ: При записи двоичного дерева в файл. Сначала я создаю и открываю файл для записи. Затем я передаю файловый дескриптор функции, которая рекурсивно обходит дерево, находит все узлы и записывает их в файл. Затем закрывает дескриптор файла.

******** Вот код для записи дерева в файл *******

void constructFile(int fd, MinHeapNode *root, int encoding[], int top)
{   
    int num_written = 0;
    char tab = '\t';
    char nl = '\n';
    if (root->right) 
    { 
        encoding[top] = 1; 
        constructFile(fd, root->right, encoding, top + 1); 
    }
    if (root->left) 
    { 
        encoding[top] = 0; 
        constructFile(fd, root->left, encoding, top + 1); 
    } 

    //if leaf is reached then print out the data and freq

    if (isLeaf(root)) { 

        int i; 
        for (i = 0; i < top; ++i){
            //printf("%d", encoding[i]);
            int code = encoding[i];
            char c = code + '0';

            num_written = write(fd, &c, sizeof(c));
            if(num_written == -1){
                printf("Unable to write file\n");
                exit(1);
            }
        }

        num_written = write(fd, &tab, sizeof(tab));
        if(num_written == -1){
            printf("Unable to write file\n");
            exit(1);
        }
        //printf("    %s", root->data);
        num_written = write(fd, root->data, sizeof(root->data));
        if(num_written == -1){
            printf("Unable to write file\n");
            exit(1);
        }
        //printf("\n"); 
        num_written = write(fd, &nl, sizeof(nl));
        if(num_written == -1){
            printf("Unable to write file\n");
            exit(1);
        }
    }   
}
int main(){
 int fd = open("codebook", O_WRONLY, 0600);
    if(fd == -1){
        printf("file error");
        exit(1);
    }
    //call constructFile;
     close(fd);
     return 0; 
}

Я могу рассчитывать только на системные вызовы для открытия читать и писать, так что не пишите: (

Я пытался это исправить, но, похоже, не могу этого сделать. Я довольно новичок в C и был бы очень признателен всем, кто имеет представление об этом.

Спасибо!

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