2013-11-24 2 views
1

나는이 기능이 있습니다일반 파일 스트림을 매개 변수로 전달하는 방법은 무엇입니까?

void check_open (ifstream& file) 
{ 
    if (not file.is_open()) 
    { 
     cout << "Error." << endl; 
     exit(1); 
    } 
} 

을하지만 난 단지, 내가 어떻게이 인수를 ofstream도 받아 들일 수 ifstream 인수를 전달할 수 있습니다?

+0

은 많이 할 것 같다. 함수를 버리고 호출 코드 assert (file.is_open())에서 어설 션을 사용할 수 있습니다. 예를 들어,이 함수를 템플릿 함수로 만들 수 있다면 is_open을 정의한 모든 유형에서 작동합니다. – RichardPlunkett

답변

3

만큼 스트림이 is_open() 방법이 있기 때문에,이 함수는 아래 잘 작동 (fstream, ifstream, ofstream 및 다른 문자 유형과 이들의 변종).

template<typename stream_type> 
void check_open (const stream_type& file) 
{ 
    if (not file.is_open()) 
    { 
     cout << "Error." << endl; 
     exit(1); 
    } 
} 
+1

덕분에 템플릿을 사용하지 않았지만 지금은 얼마나 유용한 지 알 수 있습니다. –

-1

함수에서 파일 이름 만 전달하고 함수 내에 ifstream 또는 ofstream을 사용하십시오.

+0

그러나 호출자가 입력 또는 출력 스트림을 원한다면 함수가 어떻게 알 수 있습니까? –

+0

@ JoachimPileborg 귀하의 질문은 OP로해야합니다, 나는 그가 원하는 것을 이루기 위해 최선을 다하고 있습니다. – theharshest

+0

OP가 원하는 것은 * 스트림 *이 열려 있는지 확인하고 그렇지 않은 경우 프로그램을 종료하는 것입니다. 파일 이름을 전달하는 것은 아무런 도움이되지 않습니다. – john

1

해당 클래스의 공통 기본 클래스를 수락하면 트릭을 수행해야합니다.

void check_open (std::ios &file) 
{ 
    // ... 
} 
+1

'is_open '은'std :: ios'에도 없으며 'std :: basic_ios ' – P0W

+0

@ P0W 그러나 ** 그것은 하위 클래스 중 하나에서 정의되었으므로 다형성 ('dynamic_cast' 등)을 사용하고 기본 클래스 유형을 적절한 파생 클래스 유형으로 변환 할 수 있습니다. 그런 다음 필요한 메소드를 호출 할 수 있습니다. –

0

은 템플릿 영역으로 흥미 진진한 손 대고 시도 :이 종료 할 IS_OPEN 필요로하기 때문에

이 기능은 정말 나던
template<typename F> 
void check_open (F& file) 
{ 
    if (not file.is_open()) 
    { 
     cout << "Error." << endl; 
     exit(1); 
    } 
} 
+0

흠, 중복, 죄송합니다. – RichardPlunkett

관련 문제