CMNSOFT平台
11.重定向输入输出
发表时间:2026-02-17 23:40:02    作者:孙自超

输入重定向就是程序不从键盘读内容,改从提前写好的文件里拿;输出重定向就是程序不把结果显示在屏幕上,改写到文件里存起来。

为什么要用重定向

我们先来阅读下面这段程序:

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。请设计一个程序,计算这个班的语文、数学和英文各科的班级平均分。


@程序设计
Copyright © 2025 Sun zi chao - Website Content All Rights Reserved.  [第六版]
桂ICP备11003301号 桂公网安备45040302000027号运行:17天访问量:787