2010-11-02 77 views
7

Làm cách nào để chuyển một luồng ifstream vào dòng istream. Tôi tính từ ifstream là một đứa trẻ của istream tôi sẽ có thể làm như vậy nhưng tôi đã có vấn đề với một nhiệm vụ như vậy.Chuyển đổi ifstream thành 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

Thật vậy, bạn có thể trực tiếp chỉ định cho họ, nhưng nếu bạn gặp sự cố, bạn nên đăng mã của bạn để chúng tôi biết có gì sai. – casablanca

+0

Bạn không nên thực sự cần. Bạn chỉ có thể sử dụng các dòng tập tin ở bất kỳ nơi nào một istream là cần thiết và trình biên dịch sẽ làm một diễn viên tự động cho bạn. –

Trả lời

1

Hãy thử:

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

Các công trình tương tự nếu bạn có một tài liệu tham khảo (&) để loại suối là tốt. static_cast được ưu tiên trong trường hợp này khi diễn viên được thực hiện tại thời gian biên dịch, cho phép trình biên dịch báo cáo lỗi nếu không thể truyền (tức là istream không phải là loại cơ sở là ifstream).

Ngoài ra, và có thể bạn đã biết điều này, bạn có thể chuyển con trỏ/tham chiếu đến ifstream cho bất kỳ chức năng nào chấp nhận con trỏ/tham chiếu đến istream. Ví dụ, sau đây được phép bằng ngôn ngữ:

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

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

Tôi nghĩ rằng 'static_cast' trong khối mã đầu tiên của bạn không xảy ra tại chỗ vì vậy nó cần phải được gán cho con trỏ' std :: istream': 'std :: istream * myStream2 = static_cast (myStream); '. –

+1

Tại sao o tại sao o tại sao bạn vượt qua một con trỏ khi một tham chiếu sẽ làm gì? –

+0

@Martin: Tôi chỉ thể hiện sự linh hoạt của ngôn ngữ. Vì nó không được rõ ràng từ câu hỏi của OP chính xác những gì vấn đề anh/cô ấy đang trải qua. –

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

Bạn đã quên dấu sao trong dàn diễn viên năng động của mình. Tôi nghĩ rằng bạn có nghĩa là 'std :: istream * istreamObj = dynamic_cast (& ifStreamObj)' –

+1

Không chỉ bạn không xác minh mã là chính xác. Không có nhu cầu thực tế cho dàn diễn viên. Lấy nó ra và nó vẫn biên dịch tốt. Khi trình biên dịch làm việc cho bạn, bạn không cần thực sự tự làm. –

+0

Xin lỗi chân thành của tôi. Cổ tay của tôi đã được khe, vì vậy không có người chết có thể lại nhắm mắt vào những sai lầm của tôi. Hãy thư giãn một chút, eh? Thêm một '*' ... – Neil

20

Không dàn diễn viên là cần thiết.

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

Nó sẽ giúp IMHO đề cập đến việc này hoạt động vì tính đa hình, tức là thực tế là ifstream là một phân lớp của istream. (Xin vui lòng sửa tôi nếu tôi sai!) –

+2

@ Lee-Man: OP đã đề cập rằng (thuật ngữ modulo), vì vậy tôi đã không. Chúc mừng, –

Các vấn đề liên quan