Programing

std :: fstream을 닫아야합니까?

lottogame 2020. 12. 25. 08:48
반응형

std :: fstream을 닫아야합니까?


중복 가능성 :
ifstream을 수동으로 닫아야합니까?

내가 전화를해야하나요 fstream.close()이거나 fstream파괴에 스트림을 닫 적절한 RAII 객체가?

std::ofstream메서드 내부에 로컬 개체가 있습니다. close를 호출하지 않고이 메서드를 종료 한 후 파일이 항상 닫혀 있다고 가정 할 수 있습니까? 소멸자의 문서를 찾을 수 없습니다.


이전 답변이 오해의 소지가 있다고 생각합니다.

fstream 이다 그것은 적절한 RAII 객체 않는 범위의 끝에 근접 자동 절대적 없다 전혀 필요 호출 close범위의 끝에서 충분한되어 수동으로 개폐 할 때.

특히 "모범 사례"가 아니며 출력을 플러시 할 필요가 없습니다.

그리고 Drakosha가 옳은 그 호출 close은 스트림의 실패 비트를 확인할 수있는 가능성을 제공하지만, 어쨌든 아무도 그렇게하지 않습니다.

이상적인 세계에서는 단순히 stream.exception(ios::failbit)미리 호출 하여 fstream의 소멸자 에서 발생한 예외를 처리합니다 . 그러나 불행히도 소멸자의 예외는 C ++에서 깨어진 개념이므로 좋은 생각이 아닙니다.

그래서 경우에 당신이 파일을 닫는의 성공 여부를 확인하려면, 수동으로 할 (하지만 다음).


Amy Lee의 답변에 추가하려면 수동으로 수행하는 것이 좋습니다. 이렇게하면 오류도 확인할 수 있기 때문입니다.

"close"맨 페이지 에 따르면 BTW :

close ()의 반환 값을 확인하지 않는 것은 일반적이지만 그럼에도 불구하고 심각한 프로그래밍 오류 입니다. 이전 write (2) 작업의 오류가 최종 close ()에서 처음보고 될 가능성이 높습니다. 파일을 닫을 때 반환 값을 확인하지 않으면 데이터가 자동으로 손실 될 수 있습니다. 이는 특히 NFS 및 디스크 할당량으로 관찰 할 수 있습니다.

성공적인 닫기는 커널이 쓰기를 지연 하므로 데이터가 디스크에 성공적으로 저장되었음을 보장하지 않습니다 . 스트림이 닫힐 때 파일 시스템이 버퍼를 플러시하는 것은 일반적이지 않습니다. 데이터가 물리적으로 저장되었는지 확인해야하는 경우 fsync (2)를 사용합니다. (이 시점에서 디스크 하드웨어에 따라 다릅니다.)


나는 당신의 fstream을 닫는 것이 좋은 습관이라고 생각합니다. 버퍼를 플러시해야하기 때문입니다.

참조 URL : https://stackoverflow.com/questions/4802494/do-i-need-to-close-a-stdfstream

반응형