2013-08-23 38 views
0

我试图定义这个内联函数。它会创建一个决策树(在操作研究中使用的特定二叉树)。fstream不会写在文件上,直到endl

这是代码:

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

直到文件 tree是空的

我需要看看这棵树如何在不等待这个命令的情况下自我演化......任何人都知道这个问题的解决方案? 感谢所有会回答!

+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

没有probs,@LovaJ。,我的其他建议(在重构时)也被你的评论渲染了。我会留下它,但有可能是没有必要的。 – paxdiablo