字符输入/输出和输入确认

来源:互联网 发布:大数据分析方案 编辑:程序博客网 时间:2024/05/12 20:27

单字符I/O:getchar( )和putchar( )

注意:getchar( )和putchar( )不是真正的函数,而是定义为预处理宏


回显:回显,就是显示正在执行的批处理命令及执行的结果等。常常指程序开发中执行命令的结果,就是返回的显示,你输入一个命令,然后给你返回一个值,显示在屏幕上。

输入字符的立即回显非缓冲直接输入的一个实例,它表示您所键入的字符对正在等待的程序立即变为可用。


相反,延迟回显缓冲输入的实例,这种情况下您所键入的字符被收集并存储在一个被称为缓冲区的临时存储区域中。按下回车键可使您所键入的字符块对程序变为可用。


为什么需要缓冲区:

1.将若干个字符作为一个块传输比逐个发送这些字符耗费的时间少。

2.如果输入有误,就可以使用键盘更正功能来修正错误。当最终按下回车键时,就可以发送正确的输入。

3.一些交互性的程序需要非缓冲输入。例如,在游戏中希望以按下键就执行命令。


缓冲分为两类:完全缓冲I/O行缓冲I/O

完全缓冲输入来说,缓冲区满时被清空(内容被发送至其目的地)这种类型的缓冲通常出现在文件输入中。缓冲区的大小取决于系统,但512字节和4096字节是常见的值。

行缓冲I/O来说,遇到一个换行字符时将被清空缓冲区。键盘输入是标准的行缓冲,因此按下回车键将清空缓冲区。


ANSI C指定应该对输入进行缓冲,ANSI C决定将输入作为标准的原因是一些计算机不允许非缓冲输入。


文件是一块存储信息的存储器区域。

C语言具有许多用于打开、读、写和关闭文件的库函数。在一个级别上,它可以使用宿主操作系统的基本文件工具来处理文件。这就被称为低级I/O。由于计算机系统之间存在许多差异,所以不可能创建一个通用的低级I/O函数的标准库,而且ANSI C也不打算这样做。

C还以第二种级别处理文件,称为标准I/O包这包括创建用于处理文件的I/O函数的标准模型和标准集。在这一较高级别上,系统之间的差异由特定的C实现来处理,所以与之打交道的是一个统一的接口。


从概念上说,C 程序处理一个流而不是直接处理文件(stream)是一个理想化的数据流,实际输入或输出映射到这个数据流。这意味着具有不同属性的多种类型的输入由流表示,会具有更多统一的属性。于是打开文件的过程就成为将流与文件相关联,并通过流进行读写的过程。

特别的是,键盘和显示设备作为每个 C 程序自动打开的文件来对待。键盘输入由一个被称为stdin 的流表示,而到屏幕(或电传打字机,或其他输出设备)上的输出由一个被称为stdout 的流表示。getchar( )、putchar( )、printf( )和 scanf( )函数都是标准 I/O 包的成员,这些函数同这两个流打交道。

所有这些的一个结论是可以使用与处理文件相同的技术来处理处理键盘输入。例如,读取文件的程序需要一种方法来检测文件的结尾,以了解停止读取的位置。因此,C 输入函数装备有一个内置的文件尾检测器。因为键盘输入是像文件一样被看待的,所以也应该能使用该文件尾检测器来终止键盘输入。


文件结尾:

计算机操作系统需要某种方式来断定每个文件起始和结束的位置。检测文件结尾的一种方法是在文件中放置一个特殊字符来标志结尾。第二种方法是让操作系统存储文件大小的信息。

对于这两种不同的方法,C的处理方法是让 getchar( )函数在到达文件结尾时返回一个特殊值,而不去管操作系统是如何检测文件结尾的。赋予该值的名称是EOF(End of File ,文件尾)。因此,检测到文件尾时getchar( )的返回值是 EOF。scanf( )函数在检测到文件结尾时也返回EOF。通常EOF在 stdio.h 头文件中定义,如下所示;

  #define EOP (-1)


