2016-05-31 4 views
2

C++ 언어에서는 파일을 열고 조작하는 방법이 여러 가지가 있습니다. 그러나 RAII 방식은 destruktor가 메모리를 확보하는 데주의를 기울이기 때문에 매우 인기가 있습니다.파일 스트림이있는 RAII

하지만 파일 스트림 종료는 어떻게됩니까? 아는 한, destruktor는 어쨌든 파일을 닫아야합니다. 그러나 destruktor도 예외를 throw 할 수 없습니다. 따라서 스트림을 닫지 않고 블록 끝에서 파괴되면 오류가 닫히는 동안 발생할 수있는 정보가 느슨해 질 수 있습니다.

내 생각이 맞습니까? RAII 방식에도 불구하고 항상 스트림을 닫아야합니까?

예 :

{ 
    std::ofstream ofs; 
    ofs.open ("test.txt"); 

    ofs << "blablabla"; 

    //do i need the following? 
    ofs.close(); 
} 
+0

파일 스트림 개체는 포함 된 개체가 소멸되면 예외가 발생하지 않고 소멸되어야합니다. 소멸자에서 명시 적으로 파일을 닫을 필요가 없습니다. –

+0

아니요, 수동으로'.close()'할 필요는 없습니다. RAII의 _ 전체 점입니다. – emlai

답변

3

닫히는 동안 오류에 대응할 것인지 묻는 답이 표시됩니다. 당신이 반응 할 경우

, 수동 close에있는 및 오류 조건을 확인 (failbit를 설정합니다 닫 실패) : 당신이 반응하지 않을 경우

std::ofstream str; 
// Do something 
str.close(); 
if (str.fail()) { 
    // react on error 
} 

, 왜 귀찮게? 소멸자가 파일을 닫도록하십시오.

3

당신은 fstream 소멸자 파일을 닫습니다 수 있도록해야한다.

말했듯이 소멸자가 throw되지 않으므로 파일을 닫는 동안 발생한 오류는 볼 수 없지만 std::basic_fstream::close() 멤버 함수는 void 반환 형식이므로 오류를 신호 할 수 없습니다. . 이 점에 대해 걱정하지 마십시오. 소멸자가 다른 RAII 클래스처럼 파일을 닫을 수있게하십시오.


참고 fstream 기초가 buffer 너무 close() 부재의 기능을 가진다. 이 함수는 오류가있는 경우 NULL을 반환하고 성공하면 this 포인터를 반환합니다. 이 함수는 basic_filebuf의 소멸자에서 호출되며, 이는 basic_fstream의 소멸자에서 호출됩니다. 평상시에는 직접 전화하지 마십시오.