C++ 为什么没有';t std::递归工作中的流是否如预期的那样?
给定代码如下:C++ 为什么没有';t std::递归工作中的流是否如预期的那样?,c++,recursion,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 <<
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;
}
log.txt的内容
:
5
4
3
2
1
0
为什么会这样
我试图将
static
放在std::ofstream
之前,就像函数recur
中的注释一样。然后它工作得很好,与std::cout的输出完全相同。有人能解释一下这个理由吗 在解构器中关闭log
之前,您正在调用recur
。这意味着文件将由多个流
s一次打开,并且在递归中前面的流
s不会像celtschk指出的那样被刷新。如果在调用recur
之前关闭该文件,则该功能应能正常工作。如果您将log
声明为static
,则它可以工作,因为这样日志只构造一次,因此打开一次。下面的代码添加了一个块,以确保在调用recur
之前调用log
的解构器
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;
}
int循环(int num)
{
静态无符号计数=0;
{
std::of流日志(“log.txt”,std::ios_base::app | std::ios_base::out);
std::cout当log
被销毁时,文本被放入文件中。它们被以相反的顺序销毁。std::cout
在整个程序中都有效。此外,一些实现在每个\n
上刷新cout
,但不刷新文件流。添加@chris是否意味着在之前没有写入文件de>log
已销毁?但是请注意,在每个递归中创建新流的效率非常低。最好不要经常打开和关闭文件。
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;
}