질문:
std::ifstream을 사용할 때 수동으로 수행해야 합니까? close()를 호출하시겠습니까? 파일 폐쇄를 자동으로 처리하기 위해 ifstream에서 RAII를 사용하지 않습니까?
예제 코드:
std::string readContentsOfFile(std::string fileName) { std::ifstream file(fileName.c_str()); if (file.good()) { std::stringstream buffer; buffer << file.rdbuf(); file.close(); return buffer.str(); } throw std::runtime_exception("file not found"); }
file.close()를 호출해야 합니까? ifstream은 파일 폐쇄를 위해 RAII를 사용하지 않나요?
답변:
아니요
RAII는 설계되었습니다. 바로 이 목적을 위해. 소멸자가 의도한 기능을 수행하도록 허용합니다. 파일을 수동으로 닫아도 해를 끼치지는 않지만 C 규칙에서 벗어나 클래스를 사용하여 C로 프로그래밍하는 것과 유사합니다.
함수가 끝나기 전에 파일을 닫아야 하는 경우 중첩 범위를 사용할 수 있습니다.
std::ifstream file(fileName.c_str()); { std::stringstream buffer; buffer << file.rdbuf(); } // scope ends; file closed here
표준(27.8.1.5, 클래스 템플릿 basic_ifstream)에 따르면 ifstream은 basic_filebuf로 구현되어야 합니다. 정품 파일 핸들을 보관하는 멤버입니다. 이 멤버는 ifstream 객체가 파괴될 때 basic_filebuf 소멸자도 호출하도록 보장합니다. 그리고 표준(27.8.1.2)에 따라 이 소멸자는 파일을 닫습니다.
virtual ˜basic_filebuf(); Effects: Destroys an object of class `basic_filebuf<charT,traits>`. Calls `close()`.
위 내용은 C에서 `ifstream`을 수동으로 닫아야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!