给出如下代码:
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
的输出完全相同。任何人都可以解释引擎盖下的理由吗?
答案 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;
}