如何将cin和coutredirect到文件?

我如何redirectcinin.txtcoutout.txt

这是你想要做的一个工作的例子。 阅读注释以了解代码中的每一行。 我用gcc 4.6.1在我的电脑上testing过; 它工作正常。

 #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 } 

您可以保存redirect到一行:

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

这里std::cin.rdbuf(in.rdbuf())std::cin's缓冲区设置为in.rdbuf() ,然后返回与std::cin关联的旧缓冲区。 std::cout也可以做到这一点 – 或者任何stream

希望有所帮助。

只要写

 #include <cstdio> #include <iostream> using namespace std; int main() { freopen("output.txt","w",stdout); cout<<"write in file"; return 0; } 

假设您的编译程序名是x.exe,$是系统shell或提示符

 $ x <infile >outfile 

将从infileinput并输出到outfile。

下面是一个简短的代码片段,用于对编程竞赛有用的cin / cout:

 #include <bits/stdc++.h> using namespace std; int main() { ifstream cin("input.txt"); ofstream cout("output.txt"); int a, b; cin >> a >> b; cout << a + b; } 

这带来了额外的好处,即简单的fstream比同步的stdiostream快。 但是这只适用于单一function的范围。

全局cin / coutredirect可以写成:

 #include <bits/stdc++.h> using namespace std; void func() { int a, b; std::cin >> a >> b; std::cout << a + b; } int main() { ifstream cin("input.txt"); ofstream cout("output.txt"); // optional performance optimizations ios_base::sync_with_stdio(false); std::cin.tie(0); std::cin.rdbuf(cin.rdbuf()); std::cout.rdbuf(cout.rdbuf()); func(); } 

请注意, ios_base::sync_with_stdio也会重置std::cin.rdbuf 。 所以订单很重要

另请参阅ios_base :: sync_with_stdio(false)的含义; cin.tie(NULL);