2017-04-19 189 views
5

對於我生命中的大部分時間,我一直在使用cstdio。現在我試圖轉移到iostream運行.exe並重定向標準輸入和輸出

假設我有一個名爲「Foo.cpp中」一個獨立的程序,看起來像這樣:

int main(){ // foo.cpp 
    int x; 
    std::cin >> x; 
    std::cout << x + 5 << "\n"; 
} 

在所謂的「bar.cpp」另一個程序,我叫foo的可執行文件。在過去,如果我想stdin和stdout重定向到一個文件,我會用freopen像這樣:

int main(){ // bar.cpp, redirecting stdin and stdout 
    freopen("foo.in", "r", stdin); // Suppose "foo.in" contains a single integer "42" 
    freopen("foo.out", "w", stdout); 

    system("foo.exe"); // "foo.out" will contain "47" 
} 

現在我想重定向std::cinstd::cout到stringstreams。事情是這樣的:

int main(){ // bar.cpp, redirecting cin and cout 
    std::istringstream instr("62"); 
    std::ostringstream outstr; 

    std::cin.rdbuf(instr.rdbuf()); 
    std::cout.rdbuf(outstr.rdbuf()); 

    system("foo.exe"); // outstr should contain "67" 
} 

但我所瞭解到的情況是std::cinstd::cout執行「foo.exe的」時,沒有重定向。該程序現在預計用戶輸入並將打印到std::cout。當執行「foo.exe」時,「bar.cpp」中的std::cinstd::cout仍分別重定向到instroutstr

我的問題是,有沒有像我想要的那樣用iostream這樣做的方法,還是我堅持使用freopen

+1

操作系統負責處理可執行文件的輸出。 C++語言沒有重定向輸出的功能。 –

+1

用於在程序之間共享數據的常見解決方案:文件,套接字,管道(告訴OS將其他程序的管道輸出轉換爲程序的標準輸入),共享內存區域。在網上找。 –

+1

你是否試過只做同樣的freopen調用? – stark

回答

1

有一段時間沒有看到freopen調用。這帶回了一些舊的回憶。我想你應該堅持freopen。該documentation頁面中的功能的字面規定,這是主要的用例之一:

該功能對重定向預定義流像標準輸入標準輸出標準錯誤到特定的文件特別有用。

我不認爲你可以做重定向,只有iostream,因爲iostream庫沒有對freopen功能的等價物。

但爲什麼這個解決方案,您試過不行有趣的是:

std::cin.rdbuf(instr.rdbuf()); 
std::cout.rdbuf(outstr.rdbuf()); 

也許與兩行你只是影響rdbuf的std::cin和從當前進程std::cout和子有另一個std::cinstd::cout的實例。

當調用system時,關於文件的信息似乎從父進程複製到子進程。這就是爲什麼您在stdin標準輸出freopen的主進程中所做的更改也在子流程中可見。

無論如何,you should not use system從主C++程序運行子程序。因爲你可能在Windows上(從foo.exe猜測),我會分析這個來自微軟的example。它解釋瞭如何創建子流程並使用管道重定向子程序的輸入和輸出。

0

在使用freopen的示例代碼中,您重定向到物理文件/從物理文件重定向?在使用std :: istringstream和std :: ostringstream的示例代碼中,您試圖重定向到/從內存中更正?物理文件與內存不一樣。內存沒有文件描述符。在Linux中,您可以使用fmemopen,如windows - C - create file in memory - Stack Overflow,但這對C++標準類(如std :: istringstream和std :: ostringstream)無幫助,您也不能將stdin和stdout重定向到fmemopen /從fmemopen,因爲fmemopen在所有操作系統中都不可用。 C++標準類不支持這種類型的東西;見c++ - Getting a FILE* from a std::fstream - Stack Overflow。 std :: istream和std :: ostream可能在C++ interace級別看起來像std :: istringstream和std :: ostringstream,但在內部它們不兼容。

相關問題