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

图像去畸变(相机成像、畸变模型) 首先通过上一步相机标定得到畸变参数和相机内参,同时,由于图像去畸变都是在归一化相机坐标系下进行的,而图像都是像素坐标,所以需要先通过相机内参矩阵将图片上的像素点从像素坐标系转变到归一化坐标系,再通过畸变参数在归一化坐标上进行去畸变的操作。由于畸变是发生在世界点通过透镜投影到相机坐标系这个过程中的,所以去畸变操作是在相机坐标系下进行的。(如图,Pd即为畸变后成像点)3.读取图像和各个参数,调用去畸变函数(opencv自带的cv.undistort函数),就可以完成对图像的去畸变处理,进而得到去畸变的图像。 阅读详情

继上一篇《进程通信之一使用WM_COPYDATA C++及C#实现》,进程通信之二将分为三篇文章讲解如何使用管道技术来完成进程通信功能。三篇文章目录如下:

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

2.《进程通信之二 管道技术第二篇 匿名管道》

3.《进程通信之二 管道技术第三篇 命名管道》

 

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

#include <stdio.h>
int main()
{
	int n;
	while (scanf("%d", &n) != EOF) //标准输入时,可按ctrl+z来输入EOF
	{
		n *= 2;
		printf("%d\n", n);
	}
}

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

实现方法一使用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")。

 

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

//直接使用freopen()函数 来改变控制台的标准输入输出
#include <stdio.h>
int main()
{
	//将控制台的标准输入输出改成从文件中读取写入
	FILE *pFileRead = freopen("infile.txt", "r", stdin);
	FILE *pFileWrite = freopen("outfile.txt", "w", stdout);

	int n;
	while (scanf("%d", &n) != EOF)
	{
		n *= 2;
		printf("%d\n", n);
	}

	fclose(pFileRead);
	fclose(pFileWrite);

	//回到到控制台的标准输入输出 windows为"CON" linux为"/dev/console"
	freopen("CON", "r", stdin);
	freopen("CON", "w", stdout); 
	printf("Finish 输入0表示结束:\n");
	do{
		scanf("%d", &n);
	}while (n != 0);
	
	return 0;
}

运行结果如下图所示:

 

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

 

实现方法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++的方法来重定向输入输出:

//使用ifstream和ofstream及cin和cout的rdbuf()
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
	printf("   使用ifstream和ofstream及cin和cout的rdbuf()来改变控制台的标准输入输出\n");  
	printf("  --by MoreWindows( http://blog.youkuaiyun.com/MoreWindows )--\n\n"); 
	//将控制台的标准输入输出改成从文件中读取写入
	ifstream inFile("infile.txt");
	ofstream outFile("outfile.txt");
	//保存原来的输入输出方式 streambuf类就是basic_streambuf类
	streambuf *strmin_buf = cin.rdbuf();
	streambuf *strmout_buf = cout.rdbuf();

	printf("开始处理文件\n....\n");
	//重定向到文件
	cin.rdbuf(inFile.rdbuf());
	cout.rdbuf(outFile.rdbuf());

    //原程序代码
	int n;
	while (cin>>n)
	{
		n *= 2;
		cout<<n<<endl;
	}

	inFile.close();
	outFile.close();

	//回到控制台的标准输入输出
	cin.rdbuf(strmin_buf);
	cout.rdbuf(strmout_buf);

	cout<<"文件已经处理完毕 输入0表示结束:"<<endl;
	do{
		cin>>n;
	}while (n != 0);

	return 0;
}

运行结果如下图所示:

 

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

 

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

 

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

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

 

