繁体   English   中英

fstream直到endl才写入文件

[英]fstream doesn't write on file until 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在main中的定义为:

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

我不明白为什么文件tree为空,直到执行命令tree<<endl;

我需要查看树如何在不等待该命令的情况下自身进化……有人知道该问题的解决方案吗? 感谢所有的答案!

endl输出换行符并强制执行缓冲区刷新,这就是您在此时看到它的原因。

除非修改文件流的属性,否则文件流将被完全缓冲,因此在缓冲区已满或显式刷新之前,您将看不到任何内容。

这可以通过ostream::flush或在关闭文件时使用endl (假设您要先发送换行符)来完成。

可能最简单的解决方法是将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();

请记住为什么在标准输出是行缓冲的情况下文件倾向于被完全缓冲的原因 在完成作业之前,您不需要关心的大多数文件都可以使完全缓冲更加有效。 这种情况下显然不是这种情况,但是刷新次数超过必要的时间通常会使代码变慢。

如您所说,如果这只是调试代码,那么您可以忘记重构或过度冲洗的速度损失。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM