2011-03-10 143 views
14

使用c樣式i/o進行編程時,我有時會使用freopen()重新打開stdin以進行測試,這樣我就不必重複輸入輸入。我想知道是否有相當於C++ i/o流。另外,我知道我可以使用管道在命令行/終端/任何炎症上重定向它,但我想知道是否有辦法在我的代碼中執行它(因爲正如你所看到的,我並不是很瞭解CL/T/W)。freopen()等效於C++流

+0

你能讀取相同數據兩次,當你有相同流的兩個文件描述符?如果沒有,你總是可以在C++中使用std :: cin的多個實例 – LumpN 2011-03-10 09:28:05

+0

[如何將cin和cout重定向到文件?](http://stackoverflow.com/questions/10150468/how-to-redirect- cin-and-cout-to-files) – Vadzim 2016-07-21 12:56:45

回答

26

freopen也可以與cincout一起使用。無需搜索新的東西。

freopen("input.txt", "r", stdin); // redirects standard input 
freopen("output.txt", "w", stdout); // redirects standard output 

int x; 
cin >> x; // reads from input.txt 
cout << x << endl; // writes to output.txt 

編輯:從C++標準27.3.1:

從與該對象相關聯的標準輸入流緩衝區,在<cstdio>聲明CIN控制輸入的對象。

因此,根據標準,如果我們重定向stdin它也將重定向cin。反之亦然cout

+0

不,不。這個程序有未定義的行爲。 – 2011-03-10 14:38:23

+0

@R ..我在視覺工作室和g ++上用了很多次,我沒有任何問題。你能解釋一下它究竟有什麼問題嗎? – UmmaGumma 2011-03-10 14:59:19

+0

僅僅因爲某個實現有效,並不意味着它是有效的C++。最後我檢查了一下,它是*最好的*實現 - 定義了對stdio的更改是否在相應的iostream中可見,反之亦然,並且可能更糟糕。 – 2011-03-10 16:31:16

1

This新聞組發佈探索您的選擇。

這是依賴於系統和海報沒有指出 系統,但cin.clear()應該工作。我已經測試了帶有AT & T版本的iostreams的UNIX系統上附帶的 程序。

#include <iostream.h> 
int main() 
{ 
    for(;;) { 
     if (cin.eof()) { 
      cout << "EOF" << endl; 
      cin.clear(); 
     } 
     char c ; 
     if (cin.get(c)) cout.put(c) ; 
    } 
} 

是的,工作在Cfront的和TC++沒關係。 在G ++哪裏出了問題首次出現附加一個動作是必需的:

cin.clear(); 
    rewind (_iob); // Seems quite out of place, doesn't it? 
        // cfront also accepts but doesn't 
        // require this rewind. 

雖然我注意到,這是在1991年,它仍然應該工作。請記住使用現在的標準iostream標題,而不是iostream.h

(順便說一句,我發現後與谷歌搜索詞「重新打開CIN C++」,第二個結果。)

讓我們知道您的身體情況如何。您也可以使用freopen

+0

像這樣混合使用C stdio和C++ iostream的用法是無效的,並且會導致實現定義或未定義的行爲。 – 2011-03-10 14:39:27

+0

對不起,我真的不明白這與我的問題有何關係。你能解釋更多嗎? – quasiverse 2011-03-11 10:05:16

+0

@quasiverse:這是關於通過'cin'重新打開STDIN。 – 2011-03-11 10:12:52

14
#include <iostream> 
#include <fstream> 

int main() { 

    // Read one line from stdin 
    std::string line; 
    std::getline(std::cin, line); 
    std::cout << line << "\n"; 

    // Read a line from /etc/issue 
    std::ifstream issue("/etc/issue"); 
    std::streambuf* issue_buf = issue.rdbuf(); 
    std::streambuf* cin_buf = std::cin.rdbuf(issue_buf); 
    std::getline(std::cin, line); 
    std::cout << line << "\n"; 

    // Restore sanity and read a line from stdin 
    std::cin.rdbuf(cin_buf); 
    std::getline(std::cin, line); 
    std::cout << line << "\n"; 
} 

http://www.cplusplus.com/reference/iostream/ios/rdbuf/