`
ajuanlong
  • 浏览: 105092 次
社区版块
存档分类
最新评论

进程通信之二 管道技术第一篇 输入输出的重定向

 
阅读更多

继上一篇《进程通信之一使用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++中就有ifstreamofstream这二个类来帮助我们完成这一任务。这个二类的详细功能就不细说了。下面介绍下如何使用这二个类来重定向程序的输入输出(看的时候看慢点喔,不会会被很多类名给搞晕去^_^)。

这二个类可以以读的方式和写的方法打开一个文件(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++中大家平常使用的cincout,可以在iostream文件中找到cincout的定义,这二个实际是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;

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

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

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

运行结果如下图所示:

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

上面的方法都是建立在修改源代码的基础上,如果只有程序文件即.exe文件那应该怎么做了?请参阅下一篇《进程通信之二 管道技术第二篇 匿名管道

转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/7390350

如果觉得本文对您有帮助,请点击支持一下,您的支持是我写作最大的动力,谢谢。

分享到:
评论

相关推荐

    边干边学Linux__第二版_doc格式

    第一部分 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 文件系统...

    Linux程序设计中文第4版.part3

    第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. ...

    Linux程序设计中文第4版.part2

    第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. ...

    Linux程序设计中文第4版.part1

    第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 文本...

    Windows编程循序渐进.part2

    第一篇 软件设计基础篇 第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 ...

    Windows编程循序渐进.part3

    第一篇 软件设计基础篇 第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 ...

    rust-subprocess:执行外部流程和管道并与之交互

    特征这个库是关于通过标准输入,输出和错误的可选重定向启动外部进程的。 它涵盖了与标准库模块类似的基础,但具有其他功能: 通信用于将子流程的输出/错误无死锁地捕获到内存,同时将数据馈送到其标准输入。 捕获...

    Linux程序设计 第4版.haozip01

    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 第一个...

    Linux程序设计 第4版.haozip02

    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 第一个...

    C语言解析教程(原书第4版)(美) 凯利.pdf

    第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 ...

    Ubuntu权威指南(1/2)

    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 ...

    Ubuntu权威指南(2/2)

    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 ...

    python cookbook(第3版)

    第一章:数据结构和算法 1.1 解压序列赋值给多个变量 1.2 解压可迭代对象赋值给多个变量 1.3 保留最后N个元素 1.4 查找最大或最小的N个元素 1.5 实现一个优先级队列 1.6 字典中的键映射多个值 1.7 字典排序 ...

    Visual C++2010开发权威指南(共三部分).part1.rar

    第一部分 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开发环境...

    TCPIP协议详解卷2:实现

    读者在学习这一卷时,应当先具备第1卷所阐述的关于TCP/IP的基本知识。本卷的特点是使用大量的源代码来讲述TCP/IP协议族中的各协议是怎样实现的。这些内容对于编写TCP/IP网络应用程序的程序员和负责维护基于TCP/IP...

    疯狂JAVA讲义

    第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...

Global site tag (gtag.js) - Google Analytics