2010-11-02 2 views
7

Как бы вы выбрали ifstream в istream. Я считаю, что если поток является дочерним элементом 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

+0

Действительно, вы можете напрямую назначить их, но если у вас возникли проблемы, вам должен опубликовать ваш код, чтобы мы знали, что не так. – casablanca

+0

На самом деле вам не нужно. Вы можете просто использовать поток файлов в любом месте, где требуется istream, и компилятор выполнит автоматический выбор для вас. –

ответ

1

Try:

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); '. –

+1

Почему ... почему бы вам передать указатель, когда будет ссылка? –

+0

@Martin: Я просто демонстрировал гибкость языка. Поскольку из вопроса ОП неясно, в чем проблема, с которой он сталкивается, неясно. –

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

Вы забыли звездочку в своем динамическом роле. Я думаю, вы имели в виду 'std :: istream * istreamObj = dynamic_cast (& ifStreamObj)' –

+1

Не только вы не подтвердили правильность кода. Нет реальной потребности в актерском составе. Вытащите его, и он все еще прекрасно компилируется. Когда компилятор действительно работает для вас, нет необходимости на самом деле делать это самостоятельно. –

+0

Мои искренние извинения. Мои запястья были разрезаны, поэтому ни один смертный не может снова смотреть на мои ошибки. Расслабься немного, а? Добавление «*» ... – Neil

20

Нет броска не требуется.

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

Это помогло бы ИМХО упомянуть, что это работает из-за полиморфизма, т. Е. Того, что ifstream является подклассом istream. (Пожалуйста, поправьте меня, если я ошибаюсь!) –

+2

@ Ли-Ман: ОП уже упоминал, что (по модулю терминологии), поэтому я этого не сделал. Ура, –

Смежные вопросы