8.3 结束键盘输入
在编写C程序时,处理输入的终止条件是一个重要的概念,尤其是在处理来自键盘的输入时。本节将讨论如何正确标记输入的结束,并介绍C语言中的文件、流与键盘输入的关系。
8.3.1 文件、流和键盘输入
在C语言中,文件是存储信息的基本单元,通常保存在永久性存储器中,如硬盘或U盘中。C语言提供了强大的库函数来处理文件的打开、读取、写入和关闭操作,这些函数构成了C语言的标准输入输出包(Standard I/O package)。在较高层次上,C通过流的概念将文件和程序的输入输出操作联系起来。
什么是流?
流(stream)是一个数据的传输通道,可以是文件、设备或者其他输入输出媒介。流使得程序能够以统一的方式处理不同来源的输入输出。例如,标准输入流通常指键盘输入,而标准输出流通常指屏幕输出。程序通过将文件或设备与流关联,可以以一致的方式进行读写操作。
使用EOF标记结束输入
在处理文件时,C语言提供了一个特殊的标记——EOF
(End of File)——用于指示文件的结束。当程序读取到文件的末尾时,getchar()
或scanf()
函数将返回EOF
,通常定义为-1
。这个值表示文件已读完,不会有更多数据可供读取。
8.3.2 文件结尾标记
操作系统通过不同的方法来检测文件的结束。例如,一些旧系统在文件末尾使用特殊的控制字符(如Ctrl+Z
)来标记文件结束,而现代操作系统通常通过文件大小信息来确定文件的结束。
示例程序:使用EOF标记结束输入
为了更好地理解EOF的使用方式,可以参考以下程序:
/* echo_eof.c -- 重复输入,直到文件结尾 */
#include <stdio.h>
int main(void) {
int ch;
while ((ch = getchar()) != EOF) {
putchar(ch);
}
return 0;
}
在这段代码中,getchar()
函数读取输入字符,并将其与EOF
进行比较。如果未到达文件末尾,则继续输出字符;否则,程序结束。该程序不仅可以用于文件输入,还可以通过键盘模拟文件结尾条件。
如何模拟EOF
在大多数UNIX和Linux系统中,你可以通过在行首按下Ctrl+D
来模拟文件结束信号。在Windows系统中,通常使用Ctrl+Z
来达到同样的效果。这些控制字符不会实际输入到程序中,而是用于标记输入的结束。
终端模拟示例
以下是在UNIX系统下运行echo_eof.c
程序的一个示例:
She walks in beauty, like the night
She walks in beauty, like the night
Of cloudless climes and starry skies...
Of cloudless climes and starry skies...
[Ctrl+D]
在每次按下回车键后,系统处理缓冲区中的字符,并在下一行打印出输入的内容。当按下Ctrl+D
时,程序检测到文件结束,终止输入。
小结
理解EOF标记的作用及其在程序中的应用是编写健壮、稳定程序的关键之一。通过合理地使用EOF,你可以确保程序能够正确处理输入的结束条件,无论是从文件读取还是通过键盘输入。随着对文件、流和键盘输入的深入理解,你将能够编写出更为复杂和高效的C语言程序。