2010-11-02 108 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