2016-03-04 41 views
2

我有一個程序從終端讀取輸入,而cin的流在多個類中用於各級解析。我可以將ifstream重定向到cin嗎?

而不是使用cin從終端獲取數據,我想讀取具有我需要解析的信息的文件,但我不想修改所有我的頭文件和.cpp文件以接受ifstream&參數。

爲了保持現有的代碼,我試圖簡單地將ifstream重定向到cin,但不知道如何。

所以假設我有主要以下幾點:

ifstream inFile("myfile.txt", ifstream::io); 

string line; 
while(getline(inFile, line)) 
{ 
    char firstChar; 
    inFile >> firstChar; 
    cout << firstChar; 
    inFile.ios::rdbuf(cin.rdbuf()); 
    Continue myFile; 
} 

在我continue.cpp我只是在做:

Continue() 
{ 
    string line; 
    cin >> line; 
    cout << "---remaining line: " << line << "\n"; 
} 

但是它只是打印從主的第一個字符。

+2

「但我不」我想修改所有的頭文件和.cpp文件來接受ifstream&參數。「那真不幸。 –

+0

@AmiTavory啊好吧,所以沒有辦法繞過它? –

+0

是的。看看dup和dup2函數(前綴爲'_' for Windows)。我只是尋找一個例子。 –

回答

7

只需簡單更換指針std::streambuf

ifstream file("myfile.txt"); 
string line; 
if (file.is_open()) { 
    cin.rdbuf(file.rdbuf()); // swap 
    cin >> line; 
} 
std::cout << line; 
+0

我認爲這樣做,但我得到一個錯誤'std :: istream'沒有任何成員名爲'set_rdbuf' –

+0

正如你可以告訴,我'新的C++ :-P –

+0

我只是將它改爲'cin.rdbuf(file.rdbuf())'而且工作!非常感謝 –

4

istream對象從std::streambuf中讀取,並且可以換出。有關成員函數是.rdbuf

1

您也可以在底層的C stdin文件句柄重定向到一個不同的文件,這也會影響你的cin

freopen ("myfile.txt", "r", stdin); 
0

這是一個非常快速簡單的方法。

如果你的文件名爲「file.txt的」,代碼爲:

fstream cin("file.txt"); 

這樣,一切從文件將被重定向到CIN >>

相關問題