如果你对管道和重定向应用自如了,无需继续往下看。本文虽然以windows上cmd命令行环境演示,但同样适用于Unix/Linux等平台。

引言

关于管道和重定向,最初是在刘汝佳的《算法竞赛入门经典》上看到的,也是从那时开始用gcc(MinGW) & notepad++(在此之前,Linux上用的是Eclipse+CDT,windows上是VC)。一般操作系统的命令行环境下都提供了管道和重定向工具,看了刘汝佳的书才知道用txt代替键盘作输入、测试是多么的方便!回想起每次点完GO之后一个数字一个数字的按键盘(而且笔记本键盘的数字键按起来没有独立键盘的数字区按起来那么爽)还不时按错的痛苦经历,决定今日将这一强大的工具与大家分享。

从A+B说起

练过OJ的同学可能对此深有体会(没练过没有关系),你的程序可能要先读10个输入(或者更多),才出结果;而你有很难保证这个程序一次编译就是对的,每次修改后都要重新输入这一堆数(还时不时的输错),实在让人难以忍受!刘的书中说了两种方法:

一.利用C标准库提供的“重定向函数”freopen("input.txt",  "r", stdin);这种方法适合用在IDE上,添加一行代码,再准备一个文本文件,你不用单独打开一个cmd窗口,也能够让input.txt的文本带你的所有键盘输入。缺点就是你要在提交之时将这句代码注释掉(或者删掉);相信不少同学在提交的时候因为忘了注释这句而WA的。(在有的IDE上找源代码文件所在目录也不是很方便。)

下面就以经典的A+B问题为例。如下是A+B问题的一个解法,其中input.txt是事先已经准备好的测试数据,并且和这个代码文件放在同一目录下(VC上是这样,有的IDE可能要和.exe放到同一目录):

#include <stdio.h>

int main()
{
int a,b;
freopen("input.txt", "r", stdin);
    while( scanf("%d%d", &a, &b) == 2 )
    {
        printf( "%d\n", a+b );
    }
return 0;
}

二.命令行环境下的————重定向。后面重点介绍。

使用重定向的代码不需要做任何手脚(假设保存为D:\OJ\aplusb.c):

#include <stdio.h>

int main()
{
int a,b;
while( scanf("%d%d", &a, &b) == 2 )
{
printf( "%d\n", a+b );
}
return 0;
}

下面就以编译、测试位于D:\OJ目录下的aplusb.c的步骤为例:

  1. (要使用重定向你必须)先打开一个cmd窗口,并让cmd窗口的当前目录为D:\OJ。

    win7上只需打开D:\OJ文件夹,按住SHIFT键,在窗口的空白处右击鼠标,点“在此处打开窗口”即可。





    win xp上稍显麻烦,

    step1. WinKey+R弹出运行窗口,键入“cmd”回车,

           弹出的cmd窗口显示当前目录是C:\Document and Setting\xxx(win7则是C:\Users\xxx);

    step2. 再键入“D:”回车,跳转到D盘;

    step3. 再用cd命令跳转到当前exe所在目录(如果目录名较长,可以从资源管理器的路径栏上copy)。

    win7上当然也可以这么做,如下:

  2. 编译aplusb.c

    假设你已经设置好了环境变量(如果你还没有安装配置命令行工具,点击这里):

    gcc aplusb.c 

    将会有a.exe生成(如果想以其他名称输出加上-o选项,如gcc -o OutName.exe aplusb.c);
  3. 测试a.exe

    假设你已经准备好了一份测试数据,并以input.txt保存在相同目录(D:\OJ)下(如果没有,创建一个),则可以:

    a.exe < input.txt

    程序a.exe将会直接运行,并且以input.txt为输入;

    这里的<符号叫重定向输入符(它右边的文件将替换左边程序或命令的标准输入(cmd窗口输入))

    如input.txt内容如下:

    1 2 

    3 4

    5 6

    7 8

    9 10

    100 200

    200 400

    400 800

    20000 30000

    5000000 6000000

    70000000 80000000

    运行gcc和a.exe后:

升级

A+B问题太简单?现在换一个问题:
•统计问题

一组整数,统计最大值、最小值、平均值
•输入

第一行一个32位整数n表示测试数据个数,接下来的n行每行一个非负32位整数
•输出

一行,最小值、最大值、平均值,空格分开
这个问题也比较简单;之所以举这个例子,只是为了突出重定向和管道的重要作用。
相信只要学过一点编程的都能立刻写出来:
(这段程序里有个小错误,稍后现形)
保存为D:\OJ\Perls\sovle2.cpp
这里也有一份测试数据input.txt:

10

20

30

40

50

60

70

80

90
编译:
gcc solve2.cpp -o solve.exe
测试:
solve.exe < input.txt

结果正确!

随机数生成器

你可能对上面的一组测试数据不够满意,太少,太小,太弱?

下面写一个能够生成满足题目输入格式的随机数生成器:

保存为rand_gen.c

该程序读入n,输出n及n个随机数(正如题目输入格式)。

编译:

gcc rand_gen.c -o randgen.exe

运行:

这时你可使用重定向输出符(它右边的文件将替换标准输出(cmd窗口输出)):
randgen.exe > rand_data.txt
再用重定向输入进行测试:

solve.exe < rand_data.txt

管道

在已经有randgen.exe的情况下,使用管道更加方便:

echo 10 | randgen.exe


echo是回显程序,echo 10将会输出10

“|”是管道符号,它将会把左边的程序(或命令)的输出重定向到右边程序(或命令)的输入.
这里的效果和前面手工输入10是一样的。

管道可以连接使用;所以,我们可以这样:
echo 10 | randgen | solve

