C语言知识点二十二: 结束键盘输入

结束键盘输入

#include<stdio.h>

int main(void)
{
    char ch;
    while((ch = getchar()) != '#')
        putchar(ch);

    return 0;
}

  以上的程序只要输入的字符中不含#, 那么程序在读到#时才会结束。但是,#号也是一个普通的字符,有时不可避免要用到。应该用一个在文本中用不到的字符来标记输入完成, 这样的字符不会无意间出现在输入中, 在你不希望结束程序的时候终止程序。C的确提供了这样的字符, 不过在此之前,先来了解一下C处理文件的方式。

一.文件:

定义: 文件(file)是存储器中储存信息的区域。

1.通常,文件都保存在某种永久存储器中(如,硬盘,U盘或DVD等)。

2.C是一门强大,灵活的语言,有很多用于打开, 读取, 写入和关闭文件的库函数。

(1) 从较低层面上, C可以试用主机操作系统的基本文件工具直接处理文件, 这些直接调用操作系统的函数被称为底层I/O。由于操作系统各不相同,所以不可能为普通的底层I/O函数创建标准库。

(2) 从较高层面上, C可以通过标准I/O包来处理文件。这涉及创建用于处理文件的标准模型和一套标准I/O函数。在这一层面上, 具体的C实现负责处理不同系统的差异, 以便用户使用统一的界面。

上述的(2)中差异指的是什么?

不同的系统储存文件的方式不同。有些系统把文件的内容储存在一处,而文件相关的信息储存在另一处;有些系统在文件中创建一份文件描述。

 在处理文件方面,有些系统使用单个换行符标记末尾, 而其他系统可能使用回车符和换行符的组合来表示行末尾。

有些系统用最小字节来衡量文件的大小, 有些系统则以字节块的大小来衡量。

(如果使用标准的I/O包,就不用考虑这些差异。因此,可以用if(ch == '\n')检查换行符。即使系统实际用的是回车符和换行符的组合来标记行末尾, I/O函数会在两种表示法之间相互转换)

二.  流:

从概念上看,C程序处理的是流而不是直接处理文件。

流是一个实际输入或输出映射的理想化数据流。这意味着不同属性和不同种类的输入, 由属性更统一的流来表示。于是,打开文件的过程就是把流与文件相关联,而且读写都通过流来完成。

三. 键盘输入:

C把输入和输出设备视为存储设备上的普通文件, 尤其是把键盘和显示设备视为每个C程序自动打开的文件。

stdin流表示键盘输入, stdout流表示屏幕输出。

getchar(), putchar(), printf()和scanf()函数都是标准I/O包的成员,处理这两个流。

以上讨论的内容说明: 可以用处理文件的方式来处理键盘输入。例如,程序读文件时要能检测文件的末尾才知道应在何处停止。因此, C的输入函数内置了文件结尾检测器。既然可以把键盘输入视为文件,那么也应该能使用文件结尾检查器结束键盘输入。

四. 文件结尾:

1. 计算机操作系统要以某种方式判断文件的开始和结束。

第一种方法: 在文件的末尾放一个特殊的字符标记文件末尾。 CP/M, IBM-DOS和MS-DOS的文本文件曾经用过这种方法。如今, 这些操作系统可以使用内嵌的Ctrl+Z字符来标记文件的结尾。这曾经是操作系统使用的唯一标记。

第二种方法: 储存文件的大小信息。如果文件有3000字节, 程序在读到有3000字节时便达到文件的末尾。MS-DOS及其相关系统是用这种方法处理二进制文件, 因为用这种方法可以在文件中储存所有的字符, 包括Ctrl+Z。新版的DOS也是用这种方法处理文本文件。UNIX使用这种方法处理所有的文件。

2. 无论操作系统实际使用何种方法检测文件结尾, 在C语言中, 用getchar()读取文件检测道文件结尾时将返回一个特殊的值, 即EOF(end of file的缩写)。scanf()函数检测到文件结尾时也返回EOF。通常, EOF定义在stdio.h文件中:

#define EOF (-1)

  为什么是-1?

因为getchar()函数的返回值通常介于0~255, 这些值对应标准字符集和扩展字符集。

注意:

(1) 某些系统也许把EOF定义为-1以外的值, 但是定义的值一定与输入字符所产生的返回值不同。如果包含stdio.h文件, 并使用EOF符号, 就不必担心EOF值不同的问题。这里关键要理解EOF是一个值, 标记着检测到文件结尾, 并不是在文件中找得到的符号。

(2)

 #include<stdio.h>

int main(void)

{

    char ch;

    while((ch = getchar()) != EOF)

        putchar(ch);

    return 0;

}

当要结束进行键盘输入, 要设法输入EOF字符。不能只输入字符EOF, 也不能输入-1.

正确的方法是, 必须找出当前系统的要求。

例如:

在大多数UNIX和Linux系统中, 在一行开始处按下Ctrl+D会传输文件结尾信号。

  许多微型计算机系统都把一行开始处的Ctrl+Z识别为文件结尾信号, 一些系统把任意位置的Ctrl+Z解释成文件结尾信号。

输入和输出示例:

Hello world!
Hello world!
^Z
程序退出

 

 

猜你喜欢

转载自blog.csdn.net/weixin_41588502/article/details/81069150