c++ - fstream doesn't write on file until endl -


i'm trying define inline function. create decision tree (a particoular binary tree used in operations research).

this code:

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; } 

the std::fstream& tree defined in main as:

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

i don't understand why file tree empty until executed command tree<<endl;

i need see how tree evolve without waiting command...anyone know solution problem? thanks answer!

endl outputs newline , forces buffer flush why you're seeing @ point.

file streams, unless modify properties, buffered won't see until buffer full or explicitly flush it.

this can done endl (assuming want newline sent first), via ostream::flush or when closing file.

probably easiest fix change if statement like:

if (value[level] == 0) {     tree << "-->(" << i_node[level] << "," << j_node[level] << "," << q_infr[level] << "=1)\n";     (int = 0; < 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(); 

in fact, given commonality of of lines, i'd considering refactoring make more readable:

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';     (int = 0; < 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(); 

keep in mind reason why files tend buffered while standard output line buffered. files don't care until job done full buffering more efficient. that's not case in this scenario flushing more necessary slow code down.

if, say, debug code, can forget refactoring or speed penalty on over-flushing.