shader基于高度的权重混合 效果图: 基于高度的权重混合 , 效果描述: (1)混合:三层混合, 例如 第一层是草,第二层是石头,第三层是沙子,三者混合显示 (2)权重: 三层的权重的和 为1, 三者是此消彼长的关系 (3)高度:高度会限制或者说是 束缚 着 效果 关于混合,再多说几句: (1)基于权重的混合:权重 ,跟顺序没有关系 只跟权重的大小有关系(在一层一层界限不清晰的地方,特别适用!!效果极好!!!!) (2)基于叠加的混合: 叠加 就是 一层一层的往上加。。。。 所以顺序特别重要(在雪地等效果中使用:因为 阅读详情

相关推荐

告别龟速计算!用Python的fengwo模块5分钟搞定通达信COST/WINNER函数(附完整代码)

本文介绍如何使用Python的fengwo模块高效复现通达信的COST和WINNER函数,解决量化交易中的计算精度和性能问题。通过C++核心算法和多线程优化,计算速度提升显著,误差低于0.5%,并支持与通达信DLL无缝集成,适用于实盘交易策略开发。

weixin_42533751的博客 600

C/C++输出的重定向:让你刷OJ更轻松

标准输入输出改为文件输入/输出,如果使用C的文件操作fwrite(), fread()或C++的文件流操作需要修改每一个输入输出语句,非常不方便。此时,采用重定向方法就可以用二三行代码解决问题。

Tiddlik的博客 2166

通达信【雷霆尊者排序】实战指南:高胜率竞价指标解析与优化策略

本文详细解析了通达信【雷霆尊者排序】指标在集合竞价阶段的应用,提供从基础设置到实战解码的完整指南。文章重点剖析了‘雷霆’、‘使者’、‘精选’等核心信号的逻辑与共振策略,并分享了如何结合K线、市场情绪进行综合研判与风险控制,旨在帮助短线交易者提升早盘选股效率与胜率。

pear55的博客 950

C/C++ 标准输入输出重定向

这个对经常在OJ上做题的童鞋们很有用。OJ基本都是用标准输入输出(USACO除外)。但如果你在调试的时候也都是从控制台输入,那就太浪费宝贵的时间了。我们可以重定向标准输入,调试的时候从文件读,提交时从标准输入读。 在C语言中,方法比较简单。使用函数freopen(): freopen("data.in","r",stdin);freopen("data.out","w",stdout); ...

weixin_30487701的博客 828

Upwork数据战争:用爬虫与AI预测垄断订单

当普通自由职业者还在“等客户发需求”时,顶尖玩家已用数据预测客户明天需要什么; 当竞争对手熬夜抢单时,你的爬虫早已自动提交提案—— 这不是科幻,而是2025年的现实! 本文将手把手教你用合法工具搭建“数据战情室”,让每个决策都有万亿级数据支撑!

qq_61813593的博客 982

基于Scrapy+Playwright的学术会议信息智能爬取系统实战

本文详细介绍如何使用Python构建一个高效的学术会议信息爬取系统,结合Scrapy框架和Playwright无头浏览器技术,实现对全球学术会议数据的自动化采集、清洗和存储。文章包含完整的技术方案设计、代码实现细节以及性能优化策略,可帮助读者快速掌握现代网络爬虫开发的核心技术。关键词:Python爬虫、Scrapy、Playwright、学术会议、数据采集、反爬对抗python复制下载。

2201_76125261的博客 710

c++输出重定向

在使用devCpp的时候,运行一个题目总是需要手动粘贴样例,有些机子可能还不支持直接粘贴(比如学校机房防止作弊禁用粘贴),那就只能点击黑框框去粘贴进去,非常消耗时间。我们可以采用输出重定向来解决粘贴问题,省时省心省力!

m0_72678953的博客 761

爬虫Incapsula reese84加密案例:Etihad航空

声明:该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关。

老衲爱洗头的博客 2429

c/c++ | 重定向输入输出流 | freopen

#freopen 函数

ttxiaoxiaobai的博客 665

MT4/MT5 第三代移动平均线(MetaTrader 指标)

第三代移动平均线(3G-MA)是传统MA指标的升级版本,通过"时滞压缩"算法将信号滞后降至理论极限(λ=2)。该指标在保留平滑性的同时,信号速度比EMA快1.5-2.3倍,适用于MT4/MT5平台。核心参数包括计算周期(默认34)、滞后压缩系数(2-10)和应用价位选择,支持斜率变色功能。安装简单,无需外部依赖,通过多周期共振可提升12-18%胜率。指标代码包含完整的MT4/MT5实现方案,采用双缓冲计算结构,通过相位前移算法抵消群延迟。风险提示:需配合其他技术指标和严格风控(≤2%账户

JanLEE 579

cartographer 添加二维码、apritag码作为路标点,测试位置关系

这里记录一下cartographer里面的路标点是如何转换的,首先你要知道路标点在相机坐标系的位置(很多二维码读码器的关系恰好相反,是相机在二维码的坐标系),然后要知道相机坐标系和小车坐标系(一般为base_link)之间的关系。中间用tf_broadcaster_发出来便于查看是否设置正确 void Node::HandleLandmarkMessage( const int trajectory_id, const std::string& sensor_id, const ca

南北粉面馆 2431

进程通信之二 管道技术第二篇 匿名管道

上一篇《进程通信之二 管道技术第一篇 输入输出的重定向》示范了增加若干程序代码来完成程序输入输出的重定向,并提出了如果没有程序源代码,只有程序文件如何来完成重定向。本篇就介绍如何使用匿名管道来完成这一任务。 计算机中管道pipe类似于现实世界中的水管道,在一端放入水流,另一端就会流出来。在计算机机中水流自然被数据流所代替了。计算机中管道分为匿名管道和命名管道,本篇将主要介绍用匿名管道来完成这一重定

MoreWindows Blog 3万+

Sigrity System Explorer ViaWizard模式进行过孔建模和仿真分析操作指导

点击TVac_lower tdvac_lower,自动跳转到2D时域曲线,查看最小低电平穿过VIL(ac)max电压的延时,结果如下。点击TVac_high tdvac_high,自动跳转到2D时域曲线,查看最小高电平穿过VIH(ac)min电压的延时,结果如下。点击max Vix_Rise,自动跳转到2D时域曲线,查看上升边PN交叉点与参考电压VREF(dc)的偏差,结果如下。Threshold:阈值,软件自带3个模板,default,Tr01,Tr02,本例选择Default。

weixin_54787054的博客 571

输入输出重定向的多种方式

继上一篇《进程通信之一使用WM_COPYDATA C++及C#实现》,进程通信之二将分为三篇文章讲解如何使用管道技术来完成进程通信功能。三篇文章目录如下: 1.《进程通信之二 管道技术第一篇 输入输出的重定向》 2.《进程通信之二 管道技术第二篇 匿名管道》 3.《进程通信之二 管道技术第三篇 命名管道》   本篇将介绍输入输出的重定向问题,先来看一个小小的实例,设有一个程序,该程序

zhang1chao5的专栏 1226

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: STL系列之十 全排列(百度迅雷笔试题)
下一篇: 进程通信之二 管道技术第二篇 匿名管道
MoreWindows
MoreWindows 《白话经典算法》、《秒杀多线程》作者 《白话经典算法》、《秒杀多线程》作者 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄15年 2万+粉丝 157原创
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值