2013-07-05 1 views
0

fstream 클래스 주위에 래퍼를 쓰고 싶습니다. 스트림이 제대로 작동하는지 확인하는 가장 일반적인 방법은 good()의 결과를 보는 것입니다. 그러나이 기능은 대부분 역사적인 기능이라고 들었습니다. 더 정확하게 사용하려면 스트림이 제대로 작동하지 않지만 함수가 true을 반환하는 상황이있을 수 있습니다. 경험을 공유하고 다른 사람들로부터 오류를 확인하는 가장 정확한 방법은 무엇입니까fstream : 오류를 검사하는 가장 올바른 방법

파일이 없거나 열 수있는 등의 다양한 유형의 오류를 검사 할 가능성이있는 경우 좋을 것입니다. 단지 읽기 등은 (주 대상은 리눅스입니다 그러나)로 크로스 플랫폼을 이러한 프로그램을 떠나야 할 필요가있다.

감사합니다 사전에!

+0

파일 열기에 대해 알고 싶습니까? 아니면 그것을 읽고 쓰는가? – doctorlove

+0

@doctorlove 네, 읽기/쓰기에 대해서도 알고있는 것이 좋습니다. 나는 (적어도 C++로) 파일을 읽고 쓰는 방법을 알고있다. 그러나 나는 일어날 수있는 모든 나쁜 것들을 잡아서 오류의 종류에 따라 예외를 던지고 싶다. – ghostmansd

답변

1

Fi를하면 le 작업이 실패하고 eof()false을 반환하면 errno 또는 GetLastError (플랫폼에 따라 다름)을 검사하여 잘못된 것을 찾을 수 있습니다.

+0

나는 몇몇 실현이 예외를 던지지 않는다고 들었습니다. 내 생각에, 그것은 충분하지 않을 수도 있습니다. – ghostmansd

+0

@ghostmansd C++ 스트림 함수 중 예외를 throw하지 않습니다. 모든 지점에서 코드의 오류가 있는지 확인해야합니다. –

+0

내가 틀렸다면 정정 해주세요 :'eof()','fail()'과'! operator()'멤버 함수를 체크해야만합니다. 그러면 시스템을 검사해야합니다 (아마' predef' 프로젝트를 사용한다면, 플랫폼에 따라'errno' 나'GetLastError()'를 사용하여 코드를 검사해야합니다. 리눅스에서'man errno.h '를 사용하여 에러 코드를 볼 수 있습니다. [이 페이지] (http://msdn.microsoft.com/en-us/library/ms681381(v=vs.85) .aspx)를 찾았지만 실제로 많은 코드가 포함되어 있습니다. 아마도 내가 파일 처리에 관한 코드를 찾을 수 있습니까? – ghostmansd

1

두 가지 제안이 있으며 두 개 모두 오버로드 된 ! 연산자의 반환 값으로 열린 스트림을 확인해야합니다.

char name[] = "C:\\some_folder\\some file.txt"; 
std::ifstream f; 
f.open(name, std::ios::in); 
if (!f) 
    printf("File does not exist, or inadequate permissions"); 
f.close(); 

열기를 인/아웃 모드로 절단되는 것을 방지하기 위해 당신이 쓰기 작업을 수행 할 계획 때 :

std::fstream f; 
f.open(name, std::ios::in | std::ios::out); 
if (!f) 
    printf("Could not open file"); 
f.close(); 
를 파일이 존재하는 경우 를 사용하여 입력 전용 모드는 단순히 확인

기본적으로 이들은 각각의 스트림에 대한 입력 매개 변수이지만 설명을 위해 명시 적으로 표시했습니다.

eof 등을 확인하기위한 읽기/쓰기 작업 중에 this question에 대한 첫 번째 대답은 통찰력있게 보입니다.

+2

파일 열기 실패 e는 파일이 존재하지 않는다는 것을 의미하지 않을 수 있습니다. 현재 사용자가 파일을 읽고 쓸 수있는 권한이 없을 수 있습니다. 또한 깃발은 필요하다.'std :: ios :: in'은'std :: ifstream'의 기본값이고,'std :: fstream' 및'std :: ofstream'와 비슷합니다. 올바른 플래그는 기본값입니다. –

+0

NB : WIndows에서도 "C : \\ some_folder \\ some_file.txt"대신 "C : \\ some_folder \\ some_file.txt"를 쓰는 것이 좋습니다. – ghostmansd

+0

@ JoachimPileborg 당신 말이 맞아요, 그래서 나는 텍스트에 추가했습니다. – MasterHD