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

Тема в разделе "MS Visual C++", создана пользователем Lotti, 25 фев 2010.

  1. Lotti

    Lotti Гость

    Задача состоит в следующем: надо записать в файл бинарное дерево. Ничего лучше, как поставить запись в обход (левый прямой) этого дерева я не придумала)...но, проблема в том, что файл нужно открывать как для дозаписи (если так можно сказать))...для этого, как я понимаю нужно поставить индикатор при объявлении потока ofstream out("out.txt",ios::app);...но ios::app делает так, что дерево записывается в обратном порядке! т.е. он доисывает не в конец файла а в начало...а мне нужно по порядку, иначе тесты не пройдут... Так вот, есть ли такой индикатор, как мне требуется(честно искала в гугле ,не нашла)?
    Зарание спасибо за информацию)
    Код (Text):
    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. Извините за дубляж, не могй найти как исправить(...
     
  2. Odin_KG

    Odin_KG Гость

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

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

    Lotti Гость

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

    Odin_KG Гость

    Наверное не "поверх", а просто старый файл удаляется, на его месте создается новый, который пишется с начала.

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

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

    Lotti Гость

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

    Odin_KG Гость

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

    Это не принципиально. Через ofstream всё равно вызывается fopen внутри. Вы главное избавьтесь от переоткрывания файла.
     
Загрузка...
Похожие Темы - Проблемы записью файл
  1. aliaksandr89
    Ответов:
    3
    Просмотров:
    131
  2. Amfion
    Ответов:
    5
    Просмотров:
    126
  3. wowa
    Ответов:
    7
    Просмотров:
    383
  4. John_Tavarez
    Ответов:
    0
    Просмотров:
    341
  5. Валентин Амбер
    Ответов:
    11
    Просмотров:
    355

Поделиться этой страницей