给定代码如下:
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/