Как вывести дерево AVL в файл при обходе по порядку?

#c

Вопрос:

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

 void in_order(AVLTree* root) 
{
    ofstream printToFile("output.txt");

    if (root == NULL)
        return;

    in_order(root->left);
    printToFile << root->data << " ";
    in_order(root->right);
}

int main() 
{
    AVLTree* root = NULL;
    ifstream readFromFile("input.txt");
    int node;

    while (!readFromFile.eof()) 
    {
        readFromFile >> node;
        root = insert(root, node);
    }
    in_order(root);
}
 

Вот пример входного файла:

 9 20 60 10 30 90 42
 

Когда я запускаю вышеуказанную программу, выходной файл содержит только 1 число:

 20
 

Если я распечатаю его на экране консоли вместо печати в файл, это правильно:

 9 10 20 30 42 60 90
 

Я не знаю, почему, когда я печатаю его на экране консоли, он правильный, но когда я выводю его в файл, он содержит только 1 число. Кто-нибудь может мне в этом помочь? Спасибо за вашу помощь!

Ответ №1:

Проблема с вашим кодом может быть связана с тем, что в рекурсии вы создаете заново ofstream printToFile("output.txt"); . ofstream буферизует вывод и очищает его (т. Е. выводит в файл) в деструкторе, что происходит не в том порядке, в котором вы выводите данные в файле

Решением этой проблемы может быть создание этой переменной в качестве статической переменной или передача потока в качестве аргумента или принудительный вывод содержимого буфера в файл с использованием flush (но не уверен, поможет ли это).

Так что это выглядело бы так

 // static stream
void static_in_order(AVLTree* root) 
{
    static ofstream printToFile("output.txt");

    if (root == NULL)
        return;

    in_order(root->left);
    printToFile << root->data << " ";
    in_order(root->right);
}


//stream as argument
void arg_in_order(AVLTree* root, ofstream amp;printToFile) 
{
    if (root == NULL)
        return;

    in_order(root->left, printToFile);
    printToFile << root->data << " ";
    in_order(root->right, printToFile);
}

int main()
{
    //static solution 
    static_in_order(root);

    //arg solution
    ofstream printToFile("file.txt");
    arg_in_order(root, printToFile);
}
 

Ответ №2:

Вы должны использовать std::ofstream ofs ("output.txt", std::ofstream::app);
Если вы не добавляете параметр mode, он использует std::ofstream::out значение по умолчанию, которое выводит ваши данные в начало файла.

И не забудьте позвонить std::ofstream::close(); после завершения вывода, иначе могут быть потеряны данные в буфере.

Может быть, лучший способ:

 void in_order(std::ofstreamamp; ofs, AVLTree* root)
{
  ...
}

int main () 
{

  ...

  std::ofstream ofs ("test.txt");

  in_order(ofs, root);

  ofs.close();


}