Проблемы с записью в файл при помощи Ofstream

  • Автор темы Lotti
  • Дата начала
L

Lotti

Гость
#1
Задача состоит в следующем: надо записать в файл бинарное дерево. Ничего лучше, как поставить запись в обход (левый прямой) этого дерева я не придумала)...но, проблема в том, что файл нужно открывать как для дозаписи (если так можно сказать))...для этого, как я понимаю нужно поставить индикатор при объявлении потока ofstream out("out.txt",ios::app);...но ios::app делает так, что дерево записывается в обратном порядке! т.е. он доисывает не в конец файла а в начало...а мне нужно по порядку, иначе тесты не пройдут... Так вот, есть ли такой индикатор, как мне требуется(честно искала в гугле ,не нашла)?
Зарание спасибо за информацию)
Код:
void straight(Element *root)
{
if(!root)
return;
ofstream out("out.txt",ios::app);

out<<root->key<<" ";

straight(root->left);
straight(root->right);
out.close();
}
};
P.s. Извините за дубляж, не могй найти как исправить(...
 
O

Odin_KG

Гость
#2
т.е. он доисывает не в конец файла а в начало...а мне нужно по порядку, иначе тесты не пройдут...
хм... вроде бы должен в конец писать, по крайней мере, FILE* так делает. Но у файла должна быть текущая позиция, которую можно изменять. Возможно, у вас позиция на начале файла находится и нужно ее в конец поставить. Честно говоря, я этими ofstream-ами никогда не пользовался, но обычно позиция файла устанавливается через функцию seek или какую-то созвучную.

Такой вопрос: а так ли уж надо именно дописывать в файл? Вообще самый простой вариант - это записывать файл заново. При скорости записи винчестера 50 МБайт в секунду это не должно занять много времени.
 
L

Lotti

Гость
#3
Ну, просто, если допустим убрать индикатор ios::app (т.е открываем для записи), оно собственно записывает каждое число заново, поверх старого, и в итоге в файле содержится не обход дерева, а последний лист в обходе.... Ну да, FILE в принципе записывает все как надо, но, просто ofstream мне кажется намного проще и поэтому именно его я запомнила, а вот FILE за год забыла....просто давно на С++ не писала)
 
O

Odin_KG

Гость
#4
Ну, просто, если допустим убрать индикатор ios::app (т.е открываем для записи), оно собственно записывает каждое число заново, поверх старого,
Наверное не "поверх", а просто старый файл удаляется, на его месте создается новый, который пишется с начала.

и в итоге в файле содержится не обход дерева, а последний лист в обходе....
Я пытаюсь понять, что ваша терминология означает с деревьями и листьями :). Значит, первое, что приходит в голову, что вы записываете "листья" по-отдельности, т.е. каждый раз открываете заново файл и пытаетесь дописывать в конец. Я вам рекомендую записывать всё ваше дерево целиком. т.е. открываете файл один раз на запись и пишите туда сразу все "листья". Чтобы делать так, как вы делаете, должны быть веские основания, которым может служить огромный размер получаемого файла. Но у меня какие-то сомнения, что это ваш случай :)

Ну да, FILE в принципе записывает все как надо, но, просто ofstream мне кажется намного проще и поэтому именно его я запомнила, а вот FILE за год забыла....просто давно на С++ не писала)
По мне так FILE самый простой. Вам надо всего пару функций: fopen и fwrite.
FILE* file=fopen("ИМЯ ФАЙЛА", "wb"); // открытие файла на запись ("rb" - на чтение)
 
L

Lotti

Гость
#5
Листья...ну, это как бы узлы, у которых нет сыновей)))) ладно,это не столь важно)...просто я же сказала, я вставила запись в обход дерева...а он построен рекурсивно.... и получается, что файл все время заново открывается....
В общем я тоже начиная скланяться к мысле, что с FILE будет лучше)... Просто когда не знаешь что делать обычно в голову приходит самый сложный путь=)
 
O

Odin_KG

Гость
#6
и получается, что файл все время заново открывается....
ну, так сделайте так, чтобы постоянно не открывался :). Один раз перед записью откройте файл, а далее пишите ваши "листья" в поток хоть рекурсивно, хоть как. Вам главное писать так, чтобы вы потом считать это могли.

В общем я тоже начиная скланяться к мысле, что с FILE будет лучше)
Это не принципиально. Через ofstream всё равно вызывается fopen внутри. Вы главное избавьтесь от переоткрывания файла.