2010-01-29 67 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

cin不是ifstream,但如果你可以用istream代替,那麼你就贏了。否則,如果您準備不可攜帶,只需打開/dev/stdin/dev/fd/0或其他。 :-)


如果想成爲便攜,並且可以使你的程序中使用istream,這裏是做到這一點的一種方法:

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

謝謝...這隻需要可移植到linux和osx,所以/ dev/stdin就是這樣! (嘆氣) – 2010-02-04 00:15:51

+1

這說明了沒有人坐下來,並製作了一半體面的C++庫。 (如果它沒有太多的版本問題,我會說boost) – 2012-01-05 18:17:10

+1

FWIW,用C++ 11而不是將'noop()'傳遞給'reset'(並定義結構),一個簡單的(和有趣的) '[](...){}'做到了。 – akim 2013-09-27 09:30:13

0
+0

我在一個小時前寫了一個非常類似的答案,但是在重新閱讀這部分問題之後,刪除了它:「我收到了一些代碼,它將ifstream作爲類的一部分」。這個問題的標題是誤導性的,因爲它可能被解讀爲「我如何重定向cin以從文件中讀取」,但它是,IIUC,反過來:OP已經有一個ifstream並希望將它重定向到cin。 – 2010-01-29 16:03:11

+0

確實。我們不能像這樣改變ifstream的streambuf。 正如Chris Jester-Young的解決方案一樣,所使用的流的確切類型需要更改。 – 2010-01-29 16:56:43