2017-09-05 8 views
3

멋진 프로그래머 여러분, 안녕하세요. 나는 예를 들어 코드std :: cout의 리디렉션 범위

std::cout << "hello" << std::endl; 

단어가 "안녕하세요"나는 리디렉션있어 파일에 기록됩니다 실행할 때 있도록 파일로 std::cout을 리디렉션하도록 노력했습니다.

// Redirection.cpp 
#include <iostream> 
#include <fstream> 

int main(int argc, char **argv) { 
    if(argc == 2){ 
     std::cout << "Output file supplied, redirecting to output.txt" << std::endl; 
     std::ofstream out("C:\\Avner\\HUJI\\CPP\\ex2\\output.txt"); 
     std::cout.rdbuf(out.rdbuf()); 
     std::cout << "This file contains output of Redirection.cpp" << std::endl; 
    } 
    std::cout << "This should be displayed in console or in the output file, if supplied" << std::endl; 
    return 0; 
} 

내가 읽어 output.txt를 기다리고 있었다 :

은 내가 followig 프로그램이

This file contains output of Redirection.cpp 
This should be displayed in console or in the output file, if supplied 

를 대신 만 읽

This file contains output of Redirection.cpp 

나는 그림이 리디렉션 I 해당 스코프에만 적용되었고 어떤 외부 스코프에는 적용되지 않았습니다.

어떻게 해결할 수 있습니까? 필자가 필요로하는 동작은 출력 파일이 제공되는 경우에만 모든 인쇄가 콘솔 대신 해당 파일에 기록된다는 것입니다.

감사합니다. 무료 도움말 및 지원을 요청합니다. out는 자동 저장 - 시간의 목적임을

+2

아니요, 출력 객체가 범위를 벗어났습니다. – WhiZTiM

+0

'std :: endl'이 수행하는 추가 작업이 정말로 필요합니까? '\ n '은 한 줄을 끝냅니다. –

+0

안녕하세요. 나는 그렇게 생각하지 않는다. 그러나 그것이 그들이 수업에서 우리에게 물었던 것이다. 감사! – avneraggy

답변

3

if 외부 변수를 선언하면 if이 끝나면 범위를 벗어나지 않습니다.

int main(int argc, char *argv[]) { 
    std::ofstream out; 
    if (argc == 2) { 
     std::cout << "Output file supplied, redirecting to output.txt" << std::endl; 
     out.open("C:\\Avner\\HUJI\\CPP\\ex2\\output.txt"); 
     std::cout.rdbuf(out.rdbuf()); 
     std::cout << "This file contains output of Redirection.cpp" << std::endl; 
    } 
    std::cout << "This should be displayed in console or in the output file, if supplied" << std::endl; 
    if (out.is_open()) { 
     out.close(); 
    } 
    return 0; 
} 
+0

당신은'out'을 닫을 필요가 없습니다. 소멸자가 그렇게 할 것입니다. –

4
#include <iostream> 
#include <fstream> 

int main(int argc, char **argv) { 
    if(argc == 2){ 
     std::cout << "Output file supplied, redirecting to output.txt" << std::endl; 
     std::ofstream out("C:\\Avner\\HUJI\\CPP\\ex2\\output.txt"); 
     std::cout.rdbuf(out.rdbuf()); 
     std::cout << "This file contains output of Redirection.cpp" << std::endl; 
    } 
    std::cout << "This should be displayed in console or in the output file, if supplied" << std::endl; 
    return 0; 
} 

리콜. 따라서 마지막 std::cout 작업이 실행되기 바로 전에 "}"일 때 out이 삭제됩니다 (결과적으로 버퍼 및 파일 리소스가 해제 됨).

스트림 버퍼가 여전히 유효한지 확인하려면 out으로 유지하십시오. 방법 중 하나는 Barmar's answer을 참조하십시오.