C/C++,Java 重定向输入输出流至文件

13 篇文章 0 订阅
12 篇文章 0 订阅
在我们做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文件里了。

代码示例:
#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方法。

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

代码示例:
#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的输出重定向到文件输出,而不是在屏幕上输出。
示例代码:
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());
		}

	}
}

参考文章:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值