为什么递归中的std :: ofstream没有按预期工作?

时间:2014-01-27 00:31:05

标签: c++ recursion std ofstream

给出如下代码:

int recur(int num);
int main()
{
    recur(5);
    return 0;
}    

int recur(int num)
{
    static unsigned count = 0;        
    //static
            std::ofstream log("log.txt",std::ios_base::app|std::ios_base::out);
    std::cout << count << "\n";
    log << count << "\n";
    ++count;

    if (num==0) return 0;
    num += recur(num -1);

    return num;
}

std::cout的输出:

0
1
2
3
4
5

log.txt的内容:

5
4
3
2
1
0

为什么会这样?

我尝试将static放在std::ofstream之前,就像在函数recur中注释一样。然后它工作正常,与std::cout的输出完全相同。任何人都可以解释引擎盖下的理由吗?

1 个答案:

答案 0 :(得分:2)

recur关闭其解构程序之前,您正在致电log。这意味着文件将由多个ofstream一次打开,并且递归前面的ofstream s不会像celtschk指出的那样被刷新。如果在调用recur之前关闭文件,它应该有效。如果您将log声明为static,则它会起作用,因为只有log只构造一次,因此只打开一次。下面的代码添加了一个块,以确保在log之前调用recur的解构函数。

int recur(int num)
{
    static unsigned count = 0;

    {
        std::ofstream log("log.txt",std::ios_base::app|std::ios_base::out);
        std::cout << count << "\n";
        log << count << "\n";
        ++count;
    }

    if (num==0) return 0;
    num += recur(num -1);

    return num;
}