重定向:在计算机领域,重定向是大多数命令行解释器所具备的功能,包括各类能够将标准流重定向用户规定地点的Unix shells。shell
输入重定向:可使程序可以使用文件代替键盘做为输入(则可编辑测试用例文本进行输入)函数
输出重定向:可使程序可以使用文件代替屏幕做为输出(则可将结果输出到文件)测试
文件结尾:操做系统须要某种方式来判断每一个文件起始和结束的位置,通常有两种方法:一种是检测文件结尾的的一个特殊字符来进行标识,另外一种是让操做系统存储文件大小的信息来进行判断spa
对于这两种不一样的方法,C的处理方式是让getchar()函数在到达文件结尾时返回一个特殊值,而无论操做系统采用哪一种方法,赋予该值得名称是EOF(end of file),其值通常是-1,在stdio.h文件中定义。操作系统
咱们则可使用下列程序进行判断是否读入到文件结尾:
命令行
while((ch=getchar())!=EOF) // 当ch为EOF时中止get
固然有时在命令行中咱们也需人为制造结尾,也即须要结束程序时,键入:io
CTRL+D(Unix)或 编译
CTRL+Z(DOS)基础
全部字符包括回车、空格等等一切键盘输入!
1、输入重定向
在WINDOWS下存在一个须要输入的已经编译好的程序1.exe 以及编写好的一个符合输入的 2.txt 文本
则可在DOS下直接使用:(需这2个文件在同一目录,且DOS已经切换到该目录)
1.exe < 2.txt
程序的输出结果则会在DOS下打印出来,这样则能够编写2.txt做为测试用例,节约操做
< 符号是Unix、Linux(和DOS)的重定向运算符,该运算符把1.txt文件与stdin流关联起来,将该文件的内容引导至1.exe程序,程序自己并不知道也不关心输入时来自于文件仍是键盘,它只知道的一切就是向它传送了一个字符流,而后进行相应处理,直到遇到文件结尾。
2、输出重定向
在WINDOWS下存在一个须要输入的已经编译好的程序4.exe ,以及想把程序输出结果输入到5.txt文本中
则可在DOS下直接使用:
4.exe > 5.txt
程序的输出结果不会在DOS下打印,而会直接存入5.txt 中
>符号将输出重定向到该文件,该重定向将stdout从显示设备重定向到5.txt文本文件,
注:1、若5.txt在当前目录下不存在,则会自动新建一个5.txt
2、若5.txt在当前目录下已存在,则会删除原文件,并创建一个新的文件进行代替!
3、若要将新内容添加在文件末尾,请使用>>操做符,也即:4.exe>>5.txt
3、组合重定向
可使用如:
1.exe < 2.txt > 3.txt
1.exe > 3.txt < 2.txt
同时替换输入和输出,执行1.exe,从文件2.txt读取内容,而后将输出写入到3.txt中,上述2种时同样的!
4、渠道(管道)
多个程序能够一块儿运行,一个程序能够直接将另一个程序的输出做为其输入,而且不须要借助中间文件:
command1 | command2
执行command1,将其输出做为command2的输入。这种方式被称为渠道,由于"|"字符被称为"渠道"。这种方式的结果和使用2个重定向及一个临时文件的方式相等价:
command1 > tempfile
command2 < tempfile
rm tempfile
可是使用渠道的时候两个命令是同时执行的,较为省时。
注:1、不可对同一命令的输入和输出使用相同的文件名
2、输入不能来自于一个以上的文件,输入也不能定向至一个以上的文件
3、在运算符<、>、>> 两侧的空格都是可选的,可能有些系统规定重定向符号和文件名之间不容许有空格
也即便用重定向能够以文本与输入流联系的方式模拟咱们的键盘输入,包括输入回车,空格等等一切,可节约时间,编好一次测试用例便可
以及能够将输出打印到文本文件中
程序使用的都是行缓冲区,只有遇到一个换行字符才回将缓冲区中的内容送出去,也即咱们可在输入一个换行符前随意删减,直到输入一个回车才清空缓冲区,将输入送出至程序
另如在DOS下运行exe程序,可以使用CTRL+D(Unix)或 CTRL+Z(DOS)模拟文件结尾结束程序
#include<stdio.h>
int main(void)
{
int ch;
while((ch=getchar())!=EOF)
putchar(ch);
return 0;
}
输入:a 回车
输出:a 回车
输入:b 回车
输出:b 回车
输入:abc 回车
输出:abc 回车
输入:回车
输出:回车
输入:^Z 回车
输出:^Z 回车
输入:a空格b制表符c 回车
输出:a空格b制表符c 回车
输入:CTRL+Z 显示出 ^Z 再按回车程序结束
可见只有输入回车才显示,也即只有遇到一个换行字符才回将缓冲区中的内容送至程序,以及getchar()函数能够读入回车
以输入CTRL+Z(DOS) 人为制造文件结尾,且程序以 ^Z 判断为结尾,且不可人为直接输入 ^Z 为结尾
回车也是一个字符,当输入a 回车时,对应的输出也是 a 回车!
#include<stdio.h>
int main(void)
{
int ch;
int i;
i=1;
while((ch=getchar())!=EOF)
{
printf("执行%d次\n",i);
i=i+1;
}
return 0;
}
输入:abc回车
输出:执行4次
输入:abc空格de制表符fg%回车
输出:执行11次