继上一篇《进程通信之一使用WM_COPYDATA C++及C#实现》,进程通信之二将分为三篇文章讲解如何使用管道技术来完成进程通信功能。三篇文章目录如下:
1.《进程通信之二 管道技术第一篇 输入输出的重定向》
2.《进程通信之二 管道技术第二篇 匿名管道》
3.《进程通信之二 管道技术第三篇 命名管道》
本篇将介绍输入输出的重定向问题,先来看一个小小的实例,设有一个程序,该程序的输入输出为标准输入输出即从键盘上输入,输出到屏幕。现在要重定向输入法输出,使程序从文件中读取数据,处理后输出到文件。程序代码如下(称此程序为示例程序):
试给出几种不同的实现方法,另外如果没有程序代码,只有可执行文件,又应该如何做了?
实现方法一使用C语言的freopen()函数
函数功能:重定向控制台的输入输出
函数原型:
FILE *freopen(
const char *path,
const char *mode,
FILE *stream
);
函数说明:
第一个参数为文件指针(也可以用来指向标准输入输出)。
第二个参数为打开方式,"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文件中找到:
typedef basic_ifstream<char, char_traits<char> > ifstream;
typedef basic_ofstream<char, char_traits<char> > ofstream;
然后可以在fstream文件中找到basic_ifstream类是继承于basic_istream类,basic_ofstream类是继承于basic_ostream类。
然后再来看看C++中大家平常使用的cin和cout,可以在iostream文件中找到cin和cout的定义,这二个实际是istream类型和ostream类型的变量:
extern _CRTIMPistream cin;
extern _CRTIMPostream cout;
然后在iosfwd文件中可以找到:
typedef basic_istream<char, char_traits<char> > istream;
typedef basic_ostream<char, char_traits<char> > ostream;
明显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++的方法来重定向输入输出:
运行结果如下图所示:
同样,这个程序也完成了输入输出的重定向。
上面的方法都是建立在修改源代码的基础上,如果只有程序文件即.exe文件那应该怎么做了?请参阅下一篇《进程通信之二 管道技术第二篇 匿名管道》
转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/7390350
如果觉得本文对您有帮助,请点击‘顶’支持一下,您的支持是我写作最大的动力,谢谢。
分享到:
相关推荐
第一部分 Linux 操作环境 第1章 Linux基础 1.1 登录Linux系统 1.2 Linx的shell 1.3 shell的一些基本命令 第2章 文本编辑 2.1 vi文本编辑器 2.2 emacs文本编辑器 第3章 Linux文件系统操作 3.1 文件类型 3.2 文件系统...
第1章 入门 1.1 UNIX、Linux和GNU简介 1. 1.1 什么是UNIX 1. 1.2 什么是Linux 1. 1.3 GNU项目和自由软件基金会 1. 1.4 Linux发行版 1.2 Linux程序设计 1. 2.1 Linux程序 1. ...
第1章 入门 1.1 UNIX、Linux和GNU简介 1. 1.1 什么是UNIX 1. 1.2 什么是Linux 1. 1.3 GNU项目和自由软件基金会 1. 1.4 Linux发行版 1.2 Linux程序设计 1. 2.1 Linux程序 1. ...
第1章 入门 1.1 UNIX、Linux和GNU简介 1. 1.1 什么是UNIX 1. 1.2 什么是Linux 1. 1.3 GNU项目和自由软件基金会 1. 1.4 Linux发行版 1.2 Linux程序设计 1. 2.1 Linux程序 1. 2.2 文本...
第一篇 软件设计基础篇 第1章 软件开发起步 2 1.1 建立MFC应用程序 2 1.2 分析框架结构 4 1.2.1 框架代码文件的结构 4 1.2.2 应用程序类 5 1.2.3 对话框类 6 1.2.4 添加消息响应 7 第2章 对话框应用程序 9 ...
第一篇 软件设计基础篇 第1章 软件开发起步 2 1.1 建立MFC应用程序 2 1.2 分析框架结构 4 1.2.1 框架代码文件的结构 4 1.2.2 应用程序类 5 1.2.3 对话框类 6 1.2.4 添加消息响应 7 第2章 对话框应用程序 9 ...
特征这个库是关于通过标准输入,输出和错误的可选重定向启动外部进程的。 它涵盖了与标准库模块类似的基础,但具有其他功能: 通信用于将子流程的输出/错误无死锁地捕获到内存,同时将数据馈送到其标准输入。 捕获...
11.3.3 输入和输出重定向 403 11.3.4 线程 404 11.4 信号 404 11.4.1 发送信号 408 11.4.2 信号集 412 11.5 小结 415 第12章 posix线程 416 12.1 什么是线程 416 12.2 线程的优点和缺点 417 12.3 第一个...
11.3.3 输入和输出重定向 403 11.3.4 线程 404 11.4 信号 404 11.4.1 发送信号 408 11.4.2 信号集 412 11.5 小结 415 第12章 posix线程 416 12.1 什么是线程 416 12.2 线程的优点和缺点 417 12.3 第一个...
第1章 c语言概述 1.1 编程和预备知识 1.2 程序输出 1.3 变量、表达式和赋值 1.4 使用#define和#include 1.5 使用printf()和scanf() 1.6 控制流 1.7 函数 1.8 数组、字符串和指针 1.8.1 数组 1.8.2 字符串 1.8.3 ...
3.4 输入/输出重定向 61 3.5 管道 65 3.6 元字符与文件名生成 67 3.7 转义与引用 69 3.8 命令历史 72 3.8.1 fc命令 72 3.8.2 history命令 74 3.8.3 重复执行先前的命令 75 3.8.4 编辑并执行校正后的命令 76 3.8.5 ...
3.4 输入/输出重定向 61 3.5 管道 65 3.6 元字符与文件名生成 67 3.7 转义与引用 69 3.8 命令历史 72 3.8.1 fc命令 72 3.8.2 history命令 74 3.8.3 重复执行先前的命令 75 3.8.4 编辑并执行校正后的命令 76 3.8.5 ...
第一章:数据结构和算法 1.1 解压序列赋值给多个变量 1.2 解压可迭代对象赋值给多个变量 1.3 保留最后N个元素 1.4 查找最大或最小的N个元素 1.5 实现一个优先级队列 1.6 字典中的键映射多个值 1.7 字典排序 ...
第一部分 Visual C++ 2010开发与新特性 第1章 Visual C++ 2010开发环境简介 1 1.1 Visual C++ 2010简介 1 1.2 Visual C++ 2010下载安装指南 1 1.3 Visual C++ 2010主要特点与新特性 3 1.4 Visual C++ 2010开发环境...
读者在学习这一卷时,应当先具备第1卷所阐述的关于TCP/IP的基本知识。本卷的特点是使用大量的源代码来讲述TCP/IP协议族中的各协议是怎样实现的。这些内容对于编写TCP/IP网络应用程序的程序员和负责维护基于TCP/IP...
第1章 Java概述 1 1.1 Java语言的发展简史 2 1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6...