重定向和文件

一、相关基础知识

重定向:在计算机领域,重定向是大多数命令行解释器所具有的功能,包括各种可以将标准流重定向用户规定地点的Unix shells。

输入重定向:可以使程序能够使用文件代替键盘作为输入(则可编辑测试用例文本进行输入)

输出重定向:可以使程序能够使用文件代替屏幕作为输出(则可将结果输出到文件)

文件结尾:操作系统需要某种方式来判断每个文件起始和结束的位置,一般有两种方法:一种是检测文件结尾的的一个特殊字符来进行标识,另一种是让操作系统存储文件大小的信息来进行判断

对于这两种不同的方法,C的处理方式是让getchar()函数在到达文件结尾时返回一个特殊值,而不管操作系统采用哪种方法,赋予该值得名称是EOF(end of file),其值一般是-1,在stdio.h文件中定义。

我们则可以使用下列程序进行判断是否读入到文件结尾:

while((ch=getchar())!=EOF) // 当ch为EOF时停止

当然有时在命令行中我们也需人为制造结尾,也即需要结束程序时,键入:

CTRL+D(Unix)或

CTRL+Z(DOS)

二、具体内容

所有字符包括回车、空格等等一切键盘输入!

重定向标准输入输出:

一、输入重定向

在WINDOWS下存在一个需要输入的已经编译好的程序1.exe  以及编写好的一个符合输入的 2.txt 文本

则可在DOS下直接使用:(需这2个文件在同一目录,且DOS已经切换到该目录)

1.exe < 2.txt

程序的输出结果则会在DOS下打印出来,这样则可以编写2.txt作为测试用例,节约操作

< 符号是Unix、Linux(和DOS)的重定向运算符,该运算符把1.txt文件与stdin流关联起来,将该文件的内容引导至1.exe程序,程序本身并不知道也不关心输入时来自于文件还是键盘,它只知道的一切就是向它传送了一个字符流,然后进行相应处理,直到遇到文件结尾。

二、输出重定向

在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

三、组合重定向

可以使用如:

1.exe < 2.txt > 3.txt

1.exe > 3.txt < 2.txt

同时替换输入和输出,执行1.exe,从文件2.txt读取内容,然后将输出写入到3.txt中,上述2种时一样的!

四、渠道(管道)

多个程序可以一起运行,一个程序可以直接将另外一个程序的输出作为其输入,并且不需要借助中间文件:

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次

【C语言】重定向和文件的更多相关文章

  1. Python第十天 print >> f,和fd.write()的区别 stdout的buffer 标准输入 标准输出 从控制台重定向到文件 标准错误 重定向 输出流和输入流 捕获sys.exit()调用 optparse argparse

    Python第十天   print >> f,和fd.write()的区别    stdout的buffer  标准输入 标准输出  从控制台重定向到文件  标准错误   重定向 输出流和 ...

  2. shell 重定向以及文件描述符

    1.对重定向的理解 Linux Shell 重定向分为两种,一种输入重定向,一种是输出重定向:从字面上理解,输入输出重定向就是「改变输入与输出的方向」的意思. 输入方向就是数据从哪里流向程序.标准输入 ...

  3. c语言中的文件流

    一.打开和关闭文件 #include int main( void ) { FILE* pReadFile = fopen( "E:\\mytest.txt", "r&q ...

  4. Linux下执行的java命令重定向到文件中的方法

    在Linux下通常会执行如:java -version 的命令, 但是,命令只是打印到了屏幕上不能重定向到文件中或标准输出流中. 此时需要将错误输出流重定向到标准输出流中就可以得到了. 比如:java ...

  5. C语言样式的文件操作函数

    使用C语言样式的文件操作函数,需要包含stdio.h头文件. 1.打开文件的函数: //oflag的取值为“w”或“r”,分别表示以写或读的方式打开 FILE* fd = fopen(filename ...

  6. c语言的头文件-不是c++类的头文件?

    下面的概述是参考的这篇文章:http://blog.csdn.net/bingxx11/article/details/7771437 c语言编程中也有,也需要头文件, 头文件不只是C++的类才需要! ...

  7. C语言库函数--操作文件

    //C库函数读取文件的代码 I/O缓冲机制 C语言库函数写文件都是写在内存中,然后一次写入磁盘.提高了效率. 读写文件,不对系统进行操作,一般采用C语言库函数.移植可以在任何可以对C支持的操作系统,而 ...

  8. Unix/Linux环境C编程入门教程(41) C语言库函数的文件操作详解

     上一篇博客我们讲解了如何使用Linux提供的文件操作函数,本文主要讲解使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #in ...

  9. C语言处理CSV文件的方法(一)

    什么是CSV文件 CSV是 Comma-separated values (逗号分隔值)的首字母缩写,它通常是以逗号且不仅限于逗号分隔各个值,我们都叫他CSV. 看下面的例子: China, Shan ...

随机推荐

  1. MSSQLSERVER数据库- 打开表出现目录名无效

    打开SQLSERVER数据库,出现目录名无效,如下图: 解决方法到 临时目录:C:\Documents and Settings\Administrator\Local Settings\Temp 手 ...

  2. KVM虚拟化技术

    KVM虚拟化技术 Qemu-kvm kvm virt-manager VNC Qemu-kvm创建和管理虚拟机 一.KVM简介 KVM(名称来自英语:Kernel-basedVirtual Machi ...

  3. iOS OC开发代码规范

    1.变量.类名.函数名 使用驼峰命名法 2.尽量使用完整的单词命名,尽量不采用 缩写单词 3.类名使用大写字母打头,前缀统一加上HH 例如:HHHomePageController 4.类的成员变量使 ...

  4. C#调用java接口报“Fault occurred while processing”异常问题

    服务在通常项目中总是要用到的C#的webservice.wcf,还有第三方的,比如java服务.一般来说调用都不会有什么问题,因为服务的标准都是一样的.要注意的就是:1.参数个数匹配:2.参数类型和返 ...

  5. Java中List和ArrayList的区别(转)

    List是一个接口,而ListArray是一个类.  ListArray继承并实现了List.  所以List不能被构造,但可以向上面那样为List创建一个引用,而ListArray就可以被构造.  ...

  6. DTrace to Troubleshoot Java Native Memory Problems

    How to Use DTrace to Troubleshoot Java Native Memory Problems on Oracle Solaris 11 Hands-On Labs of ...

  7. TableView的优化

    一:什么是TableView的优化以及为什么要优化 1)CPU(中央处理器)和GPU(图形处理器):CPU主要从事逻辑计算的一些工作:GPU主要从事图形处理方面的工作. 2)CPU和GPU的共同点: ...

  8. ubuntu 12.04 编译安装 nginx

    下载源码包 nginx 地址:http://nginx.org/en/download.html 编译前先安装两个包: 直接编译安装会碰到缺少pcre等问题,这时候只要到再安装两个包就ok sudo ...

  9. SetUID、SetGID中的大小写Ss和Sticky bit中的大小写Tt

    大写:原文件/目录没有执行(x)权限 小写:原文件/目录有执行(x)权限 例如: 原文件:-rwxr-xr-x 增加SetUID后 4755 变为:-rwsr-xr-x 再如: 原文件:-rwxr-- ...

  10. apache、mod_jk负载均衡与tomcat集群

    最近需要搭建apache和tomcat的集群,实现静态网站直接通过apache访问,动态网站转交给tomcat处理,实现负载均衡和tomcat集群配置. apache安装 wget http://ap ...