문제
수동으로 전화해야합니까? close()
내가 사용할 때 std::ifstream
?
예를 들어, 코드에서 :
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의 프로그래밍입니다.
함수가 끝나기 전에 파일을 닫으려면 언제든지 중첩 범위를 사용할 수 있습니다.
표준 (27.8.1.5 클래스 템플릿 Basic_ifstream)에서, ifstream
a basic_filebuf
실제 파일 핸들을 보유하는 멤버. IFStream 객체가 파괴 될 때도 멤버로 유지됩니다. basic_filebuf
. 그리고 표준 (27.8.1.2)에서 해당 소멸자는 파일을 닫습니다.
virtual ˜basic_filebuf();
효과 : 클래스의 대상을 파괴합니다
basic_filebuf<charT,traits>
. 전화close()
.
다른 팁
파일을 닫아야합니까?
아니
파일을 닫아야합니까?
의존합니다.
파일이 올바르게 닫히지 않으면 발생할 수있는 가능한 오류 조건에 관심이 있습니까? 가까운 전화를 기억하십시오 setstate(failbit)
실패하면. 소멸자가 전화 할 것입니다 close()
당신을 위해 당신은 자동으로 때문에 raii 그러나 객체가 더 이상 존재하지 않기 때문에 실패 비트를 테스트하는 방법을 남기지 않습니다.
@martin에 동의합니다. 파일에 글을 쓰면 데이터가 여전히 버퍼에 앉아있을 수 있으며까지 파일에 기록되지 않을 수 있습니다. close()
호출됩니다. 수동으로 수행하지 않으면 오류가 있는지 여부는 전혀 모릅니다. 사용자에게 오류를보고하지 않는 것은 매우 나쁜 관행입니다.
아니요, 이것은 자동으로 수행됩니다 ifstream
폐물 소각로. 수동으로 부를 유일한 이유는 fstream
인스턴스는 예를 들어 긴 살아있는 클래스 인스턴스의 회원 변수 인 경우 큰 범위를 가지고 있습니다.
당신은 소멸자가 일을하도록 허용 할 수 있습니다. 그러나 다른 Raii 객체와 마찬가지로 Close를 수동으로 호출하면 차이가있을 수 있습니다. 예를 들어:
#include <fstream>
using std::ofstream;
int main() {
ofstream ofs("hello.txt");
ofs << "Hello world\n";
return 0;
}
파일 내용을 작성합니다. 하지만:
#include <stdlib.h>
#include <fstream>
using std::ofstream;
int main() {
ofstream ofs("hello.txt");
ofs << "Hello world\n";
exit(0);
}
그렇지 않습니다. 이 과정이 갑자기 나가는 드문 경우입니다. 충돌 프로세스는 비슷한 일을 할 수 있습니다.