2011-03-30 3 views
0

프로그램이 파일 읽기 클래스를 사용하여 존재하지 않는 파일의 일부 (즉, ios_base :: end 다음에 있음)에 액세스하려고하면 예외가 발생해야합니까?파일에 대한 예외 처리

나는 std :: out_of_range를 사용할 것이지만 지금은 std :: runtime_error가 더 적절할 것이라고 생각하기 시작했다.

편집 :

인터페이스는이 for 루프보다는 while 루프 주위를 기반으로한다는 점에서 표준 fstream 클래스보다 조금 다르게 작동합니다. 그래서 대신하고 다음, 예외를 throw 표준 라이브러리가하는 것처럼 수행하고 "최종의 설정하지 마십시오

for (std::streampos Pos = 0; Pos < MyFile.GetCharCount(); Pos++) 
{ 
    char Character = MyFile.GetChar(Pos); 
    // Do stuff with Character. 
} 

답변

1

배열과 같은 인터페이스를 제공하는 경우 (연산자가 [012] 대신에 인 경우) std::out_of_range을 던지는 것이 좋습니다. 이 경우 더 좋은 아이디어는 실제로 에 액세스 할 수 있고 크기() 함수를 제공하고 범위가 인 사전 조건을 만드는 데 필요한 바이트 수를 파악하는 것일 수 있습니다. (물론 이런 종류의 랜덤 액세스를 제공하기 위해서는 어쨌든 을 전체 파일을 메모리로 읽어야합니다. 유닉스를 제외하고 텍스트 파일에서 무작위로 임의의 위치를 ​​찾아 낼 수는 없습니다.)

인터페이스와 같은 파일을 제공하는 경우 iostream과 마찬가지로 과 같은 오류 상태를 설정하는 것이 좋습니다.

아무도 제공하지 않으면 귀하가 제공하는 것이 무엇이며, 이에 대한 사용자의 기대 또는 기대는 무엇인지에 관한 질문입니다.

5

:

while (MyFile.peek() != EOF) 
{ 
    char Character = MyFile.get(); 
    // Do stuff with Character. 
} 

클래스의 사용자가이 작업을 수행 할 수 있습니다 -file "플래그. 정말로 훌륭한 duer 인 경우에만 예외를 throw하십시오. 예기치 않은 일이 발생했습니다.

+0

내 편집을 참조하십시오. 이 경우 EOF 플래그는 실제로 의미가 없습니다. – Maxpm

+1

@ Maxx : 그럼 당신은'char's 배열을 가지고있는 것 같습니까? 그런 다음 몇 가지 가능성이 있습니다. 그냥 허용하지 않고 원래 제안과 같은 예외를 던지십시오.이 경우 out_of_range가 더 적합하거나 단순히'EOF' 문자 만 반환하십시오. 아니면 그냥 배열의 마지막 문자를 반환합니다. – Xeo

1

파일 끝에서 어떻게 읽히고 있습니까? 단순히 파일의 끝까지 읽은 다음 계속 읽으면 EOF 신호 만 보내면됩니다. 파일 끝에 도달하려고 시도하는 경우 검색 시도가 실패해야하므로 거기에서 읽으 려하지 않습니다.

그러나 정상적인 iostream을 너무 가깝게 모방하지는 않습니다. 특히,/read가 파일의 끝에 도달하면 이 아닌은 지워질 때까지 파일에서 더 이상 읽지 못하도록하는 "sticky"비트를 설정합니다. 한 프로세스에서 파일을 작성하고 다른 프로세스에서 동시에 읽으므로 파일의 끝에 도달하면 임시 조건이 될 수 있습니다.

+0

인터페이스는'GetChar()'와'GetLine()'과 같은 함수를 가지고 있습니다. 이들은'std :: streampos' 인수의 형태로 위치를 취합니다. 또한'GetCharCount()'와'GetLineCount()'함수를 포함하기 때문에'while' 루프가 아닌'for' 루프에서 파일을 쉽게 읽을 수 있습니다. (즉,'CurrentPos Maxpm

+1

@Maxpm : 이것은 랜덤 액세스 컬렉션과 거의 비슷한 파일을 처리하는 것처럼 들립니다. 이 경우, 나는'out_of_range'가 아마도 더 의미 있고 적합한 선택 일 것이라고 생각합니다. –