2013-08-23 4 views
0

Я пытаюсь определить эту встроенную функцию. Это создало бы дерево решений (двоичное дерево частного лица, используемое при исследовании операций).fstream не записывает файл до конца

Это код:

inline void printTreeFile(int* i_node,int* j_node,int* q_infr,int* value,int nStart,int level,std::fstream& tree) 
{  int spazi=0,len,stop; 
     for(int actual_level=0;actual_level<level;actual_level++) 
      {spazi+=9; 
      if(i_node[actual_level]==0) 
       len=1; 
      else 
       len=(int)log10(i_node[actual_level])+1; 
      spazi+=len; 
      if(j_node[actual_level]==0) 
       len=1; 
      else 
       len=(int)log10(j_node[actual_level])+1; 
      spazi+=len; 
      if(q_infr[actual_level]==0) 
       len=1; 
      else 
       len=(int)log10(q_infr[actual_level])+1; 
      spazi+=len; 
      } 
     if(value[level]==0) 
      { 
      tree<<"-->("<<i_node[level]<<","<<j_node[level]<<","<<q_infr[level]<<"=1)"; 
      tree<<endl; 
      for(int i=0;i<spazi;i++) 
       tree<<" "; 
      tree<<"-->("<<i_node[level]<<","<<j_node[level]<<","<<q_infr[level]<<"=0)"; 
      } 
     else 
      tree<<"-->("<<i_node[level]<<","<<j_node[level]<<","<<q_infr[level]<<"=1)"; 
     //cin>>stop; 
} 

std::fstream& tree определяется в основной, как:

fstream tree;      
remove("tree"); 
tree.open("tree",ios::out|ios::app); 

Я не понимаю, почему файл tree пуст до тех пор, пока выполняется команда tree<<endl;

Мне нужно увидеть, как дерево развивается, не дожидаясь этой команды ... кто-нибудь знает решение этой проблемы? спасибо всем, что ответит!

+2

В потоке есть буфер. Вы должны вызвать flush() для принудительной записи. std :: endl добавляет '\ n' и вызывает flush(). –

ответ

0

endl выводит строку новой строки и создает буферный флеш, поэтому вы видите его в этой точке.

Файловые потоки, если вы не изменяете их свойства, полностью буферизованы, чтобы вы ничего не увидели до тех пор, пока буфер не будет заполнен, или вы явно не очистите его.

Это можно сделать с помощью endl (при условии, что вы хотите, чтобы новая строка была отправлена ​​первой), через ostream::flush или при закрытии файла.

Вероятно, проще исправить это изменить if заявление во что-то вроде:

if (value[level] == 0) { 
    tree << "-->(" << i_node[level] << "," << j_node[level] << "," << q_infr[level] << "=1)\n"; 
    for (int i = 0; i < spazi; i++) 
     tree << " "; 
    tree << "-->(" << i_node[level] << "," << j_node[level] << "," << q_infr[level] << "=0)"; 
} else { 
    tree << "-->(" << i_node[level] << "," << j_node[level] << "," << q_infr[level] << "=1)"; 
} 
tree.flush(); 

На самом деле, учитывая общность некоторых из этих строк, я с учетом рефакторинга, чтобы сделать его более читаем:

inline void outLine (
    std::fstream& tree, 
    int   *inode, 
    int   *jnode, 
    int   *qinfr, 
    int   level, 
    int   val) 
{ 
    tree << "-->(" << i_node[level] << "," << j_node[level] 
     << "," << q_infr[level] << '=' << val << ')'; 
} 

: 

if (value[level] == 0) { 
    outLine (tree, i_node, j_node, q_infr, level, 1); 
    tree << '\n'; 
    for (int i = 0; i < spazi; i++) 
     tree << " "; 
    outLine (tree, i_node, j_node, q_infr, level, 0); 
} else { 
    outLine (tree, i_node, j_node, q_infr, level, 1); 
} 
tree.flush(); 

Имейте в виду причину почему файлы, как правило, полностью буферном в то время как стандартный вывод буферизируется по строке. Большинство файлов, которые вам не нравятся до тех пор, пока работа не будет выполнена, станет более эффективной. Это, очевидно, не так в этом сценарии, но очистка чаще всего, как правило, замедляет ваш код.

Если, как вы говорите, это всего лишь код отладки, вы можете забыть о рефакторинге или о снижении скорости при сверхпотоке.

+0

Причина, по которой я пытаюсь напечатать в файле это дерево, - это простая отладка! Когда я захочу, чтобы этот код работал быстро, я не буду использовать эту функцию;) – TwistAndShutter

+0

Никаких проблем, @LovaJ., Мой другой совет (по рефакторингу) также не был рассмотрен вашим комментарием. Я оставлю это, но с предостережением, что это, вероятно, не нужно. – paxdiablo

Смежные вопросы