2010-01-29 6 views
16

stdin이 에 의해 지정된 일반 stdio 관용구를 알고 있습니다. 파일 이름은 "-"입니다.C++ : cin을 ifstream 변수에 할당 하시겠습니까?

if ((strcmp(fname, "-")) 
    fp = fopen(fname); 
else 
    fp = stdin; 

ifstream 인스턴스로 이것을 수행하는 가장 좋은 방법은 무엇입니까? 나는 에게 수업의 일환으로 ifstream을 가지고 코드의 비트를받은 나는 가 해당 작업을 수행하는 코드를 추가 할 같은 일을 거라고 :

if (filename == "-") 
    logstream = cin; // **how do I do this*?* 
else 
    logstream.open(filename.c_str()); 

답변

22

cinifstream 아니라, 경우 대신에 istream을 사용할 수 있습니다. 그러면 승리 할 수 ​​있습니다. 그렇지 않으면 휴대 할 준비가되지 않았다면 /dev/stdin 또는 /dev/fd/0 또는 무엇이든 열어보십시오. 당신이 휴대용되고 싶어하고, 프로그램 사용 istream을 할 수 할 경우 :-)


, 여기 한 가지 방법입니다하십시오 Deleter가를 지정하는

struct noop { 
    void operator()(...) const {} 
}; 

// ... 

shared_ptr<istream> input; 
if (filename == "-") 
    input.reset(&cin, noop()); 
else 
    input.reset(new ifstream(filename.c_str())); 

noop가된다 cin 경우에는 아무 것도 수행하지 않습니다. 왜냐하면 cin은 삭제되지 않기 때문입니다.

+0

감사합니다 ... 이것은 리눅스와 osx에 이식 가능해야하므로/dev/stdin입니다! (한숨) –

+1

이것은 아무도 앉아서 중간 정도의 괜찮은 C++ 라이브러리 세트를 만든 방법을 보여줍니다. (만약 많은 버전 화 문제가 없다면 boost라고 부릅니다.) –

+1

FWIW는'reset'에'noop()'를 전달하는 대신 C++ 11을 사용하여 (그리고 구조체를 정의하는 것) '[] (...) {}'은 그것을합니다. – akim

0
+0

나는 한 시간 전에 매우 비슷한 대답을 썼지 만,이 부분을 다시 읽은 후 삭제했다. "나는 ifstream을 클래스의 일부로 가진 약간의 코드를 받았습니다." 이 질문의 제목은 "파일을 읽으려면 cin을 리디렉션하는 방법"으로 읽힐 수 있다는 점에서 오해의 소지가 있습니다. 그러나 IIUC는 그 반대입니다. OP에 이미 ifstream이 있으며이를 cin으로 리디렉션하려고합니다. –

+0

사실. 우리는 ifstream의 streambuf를 이와 같이 변경할 수 없습니다. Chris Jester-Young의 솔루션 에서처럼 사용 된 스트림의 정확한 유형을 변경해야합니다. –

관련 문제