How to redirect cin and cout to files?
c++
Solution
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 <iostream>
#include <fstream>
#include <string>
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.
Problem
How can I redirect `cin` to `in.txt` and `cout` to `out.txt`?
Related problems
- Significance of ios_base::sync_with_stdio(false); cin.tie(NULL);
- What's the problem with "using namespace std;"?
- Redirect both cout and stdout to a string in C++ for Unit Testing
- Using std Namespace
- Redirect cin to a string
- How to resolve a name collision between a C++ namespace and a global function?
- How do you properly use namespaces in C++?