重定向:
输入和输出函数设计到函数、数据和设备。

程序如何了解在哪里寻找其输入?

默认情况下,使用标准I/O包的C程序将标准输入作为其输入源。这就是前面标识为 stdin 的流。该流是作向计算机中读取数据的常规方式而建立的。然而,一台现代的计算机是一个灵活的工具,你可以指示它到其他地方寻找输入。特别地,你可以告诉一个程序从文件而不是键盘寻求其僌。

令程序与文件一同工作有两种方式。一种方式是明确地使用打开文件,关闭文件,读文件,写文件等等的专门的函数。第二种方式是使用一个设计用于与键盘和屏幕共同工作的程序,但是使用不同通道重定向(redirect)输入和输出,例如输入到文件和从文件中输出。换句话说,就是您将 stdin 流重新分配至文件。getchar( )程序继续从该流中取数据,而不真正关心流是从何处获取其数据。这种方法(重定向)比第一种方法在一些方面功能更有限,但它更容易使用,而且使你能够更加熟悉常用的文件处理技术。


重定向的一个主要问题是其与操作系统而不是 C 相关联。然而,许多 C 环境,包括 Unix ,Linux 和 MS-DOS (2.0及以上版本),都具有重定制的特性,而且一些 C 实现还在缺乏该特性的系统上对其进行模拟。

简单地说,在 Unix Linux 或 DOS 下使用两个重定向运算符 < 和 > 所遵循的规则:

——重定向运算符将一个可执行 (executable)程序(包括标准的操作系统命令)与一个数据文件连接起来。该运算符不能用于一个数据文件与另一个数据文件的连接,也不能用于一个程序与另一个程序的连接。

——使用这些运算符时,输入不能来自一个以上的文件,输出也不能定向至一个以上的文件。

——除了偶尔在使用到一些对 Unix shell,Linux shell 或 DOS 具有特殊意义的字符时,名字和操作符之间的空格并不是必需的。例如,我们可以使用 echo_eof < words。


重定向使你能够把键盘输入程序用于文件。要使其工作,该程序必须能够检测文件尾。

重定向是一个命令行概念,因为要通过在命令行键入特殊符号来指示它。如果你不在使用命令行环境,仍可以尝试这一技术。

如果重定向不能工作,可以尝试让程序直接打开文件。

总结:在大多数 C 系统中,你都可以使用重定向。你可以通过操作系统对所有的程序使用重定向,或者仅仅是在 C 编译器允许的情况下对 C 程序使用重定向。下面,令 prog 为可执行程序的名字,并令 file1 和 file2 为文件名。

将输出重定向到一个文件:  > prog > file1

将输入重定向为来自一个文件: < 

        prog < file2

组合重定向:

        prog < file2 > file1

        prog > file1 < file2

        两种形式都使用 file2 作为输入,使用 file1 作为输出。

空格:

一些系统在重定向运算符左边需要一个空格,而在右边则不需要。其他系统(例如 Unix)既接受两边都有空格也接受两边都没有空格。


C 程序将输入视为一个外来字节的流。getchar( )函数将每个字节解释为一个字符编码。scanf( )函数以同样的方式看待输入,但在其转换说明符的指导下,该函数可以将字符转换为数值。许多操作系统都提供重定向,这就使你能够肜文件代替键盘作为输入,或用文件代替显示器作为输出。

程序通常期望某种特定形式的输入。你可以通过设想用户可能犯的输入错误并令程序处理这些错误来使程序更加健壮和对用户更加友好。

对于一个小程序来说,输入确认可能是代码中最复杂的部分。在处理这个问题时可以有多种选择。例如,如果用户输入了错误的信息类型,则你可以终止程序,也可以给用户有限次的机会进行正确输入,还可以给用户无限次机会进行正确输入。

0 0