2011-11-11 2 views
0

사용자가 설정 한 부울 값에 따라 콘솔이나 파일에 쓰는 코드를 작성했습니다.단지 데이터 유실 가능성을 알고 싶습니까?

코드는 다음과 같습니다. 여기

#include <iostream> 
#include <fstream> 

int main() 
{ 
    bool bDump; 
    std::cout<<"bDump bool"<<std::endl; 
    std::cin>>bDump; 
    std::ostream* osPtr; 
    std::ofstream files; 

    if(bDump) 
    { 
    files.open("dump.txt"); 
    osPtr = &files; 
    } 
    else 
    { 
    osPtr = &std::cout; 
    } 

    std::ostream& stream = *osPtr; 
    stream<<"hello"; 

    if(bDump) 
    { 
    files.close(); 
    } 
    return 0; 
} 

나는 표준 : : ostream에 포인터를 생성하고 내가 ofstream 객체 또는 표준 : : cout을 하나의 주소를 assinging하고 부울 값에 따라입니다. 오픈 또는 클로즈와 같은 파일 작업이 제대로 수행되는지 여부에 관한 나의 유일한 관심사입니다. 내가 C++을 처음 접했을 때 나를 도와주세요. 또한 잘못된 프로그래밍 습관이 여기에 따라 왔는지를 지적하십시오.

+0

시도해 보셨습니까? 네가 원하는 것처럼 일 했니? –

+0

예, 효과가있었습니다. –

답변

4

정확하고 올바르게 작동합니다.
내가 다르게 할 주요 사항은 소멸자가 자동으로 수행하는 not to explicitly call close()입니다.

3 진 연산자로 코드를 약간 단순화하고 포인터를 제거 할 수 있습니다.

#include <iostream> 
#include <fstream> 

int main() 
{ 
    bool bDump; 
    std::cout << "bDump bool"<<std::endl; 
    std::cin >> bDump; 
    std::ofstream files; 

    std::ostream& stream = (bDump) ? (files.open("dump.txt"), files) 
            : std::cout; 

    stream<<"hello";  
} 
+0

+1 그 대부분은 오히려 못생긴 포인터를 없애기위한 것입니다. :) – cHao

0

누출 가능성은 없습니다. 그러나 예외가 다음

files.close(); 

가 호출되지 않습니다

stream<<"hello"; 

에 의해 발생하지만, 코드의 특정 예를 들어 염려가 없습니다 경우. ofstream의 소멸자가 close()를 호출합니다.

+0

사실 파일을 다 마친 후에 함수가 꽤 오래 실행되지 않으면'files.close()'는 쓸모가 없다. (RAII의 전체적인 점은 이와 같은 것들을 다루는 것입니다.) 그리고 그 기능이 오랫동안 지속될 것이라면, 염려 할 분리 문제가 있다고 말할 수 있습니다. – cHao

0

C++에서는 소멸자를 사용하여 우리를 정리하고 있기 때문에 std::ofstream에는 파일을 자동으로 닫는 기능이 있기 때문에 모든 것을 잘 수행했지만 close()이 필요하지 않습니다.

main() (C++) 하단의 return 0; 문을 생략해도됩니다. 0 (성공, 정말로)이 기본적으로 반환됩니다.

관련 문제