重定向和文件

一、相关基础知识

重定向:在计算机领域,重定向是大多数命令行解释器所具有的功能,包括各种可以将标准流重定向用户规定地点的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. NPOI组件集锦

    关于NPOI不错的介绍:http://www.cnblogs.com/restran/p/3889479.html http://www.cnblogs.com/Irving/archive/2012 ...

  2. 在Excel里如何将多个工作簿合并到一个工作簿中

    在Excel里如何将多个工作簿合并到一个工作簿中 当你必须将多个工作簿合并到一个工作簿时,你遇到过麻烦吗?最让人心烦的就是需要合并的工作簿里有很多张工作表.有人能推荐方法解决这个问题吗? 利用VBA ...

  3. FPGA的JTAG下载问题

    前两天做一个工频信号源项目,连续出现两块FPGA板JTAG编程failed现象,不知道原因.网上搜索了下,有帖子说如果是JTAG损坏了,用表笔打TCK,TMS,TDI,TDO,看是否存在和GND短接, ...

  4. 在Eclipse上搭建Cocos2d-x的Android开发环境

    很多其它相关内容请查看本人博客:http://www.bokeyi.com/ll/category/cocos2d-x/ 本文的搭建方法是最新最正确的方法,好多朋友反映搭建eclipse交叉编译环境非 ...

  5. JDBC学生管理系统--处理分页显示

    分页的思想: 假设一共有104条数据,每页显示10条数据: select * from student limit 0,10; 页数是index,第index页,对应的sql语句是: select * ...

  6. awk用法举例

    awk文本分割输出工具(按列输出工具) awk [options] ' PATTERN { action } ' file1, file2, ... 内置变量: FS:field separator, ...

  7. apache源码编译安装详解

    查看是否安装 rpm -qa httpd        如果已安装,则卸载:rpm -e 卸载  --nodeps 不考虑意外        下载 wget http://mirrors.sohu.c ...

  8. 26、Jquery 基础

    什么是Jquery? Jquery是一套Javascript脚本库. 使用时需要先下载下来,并引用到项目中. 下载地址:http://jquery.com/download/ 目前jquery分为 1 ...

  9. [Mime] 在c#程序中放音乐的帮助类 (转载)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.M ...

  10. 通过javascript,使用struts2的ognl获取JavaBean的属性.

    1)在Action中,声明一个Lock对象,并生成好setter/getter,在Action调用方法中(这里是findOnMap,需要先调用setLock方法设置好信息) private Lock ...