#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();
}