在我们做Online Judge的时候,OJ基本上都是用标准输入输出。但如果每次调试的时候也都是从控制台输入数据,那就太浪费时间了。
我们可以重定向标准输入,调试的时候从文件读数据,提交的时候从标准读。
在C语言中,
方法比较简单。使用函数freopen(),
freopen是被包含与stdio.h头文件中,用于重定向输入输出流的函数。该函数可以在不改变代码原貌的情况下改变输入输出环境,但使用时应当保证流是可靠的。
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
这样就把标准输入重定向到了data.in文件,标准输出重定向到了data.out文件。
这两句代码之后,scanf函数就会从data.in文件里读,而printf函数就会输出到data.out文件里了。
freopen("data.out","w",stdout);
这样就把标准输入重定向到了data.in文件,标准输出重定向到了data.out文件。
这两句代码之后,scanf函数就会从data.in文件里读,而printf函数就会输出到data.out文件里了。
代码示例:
#include <iostream>
#include <cstdio> //包含语言重定向函数freopen的库
using namespace std;
int main()
{
//正式提交代码时,删除下面两项就行了
freopen("input.txt","r",stdin); //重定向输入流
freopen("output.txt","w",stdout); //重定向输出流
/* input.txt 文件内容如下:
2
1 1
2 2
*/
int n;
int a,b;
cin>>n;
for(int i=0; i<n; ++i){
cin>>a>>b;
cout<<a+b<<endl;
}
/* output输出文件
2
4
*/
return 0;
}
C++语言中:
对流重定向有两个重载函数:
streambuf* rdbuf () const;
streambuf* rdbuf (streambuf*)
就相当于get/set方法。
streambuf* rdbuf () const;
streambuf* rdbuf (streambuf*)
就相当于get/set方法。
code:
streambuf *backup;
ifstream fin;
fin.open("data.in");
backup = cin.rdbuf(); // back up cin's streambuf
cin.rdbuf(fin.rdbuf()); // assign file's streambuf to cin
// ... cin will read from file
cin.rdbuf(backup); // restore cin's original streambuf
ifstream fin;
fin.open("data.in");
backup = cin.rdbuf(); // back up cin's streambuf
cin.rdbuf(fin.rdbuf()); // assign file's streambuf to cin
// ... cin will read from file
cin.rdbuf(backup); // restore cin's original streambuf
代码示例:
#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("input.txt");
std::streambuf *cinbuf = std::cin.rdbuf(); //save old buf
std::cin.rdbuf(in.rdbuf()); //redirect std::cin to in.txt!
std::ofstream out("output.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
}
Java语言中:
Java的标准输入/输出分别通过System.in和System.out来代表,在默认的情况下分别代表键盘和显示器,当程序通过System.in来获得输入时,实际上是通过键盘获得输入。当程序通过System.out执行输出时,程序总是输出到屏幕。
在System类中提供了三个重定向标准输入/输出的方法
static void setErr(PrintStream err) 重定向“标准”错误输出流
static void setIn(InputStream in) 重定向“标准”输入流
static void setOut(PrintStream out)重定向“标准”输出流
下面程序通过重定向标准输出流,将System.out的输出重定向到文件输出,而不是在屏幕上输出。
在System类中提供了三个重定向标准输入/输出的方法
static void setErr(PrintStream err) 重定向“标准”错误输出流
static void setIn(InputStream in) 重定向“标准”输入流
static void setOut(PrintStream out)重定向“标准”输出流
下面程序通过重定向标准输出流,将System.out的输出重定向到文件输出,而不是在屏幕上输出。
示例代码:
package edu.ustc.demo.test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.Scanner;
public class Redirect {
public static void main(String args[]) throws FileNotFoundException {
FileInputStream fis = new FileInputStream("input.txt");
System.setIn(fis);
PrintStream ps = new PrintStream(new FileOutputStream("output.txt"));
System.setOut(ps);
Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()) {
System.out.println(sc.nextLine());
}
}
}
参考文章: