声明:本篇文章只是个人知识盲区、知识弱点、重点部分的归纳总结,望各位大佬不喜勿喷。梳理顺序是按照书籍的实际顺序梳理,转载请注明出处。
作者:sumjess
适用:这本书我已经看过4遍了,但是该书的知识点我并不是都常用,所以总会有忘记的,所以来写这本书的随手笔记,记录重点、易忘点。该博客可以当做字典,也可以当做你的笔记。
目前内容:第八章总结
第八章:字符输入输出验证
1、缓冲区:
(1)回显用户输入的字符后立即重复打印该字符是属于无缓冲(或直接)输入,即正在等待的程序可立即使用输入的字符;
(2)大部分系统在用户按下Enter键之前不会重复打印刚输入的字符,这种输入形式是属于缓冲输入;
(3)用户输入字符被收集并储存在一个被称为缓冲区的临时储存区。
(4)缓冲分两种:完全缓冲I/O和行缓冲I/O。
完全缓冲输入指的是当缓冲区被填满时才刷新缓冲区(内容被发送至目的地),通常出现 在文件输入中。
行缓冲I/O指的是在出现换行符时刷新缓冲区(键盘输入通常是行缓冲输入)。
(5)回显无缓冲输入的getchar()函数和用于无回显无缓冲输入的getch()函数(回显输入意味着用户输入的字符直接显示在屏幕上,无回显输入意味着击键后对应的字符不显示)。
2、结束键盘输入:
(1)文件、流和键盘输入:
① 文件是存储器中储存信息的区域。 ② C是一门强大、灵活的语言,有许多用于打开、读取、写入和关闭文件的库函数。从较低层面上,C可以使用主机操作系统的基本文件工具直接处理文件,这些直接调用操作系统的函数被称为底层I/O。从较高层面上,C还可以通过标准I/O包来处理文件。
③ 如果使用标准I/O包,就不用考虑这些差异。即使系统用的是回车符和换行符的组合来标记行末尾,I/O函数会在两种表示法之间相互转换。
④ 流是一个实际输入或输出映射的理想化数据流。
⑤ C把输入和输出设备视为存储设备上的普通文件,尤其是把键盘和显示设备视为每个C程序自动打开的文件。stdin流表示键盘输入,stdout流表示屏幕输出。getchar()、putchar()、printf()、scanf()函数都是标准I/O包的成员,处理这两个流。
以上讨论内容说明可以用处理文件结尾的方式来处理键盘输入。
(2)文件结尾:
检测文件结尾的一种方法是,在文件末尾放一个特殊字符标记文件结尾。
在C语言中,用getchar()读取文件检测到文件结尾时,将返回一个特殊的值,即EOF。scanf()函数检测到文件末尾时也返回EOF。通常,EOF定义在stdio.h文件中:
#define EOF (-1)
为什么是-1呢? 因为getchar()函数的返回值通常都介于0~127,这些值对应标准字符集。无论哪种情况,-1都不对应任何字符,所以,该值可用于标记文件结尾。
★★★如何使用EOF?
while((ch=getchar())!=EOF)
putchar(ch);
注意以下几点:
■ 不用定义EOF,因为stdio.h中已经定义过了。
■ 不用担心EOF的实际值,因为EOF在stdio.h中用#define预处理指令定义,可直接使用,不必在编写代码假定EOF为某值。
3、重定向和文件:
(1)两种方式使用文件:
① 显式使用特定的函数打开文件、关闭文件、读取文件、写入文件。
② 设计能与键盘和屏幕互动的程序,通过不同的渠道重定向输入至文件和从文件输出。换言之,把stdin流重新赋给文件。继续使用getchar()函数从输入流中获取数据。
(2)重定向输入:
① 文本文件是内含文本的文件,其中储存的数据是我们可识别的字符;
② <符号是Unix和DOS/windows的重定向运算符;
(3)重定向输出:
① >符号是第二个重定向运算符。它创建了一个名为mywords的新文件,然后把echo_eof的输出(即,你输入字符的副本)重定向至该文件中。重定向把stdout从显示设备(即,显示器)赋给mywords文件。
(4)组合重定向:
现在,假设你希望制作一份mywords文件的副本,并命名为savewords。只需输入以下命令即可:
echo_eof < mywords > savewords
下面的命令也起作用,因为命令与重定向运算符的顺序无关;
echo_eof > savewords < myworods
注意:在一条命令中,输入文件和输出文件名不能相同。
echo_eof < mywords > mywords.....<--错误
原因是> mywords在输入之前已导致原mywords的长度被截为零。
总之,在Unix、Linux、windows/DOS系统中使用两个重定向运算符(<和>)时,要遵循以下原则:
■ 重定向运算符连接一个可执行程序(包括标准操作系统命令)和一个数据文件,不能用于连接一个数据文件和另一个数据文件,也不能用于连接一个程序和另一个程序。
■ 使用重定向运算符不能读取多个文件输入,也不能把输出定向至多个文件。
■ 通常,文件名和运算符之间的空格不是必须的,除非是偶尔在Unix shell、Linux shell或windows命令行提示模式中使用的有特殊含义的字符。
Unix、Linux、windows/DOS还有>>运算符,该运算符可以把数据添加到现有文件的末尾,而|运算符能把一个文件的输出连接到另一个文件的输入。
小结:如何重定向输入和输出?
绝大部分C系统都可以使用重定向,可以通过操作系统重定向所有程序,或只在C编译器允许的情况下重定向C程序。假设prog是可执行程序名,file1和file2是文件名。
把输出重定向至文件:>
prog > file1
把输入重定向至文件:<
prog < file2
组合重定向:
prog < file2 >file1
prog> file1 这两种形式都是把file2作为输入、file1作为输出。 留白: 一些系统重定向运算符左侧有一个空格,右侧没有空格。而其他系统允许在重定位运算符两侧有空格或没有 空格。 4、创造更友好的用户界面:
(1)使用缓冲输入: (2)混合数值和字符输入: getchar()读取每个字符,包括空格、制表符和换行符;而scanf()在读取数字时则会跳过空格、制表符和换行符。 5、输入验证: ① 虽然checking.c程序的核心计算部分(sum_aquares()函数)很短,但是输入验证部分比以往程序示例都要复杂。所以,程序应该遵循模块化的编程思想,使用独立函数(模块)来验证输入和管理显示。程序越大,使用模块化编程就越重要。 ② 输入流和数字 6、菜单浏览:
① 任务 ② 使执行更顺利 ③ 混合数值和字符输入 7、关键概念: C程序把输入作为传入的字节流。getchar()函数把每个字符解释成一个字符编码。scanf()函数以同样的方式看待输入,但根据转换说明,它可以把字符输入转换成数值。许多操作系统都提供重定向,允许用文件代替键盘输入,用文件代替显示器输出。 程序通常接受特殊形式的输入。可以在设计程序时考虑用户在输入时可能犯的错误,在输入验证部分处理这些错误情况,让程序更强健友好。 对于一个小型程序,输入验证可能是代码中最复杂的一部分。处理这类问题有很多方案。例如,如果用户输入错误类型信息,可以终止程序,也可以给用户提供有限次或无限次机会重新输入。 8、本章小结: 许多程序使用getchar()逐字符读取输入。通常,系统使用行缓冲输入,即当用户按下enter键后输入才被传送给程序。按下enter键也传送了一个换行符,编程时要注意处理这个换行符。ANSI C把缓冲输入作为标准。 通过I/O包中的一系列函数,以统一的方式处理不同系统中的不同文件形式,是C语言的特性之一。getchar()和scanf()函数也属于这一系列。当检测到文件结尾时,这两个函数返回EOF(被定义在stdio.h头文件中)。在不同系统中模拟文件结尾条件的方式稍有不同。 许多操作系统(Unix和DOS)都有重定向的特性,因此可以用文件代替键盘和屏幕进行输入和输出。读到EOF即停止读取的程序可用于键盘输入和模拟文件结尾信号,或用于重定向文件。 混合使用getchar()和scanf()时,如果在调用getchar()之前,scanf()在输入下一行留下一个换行符,会导致一些错误。不过,意识到这个问题就可以在程序中妥善处理。 编写程序时,要认真设计用户界面。事先预料一些用户可能犯得错误,然后设计程序妥善的处理这些错位情况。