標準入力に何かを入力させて処理をするプログラムをデバッグする場合、何度も同じ入力を繰り返すことがよくある。そんなときには入力データをファイルとして用意して、パイプとリダイレクションを使ってファイルに入出力をすると便利だが、それ以外にもfreopen関数を使う方法もある。Windows上でVisual Studioのような統合開発環境を使って開発をしている場合には、こちらの方が便利かもしれない。


例えば、以下のように、標準入力から数値を読み込んで計算結果を出力するプログラムがあったとする。

#include <stdio.h>

int main(){
	int n;
	while(scanf("%d", &n)){
		printf("%d * %d = %d\n", n, n, n*n);
	}

	return 0;
}

このプログラムは以下のようにfreopen関数を使うことで、data.txtからデータを読み込んでresult.txtに出力するように、簡単に変更することができる。

#include <stdio.h>

int main(){
	// 標準入出力をファイルに変更
	FILE* fp_in = freopen("data.txt", "r", stdin);
	FILE* fp_out = freopen("result.txt", "w", stdout);

	// データの読み書き
	int n;
	while(scanf("%d", &n)){
		printf("%d * %d = %d\n", n, n, n*n);
	}

	// ファイルを閉じる
	fclose(fp_in);
	fclose(fp_out);

	return 0;
}

C++のstd::cin、std::coutでも同じようなことができる。

#include <iostream>

int main(){
	// 標準入出力をファイルに変更
	FILE* fp_in = freopen("data.txt", "r", stdin);
	FILE* fp_out = freopen("result.txt", "w", stdout);

	// データの読み書き
	int n;
	while(std::cin >> n){
		std::cout << n << " * " << n << " = " << (n*n) << std::endl;
	}

	// ファイルを閉じる
	fclose(fp_in);
	fclose(fp_out);

	return 0;
}