2013-05-17 15 views
4

내 C++ 코드에서 다른 값을 파일에 끊임없이 쓰고 있습니다. 제 질문은 파일이 성공적으로 열렸다는 것을 고려하여 쓰기 또는 < <이 실패하는 상황이있는 경우입니다. 모든 전화 또는 < <이 제대로 수행되었는지 확인해야합니까?어떤 상황에서 ostream :: write 또는 ostream :: operator <<가 실패합니까?

+0

하드 드라이브가 고장난 경우 어떻게해야합니까? – chris

+0

그게 내가 생각할 수있는 유일한 것입니다. – ipluto

답변

9

모두 나열하는 데 실패한 이유가 너무 많습니다. 가능한 사람은 다음과 같습니다

  • 파티션이
  • 을 마지막으로 가득 사용자가
  • 파티션이 잔인하게 마운트 해제되었습니다 자신의 디스크 할당량을 초과
  • 파티션이 손상되었습니다 (파일 시스템 버그)
  • 디스크가 ... 물리적으로
  • 실패

쓰기가 제대로 수행되었는지 확인하기 위해 모든 전화 또는 < <을 확인해야합니까?

당신은 확실히, , 프로그램이 다음 오류에 탄력적으로합니다. 그렇게하지 않으면 단순히 쓰는 데이터가 쓰여지거나 쓰여지지 않을 수도 있다는 것을 의미합니다.

참고 : 오히려 (곧 매우 지루한 될 것이다)이 실패 할 때를 안하는 스트림 (예외를 던질 수 있도록 당신이 원하는대로 std::ostream::exceptions을 설정할 수있는 모든 작업 후 스트림 상태를 확인하는 것보다 이러한 디스크 오류는 정의상 매우 예외적이기 때문에 문제입니다.

+0

필자는 쓰기의 모든 단일 호출을 제어 할 것입니다. – ipluto

+2

@ipluto : "손으로"모든 단일 호출을 확인하지 않으려면 편집을 참조하십시오. 이 예외는 ** 오른쪽 도구 **라고 생각합니다. – syam

+0

감사합니다. @yyam. 나는 그것을 즉시 체크 아웃 할 것이다. – ipluto

7

쓰기가 실패 할 수있는 이유는 여러 가지가 있습니다. 내 머리 위로 떨어져 여기에 몇 가지 :

  1. 디스크가 가득
  2. 디스크는 파일이 NFS 마운트와 네트워크에
  3. 아래
  4. 당신이있어 스트림 간다 실패 하류 독자가
  5. 당신이 쓰고있어 스트림 충돌 할 때 종료 파이프로 (AN ostream에이 파일이 항상 아니라는 것을 기억)은 어떻게 작성하는 것은 TCP 소켓과 피어 거리
,691 간다

등등.

EDIT : 내가 파일에 글을 쓰고 있다고 말한 것을 알고 있는데, 코드가 ostream에 쓰기 만하면된다는 사실에주의를 환기하고자했다. 일 수있다. 흐름.

+1

+1 네트워크 공유 및 파이프/소켓, 나는 그것을 잊었습니다 ... – syam

+0

고마워요, 특히 비 관련 파일 조건을 언급했다. – ipluto

3

다른 것들은 출력 오류를 초래할 수있는 상황을 다룹니다.

그러나 :

내가 올바르게 수행하고 있는지 확인 쓰기 또는 < <의 모든 단일 통화를 확인해야합니까?

여기에 "아니오"라고 대답합니다. 당신이 당신의 데이터를 쓴 후 스트림이 여전히 good() 경우 당신은 생각할 단지뿐만 아니라 파일이 성공적으로 연 경우

  • 을 확인할 수 있습니다.

이것은 물론 작성되는 데이터 유형과 부분 쓰기에서 복구하는 것과 응용 프로그램을 다시 실행하는 가능성/상대적 복잡성에 따라 다릅니다.

쓰기가 실패한 경우 (예 : 정상적인 복구를 수행하기 위해)를 자세히 제어해야하는 경우 ostream exceptions syam이 연결됩니다. 각 작업 후에 스트림 상태를 폴링하면 코드가 커집니다.

+0

+1, 데이터가 너무 중요하지 않은 경우 검사를 지연하는 것이 좋습니다. 중요한 데이터를 처리하는 데 익숙해지면 느슨한 검사 가능성에 눈이 멀었습니다. – syam

+0

@syam : 참고 - 작업중인 앱에서 부분 쓰기가 의미가 없으며 의미있는 복구가 불가능합니다. 제 경우에는 전부 또는 아무것도 아닙니다. 나는 'ostream'을 즉시 예외로 만들 가능성에 대해서조차 몰랐다. 나는 그것이 필요할 때 바로 저를위한 좋은 승리였다. ;-) – DevSolar

+0

내 최신 프로젝트가 꽤 반대인데, 나는 (거의) 실시간으로 들어오는 데이터를 저장해야하고 가능한 한 많은 손실 위험을 최소화해야한다. (따라서 모든 단일 쓰기를 확인하는 나의 열망). 어쨌든 내 대답이 당신에게 유용했기 때문에 기뻤습니다. – syam