2010-02-07 59 views
3

我需要編寫一個從ifstream或cin中讀取的程序,具體取決於運行時傳遞給程序的參數。在C++中聲明泛型istream

我打算做好以下工作:

istream in; 

if(argv[1] == "cin") 
{ 
     in = cin; 
} 
else 
{ 
     ifStream inFile; 
     inFile.open(argv[1].c_str()); 
     in = inFile; 
} 

然而,在的IStream保護,我不能宣佈在istream對象是否有申報在流,通用的方式?

回答

3

改爲使用istream*來嘗試。但請注意,您必須稍微更改代碼。使用指針必須保留指向的對象的內存區域。換句話說,「inFile」變量不能在那裏聲明,因爲它不會在else之外。該代碼可能是,則:

istream* in; 
ifStream inFile; 

if(!strcmp(argv[1],"cin")) 
{ 
     in = &cin; 
} 
else 
{ 
     inFile.open(argv[1]); 
     in = &inFile; 
} 
// use *in 

(還要注意的字符串處理的修改,我修改了他們作爲一個例子。)

+0

好吧,我試過了,但是下面的代碼產生以下錯誤: CODE: 而(* in.good()){ 絃線; getline(* in,line); cout << line; } 錯誤: 對'in'中的成員'good'的請求,它是非類類型的'std :: istream *' – finiteloop 2010-02-07 23:15:09

+1

使用'(* in).good'或'in-> good'。只需坐下來熟悉C++語法即可。你會節省很多時間:) – 2010-02-07 23:17:46

+0

哦,好的。謝謝您的幫助。我只是沒有想好。 – finiteloop 2010-02-07 23:19:15

1

另一種設計是寫使用cin你的代碼,然後用如果要接受來自文件的輸入,則在運行程序時使用input redirection。這並不能回答你確切的問題,但對於你提出的案例來說這是一個更簡單的設計。

例如,而不是

program.exe cin 

你會運行的

program.exe myfile.txt 

program.exe 

,而是你可以運行

program.exe < myfile.txt 

這適用於* nix和Windows。

0

你也可以做到這一點沒有指針:

ifStream inFile; 
istream in(argv[1] == "cin" ? cin : inFile.open(argv[1]));