最近用学校机房的电脑参加比赛或者算法考试,都出现了命令行终端无法输入的问题,如果是简单输入还好,但是如果是图论或者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;
}

截屏2023-12-07 16.15.40

注意:要在指定路径下提前创建好输入文件,我这里这种写法就是同级目录(为了方便),输出文件可以不提前创建,因为运行结束后会自动生成。
如果不指定:freopen("out.txt", "w", stdout); 就会在终端中输出。

运行效果:

截屏2023-12-07 16.18.02

不过这种方法不能实时改变结果,每次修改输入或运行之后都要关闭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; // 输入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;
}

效果:

截屏2023-12-07 18.28.40

方法二:命令行重定向

终端中将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; // 输入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

截屏2023-12-07 18.42.57

如图,输入命令后就会创建对应文件。其实这一步可以用本身的编译器来编译,例如,Dev-C++编译后就会产生一个exe文件,直接用这个exe文件执行也是可以的。

再执行文件,只重定向输入:

截屏2023-12-07 18.46.43

既重定向输入,又重定向输出:

截屏2023-12-07 18.48.33

python重定向

简单说说,我可能会用到,但是一定不常用,我个人感觉这种方式输入后还要分割一下,比较复杂:

1
2
3
4
5
6
7
import sys

sys.stdin = open('in.txt','r') # 此语句实现了将标准输入重定向为in.txt
sys.stdout = open('out.txt','w') # 此语句实现了将标准输出重定向为out.txt

inputList=[2*int(e) for e in input().split()]
print(inputList)