mysql 命令行重定向_命令行环境下简单实用的工具——重定向&管道

如果你对管道和重定向应用自如了,无需继续往下看。本文虽然以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

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

int main()

{

int a,b;

while( scanf("%d%d", &a, &b) == 2 )

{

printf( "%d\n", a+b );

}

return 0;

}

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

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

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

841e81fe2dd40448c964f955eceb1a2d.png

25c8ff6245c672d1d5191e095679fea4.png

win xp上稍显麻烦,

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

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

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

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

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

ae241ab0452649d19913531b38054401.png

a19d3e690515df15d4d3cdec1be76591.png

a39fc5d41d3ca91d4aa37e14f1762828.png

编译aplusb.c

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

gcc aplusb.c

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

测试a.exe

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

a.exe < input.txt

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

这里的

如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后:

ee47cc1eed20f9b71a692c8a31227dac.png

升级

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

552faa4e8b88b993d7f2562606c3ed5b.png

结果正确!

随机数生成器

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

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

保存为rand_gen.c

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

编译:

gcc rand_gen.c -o randgen.exe

运行:

99fe20f75a527246335a44a3c86dc11a.png

这时你可使用重定向输出符(它右边的文件将替换标准输出(cmd窗口输出)):

randgen.exe > rand_data.txt

再用重定向输入进行测试:

solve.exe < rand_data.txt

管道

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

echo 10 | randgen.exe

828e11ce99c9ec6f859418554734a5f8.png

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

“|”是管道符号,它将会把左边的程序(或命令)的输出重定向到右边程序(或命令)的输入.

这里的效果和前面手工输入10是一样的。

管道可以连接使用;所以,我们可以这样:

echo 10 | randgen | solve

(.exe可以不用输入)

过程是这样的:

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

de8b46ac3600a0661238f994dc82a222.png

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

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

i.无符号整数应该用unsigned int;

ii.sum溢出,应该用double;

更正:

保存为final_solve.c

再次编译测试:

99d4894dca416694e49274e7e38f4494.png

附录

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值