如何将cin和coutredirect到文件?
我如何redirectcin
到in.txt
和cout
到out.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);