Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么没有';t std::递归工作中的流是否如预期的那样?_C++_Recursion_Std_Ofstream - Fatal编程技术网

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;
}