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.