fstream 在 endl 之前不会写入文件

问题描述 投票:0回答:1

我正在尝试定义这个内联函数。它将创建一个决策树(运筹学中使用的特殊二叉树)。

这是代码:

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;

我需要看看树如何在不等待该命令的情况下自行进化......有人知道这个问题的解决方案吗? 感谢所有愿意回答的人!

c++ tree binary-tree
1个回答
1
投票

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 场景中显然不是这种情况,但过于频繁的刷新通常会减慢您的代码速度。

如果,正如您所说,这只是调试代码,您可以忘记重构或不必要的刷新的速度损失。

© www.soinside.com 2019 - 2024. All rights reserved.