2010-11-02 65 views
7

如何將ifstream轉換爲istream。我認爲,因爲ifstream是istream的孩子,我應該可以這樣做,但我一直有這樣的任務的問題。將ifstream轉換爲istream

std::istream & inputStr = std::cin; 
    std::ostream & outputStr = std::cout; 
    if(argc == 3){ 
    std::fstream inputFile; 
    inputFile.open(argv[1], std::fstream::in); 
    if(!inputFile){ 
     std::cerr << "Error opening input file"; 
     exit(1); 
    } 
    inputStr = inputFile; 
..... 
} 
+0

http://coding.derkeiler.com/Archive/C_CPP/comp.lang.cpp/2004-09/0856.html – DumbCoder 2010-11-02 17:11:10

+0

事實上,你可以直接給它們,但如果你有問題,你應該發佈你的代碼,以便我們知道什麼是錯的。 – casablanca 2010-11-02 17:18:28

+0

你應該不需要。你可以在任何需要使用istream的地方使用文件流,編譯器會爲你做一個自動轉換。 – 2010-11-02 18:26:09

回答

1

嘗試:如果

std::ifstream* myStream; 
std::istream* myOtherStream = static_cast<std::istream*>(myStream); 
myOtherStream = myStream; // implicit cast since types are related. 

同樣的作品,你有一個參考(&)的流類型爲好。 static_cast在這種情況下是優選的,因爲在編譯時鑄造完成,允許編譯器在鑄造不可能的情況下報告錯誤(即,istream不是基本類型ifstream)。

此外,您可能已經知道這一點,您可以將指針/引用傳遞給ifstream以接受指向istream的指針/引用的任何函數。例如,下面是由語言允許的:

void processStream(const std::istream& stream); 

std::ifstream* myStream; 
processStream(*myStream); 
+0

我認爲你的第一個代碼塊中的'static_cast'不會在原地發生,因此它需要被分配給一個'std :: istream'指針:'std :: istream * myStream2 = static_cast (myStream);'。 – 2010-11-02 17:43:26

+1

爲什麼o爲什麼o爲什麼當參考文件要做時會傳遞一個指針? – 2010-11-02 18:27:41

+0

@Martin:我只是展現了語言的靈活性。由於OP的問題不清楚他/她正在經歷什麼問題。 – 2010-11-02 19:07:41

0
std::istream *istreamObj = dynamic_cast<std::istream *>(&ifStreamObj) 
+0

您在動態演員表中忘記了一個星號。我認爲你的意思是'std :: istream * istreamObj = dynamic_cast (&ifStreamObj)' – 2010-11-02 17:39:21

+1

你不僅沒有驗證代碼是否正確。沒有實際需要演員。拿出來,它仍然編譯好。當編譯器爲你工作時,你不需要親自去做。 – 2010-11-02 18:28:38

+0

我真誠的道歉。我的手腕已經裂開,所以沒有凡人可能再次盯上我的錯誤。放鬆一下,呃?添加'*'... – Neil 2010-11-03 09:42:02

20

沒有投是必要的。

#include <fstream> 
int main() 
{ 
    using namespace std; 
    ifstream f; 
    istream& s = f; 
} 
+2

這將有助於恕我直言,指出這是因爲多態性,即ifstream是istream的子類的事實。 (請糾正我,如果我錯了!) – 2010-11-02 18:18:20

+2

@李曼:OP已經提到,(模數術語),所以我沒有。乾杯, – 2010-11-02 19:14:20

相關問題