(.exe可以不用输入)

过程是这样的:

echo 10 ==10==> randgen.exe ==(临时数据)===> solve.exe -> 屏幕输出

这次测试出现了问题,最小值和平均值竟然都是负数!

查看一下代码发现这里有两个问题:

i.无符号整数应该用unsigned int;
ii.sum溢出,应该用double;
更正:

保存为final_solve.c

再次编译测试:



附录

windows官方参考使用命令重定向操作符:

http://technet.microsoft.com/zh-cn/library/cc772622(WS.10).aspx

Unix/Linux平台,参考文章:

http://man.chinaunix.net/linux/mandrake/101/zh_cn/Command-Line.html/shell-pipes.html

命令行环境下简单实用的工具——重定向&管道的更多相关文章

  1. 惊艳的cygwin——Windows下的Linux命令行环境的配置和使用

    http://www.tuicool.com/articles/2MramqI 时间 2014-07-29 09:28:36  点滴之间 聚沙成金 原文  http://www.path8.net/t ...

  2. Ubuntu下几个命令行方式使用的图片浏览工具

    想找几个Ubuntu下可以以命令行方式使用的图片浏览工具. Google了一些资料,找到下面几个web: 1.pho:轻巧的命令行图片查看器 其中介绍了工具pho,其功能特点,见下面的转帖内容: ph ...

  3. 7个基于Linux命令行的文件下载和网站浏览工具

    7个基于Linux命令行的文件下载和网站浏览工具 时间:2015-06-01 09:36来源:linux.cn 编辑:linux.cn 点击: 2282 次 Linux命令行是GNU/Linux中最神 ...

  4. 如何在命令行模式下查看Python帮助文档---dir、help、__doc__

    如何在命令行模式下查看Python帮助文档---dir.help.__doc__ 1.dir函数式可以查看对象的属性,使用方法很简单,举str类型为例,在Python命令窗口输入 dir(str) 即 ...

  5. 在windows命令行窗口下执行:查看所有的端口占用情况

    开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选&qu ...

  6. Linux命令行环境与桌面环境护切换

    1.前言 在大部分情况下,我们在使用Linux时习惯使用命令行环境,但是有时候也还是会使用到安装桌面环境,所以在这里介绍一下如何给没有安装桌面环境的系统安装桌面环境.以Centos 6.5 为例演示一 ...

  7. mplayer命令行模式下的使用方法【转】

    mplayer命令行模式下的使用方法http://hi.baidu.com/lovehack2006/blog/item/162ef9778214111eb051b9d4.htmlMPlayerMPl ...

  8. 在命令行模式下查看Python帮助文档---dir、help、__doc__

    在命令行模式下查看Python帮助文档---dir.help.__doc__   1.dir函数式可以查看对象的属性,使用方法很简单,举str类型为例,在Python命令窗口输入 dir(str) 即 ...

  9. 在命令行cmd 下,输入dxdiag 查看关于电脑许多硬件的详细信息

    输入命令就可以查看本机的很多硬件的详细信息: 在命令行cmd 下,输入dxdiag  查看关于电脑许多硬件的详细信息

随机推荐

  1. #1015 : KMP算法

    kmp算法的定义可以从网上查找.我个人的理解是要从模式串中寻找出和模式串开头字母相同的字母个数,构建一个next数组用于匹配原串失败时判断模式串回溯的位置. 注意点:匹配成功后模式串的迭代因子j应该如 ...

  2. Python基础+Pythonweb+Python扩展+Python选修四大专题 超强麦子学院Python35G视频教程

    [保持在百度网盘中的, 可以在观看,嘿嘿 内容有点多,要想下载, 回复后就可以查看下载地址,资源收集不易,请好好珍惜] 下载地址:http://www.fu83.cc/ 感觉文章好,可以小手一抖 -- ...

  3. JS组件系列——表格组件神器:bootstrap table

    前言:之前一直在忙着各种什么效果,殊不知最基础的Bootstrap Table用法都没有涉及,罪过,罪过.今天补起来吧.上午博主由零开始自己从头到尾使用了一遍Bootstrap Table ,遇到不少 ...

  4. 梦想成真,喜获微软MVP奖项,微软MVP FAQ?

    之前一直很钦佩那些MVP获奖者,想着自己有一天也能拿到该多好,就在10月1日邮箱收到了微软的邮件,当选了2016年10月份的MVP.今天主要分享一下获奖的喜悦也分享一下如何获得MVP奖项. 什么是微软 ...

  5. 转载(sublime text 2 调试python时结果空白)

    sublime text 2 调试python时结果空白 之前用的时候都一切正常,今天突然就出现了这个问题.按ctrl+b执行的时候结果只有空白,查了很多文章都只提到了中文路径.系统路径等等,没有解决 ...

  6. Sqlite创建增删改查

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  7. airline 設定 安裝

    .vimrc " install airline plugin using Vundle Plugin 'vim-airline/vim-airline' " install ai ...

  8. dubbo zk 分布式服务项目搭建与配置

    1. 项目 jar  -----提供接口 2. 项目 jar  -----接口实现   provider启动zk main方法启动 start applicationContext.xml <b ...

  9. Google调用explorer.exe打开本地文件

    给IE浏览器地址栏输个本地文件路径,会自动用explorer.exe打开,这个挺好的,但是IE对jQuery稍微高点的版本不怎么待见,只好自己给Google折腾一个调用explorer的功能----- ...

  10. js-JavaScript高级程序设计学习笔记19

    第22章 高级技巧 1.高级函数 1.安全的类型检测. typeof,instanceof并非完全可靠. 安全的类型检测:使用Object原生的toString()方法. function isArr ...