预计阅读本页时间:-
输入和输出涉及到函数、数据和设备。例如,考虑echo_eof.c程序。该程序使用了输入函数getchar()。输入设备(我们已经假设)是键盘,输入数据流由单独的字符组成。假设您希望保持相同的输入函数和相同类型的数据,但希望改变程序寻找数据的位置。一个很好的问题是,“程序如何了解在哪里寻找其输入?”
默认情况下,使用标准I/O包的C程序将标准输入作为其输入源。这就是前面标识为stdin的流。该流是作为向计算机中读取数据的常规方式而建立的。它可以是一个老式的设备,例如磁带、穿孔卡片、电传打字机,或者(正如我们要继续假设的)您的键盘,或一些未来的技术,例如语音输入。然而,一台现代的计算机是一个灵活的工具,您可以指示它到其他地方寻求输入。特别地,您可以告诉一个程序从文件而不是键盘寻求其输入。
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
令程序与文件一同工作有两种方式。一种方式是明确地使用打开文件、关闭文件、读文件、写文件等等的专门函数。这种方法我们留待第13章讨论。第二种方式是使用一个设计用于与键盘和屏幕共同工作的程序,但是使用不同通道重定向(redirect)输入和输出,例如输入到文件和从文件中输出。换句话说,就是您将stdin流重新分配至文件。getchar()程序继续从该流中取数据,而不真正关心流是从何处获取其数据。这种方法(重定向)比第一种方法在一些方面功能更有限,但它更容易使用,而且使您能够更加熟悉常用的文件处理技术。
重定向的一个主要问题是其与操作系统而不是C相关联。然而,许多C环境,包括Unix、Linux和MS-DOS(2.0及以上版本),都有重定向的特性,而且一些C实现还在缺乏该特性的系统上对其进行模拟。我们来看Unix、Linux和DOS版本的重定向。
Unix、Linux和DOS重定向
Unix、Linux和当前的DOS版本使您能够重定向输入和输出。输入重定向使您的程序能够使用文件代替键盘作为输入,输出重定向则使程序能够使用文件代替屏幕作为输出。
一、输入重定向
假设您已经编译了echo_eof.c程序,并将它的可执行版本放在一个名为echo_eof的文件中(或在DOS系统上为echo_eof.exe)。要运行该程序,请键入该可执行文件的名字:
该程序如前面描述的那样运行,从键盘获取输入。现在假设您希望对一个名为words的文本文件使用该程序。文本文件(text file)是包含文本的文件,即在该文件中数据以人类可读的字符形式存储。例如,它可以是一篇短文或用C编写的程序。包含机器语言指令的文件(例如保存程序可执行版本的文件)就不是文本文件。因为该程序处理的是字符,所以它应该与文本文件一同使用。所有您需要做的就是输入命令时用下列命令代替前面的命令:
<符号是Unix、Linux(和DOS)的重定向运算符。该运算符把words文件与stdin流关联起来,将该文件的内容引导至echo_eof程序。echo_eof程序本身并不知道(或关心)输入是来自文件而不是来自键盘。该程序所知道的一切就是向它传送了一个字符流,所以它将这些字符读出并一次打印一个字符,直到遇到文件结尾。由于C将文件和I/O设备置于相同的地位所以现在这个文件就是I/O设备。请试着运行这个程序。