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

标签 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 的输出完全相同。任何人都可以解释幕后的基本原理吗?

最佳答案

您在 log 的析构函数中关闭之前调用了 recur。这意味着该文件将由多个 ofstream 一次打开,并且递归中较早的 ofstream 不会像 celtschk 指出的那样被刷新。如果您在调用 recur 之前关闭文件,它应该可以工作。如果您将 log 声明为 static 它会起作用,因为这样日志只会被构造一次,因此打开一次。下面的代码添加了一个 block 以确保 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;
}

关于c++ - 为什么递归中的 std::ofstream 没有按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21371228/

相关文章:

c++ - QGraphicsScene : OpenGL with fallback

c++ - 销毁从工厂方法初始化的引用成员

ruby-on-rails - 使用 Rspec 的 Ruby 递归深度搜索

javascript - 递归函数没有被执行

c++ - 算法标准中的 next_permutation() 似乎没有修改数组

c++ - 传递类的私有(private)方法作为 std::sort 的比较运算符

c++ - 如何自动清理 C++ 中的代码?

c++ - C++ 中的动态结构

C++ 初学者 : function call on object not executing properly

c++ - reinterpret_cast 如何展平 std::vector?