How to redirect cin and cout to files?

后端 未结 5 1519
慢半拍i
慢半拍i 2020-11-22 07:24

How can I redirect cin to in.txt and cout to out.txt?

5条回答
  •  抹茶落季
    2020-11-22 07:50

    Here is an working example of what you want to do. Read the comments to know what each line in the code does. I've tested it on my pc with gcc 4.6.1; it works fine.

    #include 
    #include 
    #include 
    
    void f()
    {
        std::string line;
        while(std::getline(std::cin, line))  //input from the file in.txt
        {
            std::cout << line << "\n";   //output to the file out.txt
        }
    }
    int main()
    {
        std::ifstream in("in.txt");
        std::streambuf *cinbuf = std::cin.rdbuf(); //save old buf
        std::cin.rdbuf(in.rdbuf()); //redirect std::cin to in.txt!
    
        std::ofstream out("out.txt");
        std::streambuf *coutbuf = std::cout.rdbuf(); //save old buf
        std::cout.rdbuf(out.rdbuf()); //redirect std::cout to out.txt!
    
        std::string word;
        std::cin >> word;           //input from the file in.txt
        std::cout << word << "  ";  //output to the file out.txt
    
        f(); //call function
    
    
        std::cin.rdbuf(cinbuf);   //reset to standard input again
        std::cout.rdbuf(coutbuf); //reset to standard output again
    
        std::cin >> word;   //input from the standard input
        std::cout << word;  //output to the standard input
    }
    

    You could save and redirect in just one line as:

    auto cinbuf = std::cin.rdbuf(in.rdbuf()); //save and redirect
    

    Here std::cin.rdbuf(in.rdbuf()) sets std::cin's buffer to in.rdbuf() and then returns the old buffer associated with std::cin. The very same can be done with std::cout — or any stream for that matter.

    Hope that helps.

提交回复
热议问题