2014-01-27 9 views
3

감안할 코드 :왜 재귀 작업에서 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에서 : log.txt

0 
1 
2 
3 
4 
5 

내용 : 왜 그렇게처럼

5 
4 
3 
2 
1 
0 

입니까?

recur에 주석으로 표시된 것과 마찬가지로 staticstd::ofstream 앞에 넣으려고했습니다. 그렇다면 정확히 작동했는데 정확히 std::cout의 결과와 동일합니다. 아무도 후드 아래의 논리를 설명 할 수 있습니까?

+3

'log'가 삭제되면 텍스트가 파일에 저장됩니다. 그들은 역순으로 파괴됩니다. 'std :: cout'은 전체 프로그램에 사용됩니다. – chris

+4

또한, 일부 구현에서는'\ n'마다 'cout'을 플러시하지만 파일 스트림은 플러시하지 않습니다. '<< '\ n' '뒤에'<< std :: flush'를 추가하거나'<<'\ n "대신에 << << std :: endl >>을 사용하면'log'에 대한 원래 출력 순서를 복구해야합니다. – celtschk

+0

@chris'log'가 파기되기 전에 파일에 아무것도 쓰지 않았습니까? –

답변

2

log이 deconstructor에서 닫히기 전에 recur으로 전화를 걸고 있습니다. 이것은 파일이 복수 ofstream으로 즉시 열리 며 recursion의 앞부분에있는 ofstream 초가 celtschk가 지적한대로 플러시되지 않음을 의미합니다. recur을 호출하기 전에 파일을 닫아야 작동합니다. logstatic으로 선언하면 로그가 생성되고 한 번 열리기 때문에 작동합니다. 아래 코드는 recur이되기 전에 log의 deconstructor가 호출되도록 블록을 추가합니다.

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