这一章比较的难懂因为没有什么实例
单字符I/O:getchar()和 putchar ()
getchar () 和putchar()每次输入和输出一个字符。读取从键盘输入的字符并将其发送至屏幕。这个过程叫输入回显。
//8-1.c
#include <stdio.h>
int main (void)
{
char ch;
while ((ch = getchar (ch)) != '#')
putchar (ch);
return 0 ;
}
ANSI C将stdio.h头文件与使用getchar()和putchar()相关联,这就是我们在程序中将该文件包含在内的原因。
缓冲区:
在一些系统运行上面的程序时你输入的文本立即回显而有一些系统则在按回车前什么都不会发生。输入字符立即回显是非缓冲或直接输入的一个实例,它表示你所键入的字符对正在等待的程序立即变为有用。相反延迟回显是缓冲的实例,这种情况下你键入的字符被收集并存储在一个被称为缓冲区的临时存储区域中。按下回车可使您所键入的字符块对程序变为可用
为什么需要缓冲区?首先,将若干个字符作为一个字符块比逐个发送这些字符耗费的时间少。其次,可以修改错误的字符。
缓冲区分为:完全缓冲和行缓冲。对完全缓冲输入来说,缓冲区满时被清空(内容被发送到其目的地)。这种缓冲通常出现在文件输入中。它的大小取决于系统,但512字节和4096字节是常见的值。对行缓冲来说,遇到一个换行时将被清空缓冲区。键盘输入是标准的行缓冲,因此按下回车键将清空缓冲区。
终止键盘输入:
文件,流和键盘输入:
文件是一块存储信息的存储器区域:通常文件 被保存在某种类别的永久存储器上C语言具有许多用于打开,读,写和关闭文件的函数,在一个级别上它可以使用宋宿主操作系统的基本文件工具来处理文件 ,这被称为低级I/O因为系统之间存在许多的差异,所以C还有第二种级别处理文件,称之为标准I/O包,这包括创建用于处理文件的I/O函数的标准模型和标准集,在这一高级别上系统之间的差异由特定的C实现处理,所以你与之打交道的是一个统一接口。
流:是一个理想化的数据流,实际输入或输出映射到这个数据流,这意味着具有不同属性的多种类型的输入由流表示,会具有更多统一的属性。于是打开文件的过程就成为将流与文件相关联,并通过流进行读写的过程(C语言的I/O系统为用户提供了一个接口,该接口与实际的存取设备无关。只是设备的一个抽象表示形式。这个抽象的接口称为流,实际的设备称为文件。
C文件系统可以与各种设备一起使用,如打印机、硬盘、终端等,缓冲文件系统可以将每个设备转换成逻辑设备,即所谓的流。所有的流工作方式类似,所以很容易操作不同的设备。流有2种类型:文本流和二进制流。
文本流是一系列字符,可以由多行构成,每行由一个换行符终止。
二进制流是一系列字节,并与外部设备上的字节一一对应)
键盘输入被称为stdin的流表示,而到屏幕上的输出由一个被称为stdout的流表示,所以可以使用与处理文件相同的技术来处理键盘输入。
文件结尾:
检测文件结尾的一种方法是在文件中放置一个特殊字符来标志结尾,这个是曾经使用过的一种方法,现在可以使用一个内嵌的ctrl+Z字符来标志文件的结尾。还有一种方法是根据文件的大小来断定文件的结束位置。所以现在的文本文件可能具有也可能没有内嵌的Ctrl+Z.,但如果该文件有,则操作系统会将该字符作为文件尾标志对待。
第二种方法是让操作系统存储文件大小的信息,如果一个文件具有3000字节,而且程序已经读取3000字节则该程序就到达了文件尾。
对于这两种不同方法,C的处理方法是让getchar()函数在到达文件结尾时返回一个特殊值,而不去管操作系统是如何检测文件结尾的,赋予该值的名称是EOF(文件尾),因此,检测到文件尾时getchar()的返回值是EOF。scanf()函数在检测到文件结尾时也返回EOF。通常EOF在stdio.h文件中的定义如下:#define EOF (-1)
为什么是-1?一般情况下,getchar()返回一个范围在0-127之间的值,因为这些值与标准字符集相对应的值,但是如果系统识别则可能返回0-255的值。在每种情况中,值-1都不对应任何字符,所以可用它来表示文件结尾。
一些系统可能将EOF定义为-1以个的值,但该定义总是与合法输入字符所产生的返回值不同。如果包含了stdio.h文件并使用EOF符号则你不必考虑这个数值定义。重要的是EOF代表的值表示检测到文件结尾,这个值并不是实际出现在文件中的一个符号。
如何使用EOF。将getchar()的返回值 与EOF进行比较。如果不相同,则您的程序还没有到达文件的结尾。如:while ((ch = getchar()) != EOF);
//8-2.c
#include <stdio.h>
int main(void)
{
int ch;
while ((ch = getchar ()) != EOF)
putchar (ch);
return 0 ;
}
注意:
不必定义EOF,因为stdio.h负责定义它
不必担心EOF的实际值。因为stdio.h中的#define语句使你能够使用EOF进行符号表示
变量ch从char类型改变为int类型。这是因为char变量可以由范围在0-255中的无符整数来表不而EOF可能具有数值-1.该值对无符号char变量是不可能的值。但对int则是可能的。而getchar()本身的类型实际就是int类型所以它可以读取EOF字符
Ch是整数的事实不会对putchar有任何影响
要对键盘输入使用此程序,你需要一种键入EOF字符的方式。不是简单的输入E和O和F也不是只输入-1(他也是两个简单的字符).它可能是Ctrl+Z或Ctrl+D解释为文件的结尾。