最近用学校机房的电脑参加比赛或者算法考试,都出现了命令行终端无法输入的问题,如果是简单输入还好,但是如果是图论或者BFS的题就很麻烦,于是想着解决一下。
C++重定向
方法一:freopen()
其实还有一个函数是redbuf()
,也可以重定向,但是感觉用法比这个复杂一点
重定向输入:freopen("输入文件路径", "r", stdin);
重定向输出:freopen("输出文件路径", "w", stdout);
简单代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #include <iostream> using namespace std;
int main() { freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); int a, b; cin >> a >> b; cout << a + b; fclose(stdin); fclose(stdout); return 0; }
|
注意:要在指定路径下提前创建好输入文件,我这里这种写法就是同级目录(为了方便),输出文件可以不提前创建,因为运行结束后会自动生成。
如果不指定:freopen("out.txt", "w", stdout);
就会在终端中输出。
运行效果:
不过这种方法不能实时改变结果,每次修改输入或运行之后都要关闭out.txt再打开才会有变化(因为是文件读写)。
再尝试一下复杂一点的输入:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #include <iostream> using namespace std;
const int N = 100; int n, m; string g[N];
int main() { freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout);
cin >> n >> m; for (int i = 0; i < n; ++i) { cin >> g[i]; }
cout << n << " " << m << endl; for (int i = 0; i < n; ++i) { cout << g[i] << endl; } return 0; }
|
效果:
方法二:命令行重定向
终端中将C++文件编译为可执行文件:
Windows:
1 2 3 4 5 6 7
| g++ xxx.cpp -o xxx.exe
./xxx.exe < in.txt
./xxx.exe < in.txt > out.txt
|
MacOS/Linux:
1 2 3 4 5 6 7
| g++ xxx.cpp -o xxx.out
./xxx.out < in.txt
./xxx.out < in.txt > out.txt
|
以下用MacOS举例,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include <iostream> using namespace std;
const int N = 100; int n, m; string g[N];
int main() { cin >> n >> m; for (int i = 0; i < n; ++i) { cin >> g[i]; }
cout << n << " " << m << endl; for (int i = 0; i < n; ++i) { cout << g[i] << endl; } return 0; }
|
1
| g++ test.cpp -o test.out
|
如图,输入命令后就会创建对应文件。其实这一步可以用本身的编译器来编译,例如,Dev-C++编译后就会产生一个exe文件,直接用这个exe文件执行也是可以的。
再执行文件,只重定向输入:
既重定向输入,又重定向输出:
python重定向
简单说说,我可能会用到,但是一定不常用,我个人感觉这种方式输入后还要分割一下,比较复杂:
1 2 3 4 5 6 7
| import sys
sys.stdin = open('in.txt','r') sys.stdout = open('out.txt','w')
inputList=[2*int(e) for e in input().split()] print(inputList)
|