我正在尝试定义这个内联函数。它将创建一个决策树(运筹学中使用的特殊二叉树)。
这是代码:
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
在main中定义为:
fstream tree;
remove("tree");
tree.open("tree",ios::out|ios::app);
我不明白为什么文件
tree
是空的,直到执行命令tree<<endl;
我需要看看树如何在不等待该命令的情况下自行进化......有人知道这个问题的解决方案吗? 感谢所有愿意回答的人!
endl
都输出换行符并且强制刷新缓冲区,这就是您在此时看到它的原因。
文件流,除非您修改其属性,否则都是完全缓冲的,因此在缓冲区已满或显式刷新它之前您不会看到任何内容。
这可以通过
endl
(假设您希望先发送换行符)、通过 ostream::flush
或在关闭文件时完成。
最简单的解决方法可能是添加
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' << std::string(spazi, ' ');
outLine (tree, i_node, j_node, q_infr, level, 0);
} else {
outLine (tree, i_node, j_node, q_infr, level, 1);
}
tree.flush();
请记住文件倾向于完全缓冲而标准输出是行缓冲的原因。大多数文件在工作完成之前您并不关心,因此完全缓冲效率更高。
在 this 场景中显然不是这种情况,但过于频繁的刷新通常会减慢您的代码速度。
如果,正如您所说,这只是调试代码,您可以忘记重构或不必要的刷新的速度损失。