문제

수동으로 전화해야합니까? 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);
}

그렇지 않습니다. 이 과정이 갑자기 나가는 드문 경우입니다. 충돌 프로세스는 비슷한 일을 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top