进程通信 重定向

网友投稿 502 2022-05-29

本篇将介绍输入输出的重定向问题,先来看一个小小的实例,设有一个程序,该程序的输入输出为标准输入输出即从键盘上输入,输出到屏幕。现在要重定向输入法输出,使程序从文件中读取数据,处理后输出到文件。程序代码如下(称此程序为示例程序):

试给出几种不同的实现方法,另外如果没有程序代码,只有可执行文件,又应该如何做了?

实现方法一使用C语言的freopen()函数

函数功能:重定向控制台的输入输出

函数原型:

函数说明:

第一个参数为文件指针(也可以用来指向标准输入输出)。

第二个参数为打开方式,"w"表示写,"r"表示读,"a"表示追加。其它设置可以参考MSDN。

第三个参数为FILE类型的指针,传入stdin表示标准输入,传入stdout表示标准输出。

进程通信 重定向

这样用只要用简单一句freopen("infile.txt", "r", stdin);就可以使程序中的scanf()函数从文件中读取数据作为输入,同样freopen("outfile.txt", "w", stdout);可以使程序中的printf()函数将输出由标准输出改成输出到文件。现在有个问题,将程序的输入输出重定向到文件后,还能改回到标准输入输出吗?答案是可以的,对第一个参数传入"CON"这个字符串就可以了(linux为"/dev/console")。

下面就给出修改后的代码:

} 运行结果如下图所示:

可以看出该程序的输出输入已经完成了重定向。

实现方法2 使用C++的ifstream和ofstream类

有些场合使用类来完成输入输出的重定向任务会更加方便和习惯一些。所幸C++中就有ifstream和ofstream这二个类来帮助我们完成这一任务。这个二类的详细功能就不细说了。下面介绍下如何使用这二个类来重定向程序的输入输出(看的时候看慢点喔,不会会被很多类名给搞晕去^_^)。

这二个类可以以读的方式和写的方法打开一个文件(ifstream的首字母i就表示in,而ofstream的首字母o就表示out),在iosfwd文件中找到:

然后可以在fstream文件中找到basic_ifstream类是继承于basic_istream类,basic_ofstream类是继承于basic_ostream类。

然后再来看看C++中大家平常使用的cin和cout,可以在iostream文件中找到cin和cout的定义,这二个实际是istream类型和ostream类型的变量:

然后在iosfwd文件中可以找到:

明显cin和cout与ifstream类和ofstream类有着非常密切关系——cin是basic_istream类的变量,而ifstream则是basic_istream类的派生类。cout是basic_ostream类的变量,而ofstream则是basic_ostream类的派生类。

有了这个后,猜测很可能会有某个成员函数能将它们联系到一起,从而让cin和cout由标准输入输出重定向到从文件中读取,输出到文件。事实上在basic_istream类实际是虚继承于basic_ioso类,basic_ostream类实际是虚继承于basic_ios类。这二个类都有个rdbuf()成员函数,这个函数允许我们访问和修改类中一个类型为basic_streambuf类的成员变量。改动这个变量就能重定向输入输出。因此对cin和cout调用这个rdbuf()函数并传入ifstream和ofstream的rdbuf()就可以将控制台的标准输入输出改成从文件中读取和输出到文件。

OK,方法既然找到了,那下面就使用C++的方法来重定向输入输出:

} 运行结果如下图所示:

同样,这个程序也完成了输入输出的重定向。

本文转载自异步社区

软件开发

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《Hadoop权威指南:大数据的存储与分析》—3.7 通过distcp并行复制
下一篇:MySQL 源码学习(五)——Page和BTree
相关文章