11.重定向输入输出
发表时间: 2026-02-17 23:40:02 作者: 孙自超
Python版本 C++版本
输入重定向 就是程序不从键盘读内容,改从提前写好的文件里拿;输出重定向 就是程序不把结果显示在屏幕上,改写到文件里存起来。
为什么要用重定向
我们先来阅读下面这段程序:
yw = int(input("yw:"))
sx = int(input("sx:"))
yy = int(input("yy:"))
v1 = yw+sx+yy
v2 = v1/3
print(v1,v2)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int yw,sx,yy;
cin>>yw>>sx>>yy;
int total = yw+sx+yy;
float avg = float(total)/3;
cout<<total<<" "<<avg<<endl;
return 0;
}
这是一段根据输入语、数、英三科成绩,输出总分和平均分的程序。如果用这个程序统计全班50名同学的总分和平均分你们觉得方便吗?为什么?有解决办法吗?
看下图,如果我们把记录有50名学生三科成绩的文件当成一个输入。把存放统计结果的文件作为一个输出。这个问题就解决了。
下载in.txt 数据文件
同学们可能想到的是用程序操作文件内容读写,这个思路是对的。但还有一个更便捷的方法。就是重定向 。
语法示例
#include<bits/stdc++.h>
using namespace std;
int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
freopen("CONIN$", "r", stdin);
freopen("CONOUT$", "w", stdout);
return 0;
}
第6行 :设定输入重定向文件为in.txt ,文件操作属性为r (只读)。stdin 表示重定向输入。
第7行 :设定输出重定向文件为out.txt ,文件操作属性为w (可写)。stdout 表示重定向输出。
第9、10行 关闭输入和输出重定向功能,恢复原来从键盘输出,输出到屏幕设定。如果后面没 输出内容,这两行也可以不写,程序结束后,重定向也会恢复的。
import sys
sys.stdin = open('in.txt', 'r')
sys.stdout = open('out.txt', 'w')
sys.stdin.close()
sys.stdout.close()
import sys :使用sys模块。里面有重定向所要的功能。
sys.stdin = open('in.txt', 'r') :设置输入重定向的目标是一个叫in.txt 的文件。输入重定向对其只有只读 权限。
sys.stdout = open('out.txt', 'w') :设置输出重定向的目标是一个叫out.txt 的文件。输出重定向对其有可写 权限。
第6、7行 关闭输入和输出重定向功能,恢复原来从键盘输出,输出到屏幕设定。如果后面没 输出内容,这两行也可以不写,程序结束后,重定向也会恢复的。
应用示例
这是一个完整的从文件(in.txt)中读取50名学生三科成绩,并把计算结果输出到(out.txt)文件的程序示例。
#include<bits/stdc++.h>
using namespace std;
int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
int num,yw,sx,yy;
//获取人数
cin>>num;
for(int i=0;i<num;i++){
//获取每个学生的三科成绩
cin>>yw >>sx >>yy >>endl;
//计算总分和平均分
int total = yw+sx+yy;
float avg = float(total)/3;
//输出总分和平均分,中间用空格隔开
cout<<total<<" "<<avg<<endl;
}
freopen("CONIN$", "r", stdin);
freopen("CONOUT$", "w", stdout);
return 0;
}
其实如果后面没有输出命令,第26和27这两行恢复输入输出设置,不写也可以。程序结束后,会自动恢复原始的定向输入输出。C++的重定向命令还有rdbuf函数 ,有兴趣的同学可以自己上网查找学习。
import sys
sys.stdin = open('in.txt', 'r')
sys.stdout = open('output.txt', 'w')
#获取人数
num = input()
num = int(num)
for i in range(0,num):
cj = input() #获取一行成绩的字符串
cj = cj.split() #把字符串成绩按空格拆分成三个成绩字符串列表
#计算每个学生的总分和平均分
total = int(cj[0]) + int(cj[1]) + int(cj[2])
avg = total / 3
#输出总分和平均分到文件
print(total,avg)
#关闭定向输入输出
sys.stdin.close()
sys.stdout.close()
记录学生三科成绩的in.txt 文件要和原代码一起放在同一目录下,生成的输出文件out.txt 也是在这目录下。
练习
继续使用例题中的50个学生三科成绩文件in.txt 。请设计一个程序,计算这个班的语文、数学和英文各科的班级平均分。