继续写博客,趁着这几天印象还不错抓紧结束。
全书共分17章,这是关于本书第8章内容的博客,本章介绍了关于输入和输出的一些知识,以及重定向的内容,还给出了关于创建界面的建议。博客的目录和书上目录是相似的。此系列博客的代码都在Visual Studio 2022环境下编译运行。
我目前大一刚刚结束,水平有限,博客中若有错误或者总结不到位的地方也请见谅。
目录
8.1 单字符I/O:getchar()和putchar()
8.1 单字符I/O:getchar()和putchar()
虽然getchar()和putchar()一次只能处理一个字符,但是这种方法适合计算机,并且是绝大多数文本处理程序的核心方法。
8.2 缓冲区
不进行缓冲存储的输入是无缓冲输入,正在等待的程序可以立即使用输入的字符。进行缓冲的输入是缓冲输入,用户的输入被收集并存储在缓冲区中。
使用缓冲区比逐个发送字符更节省时间,并且可以修正输入错误。但是某些情况也需要无缓冲输入。
缓冲分为两类:完全缓冲和行缓冲。完全缓冲在缓冲区被填满时才刷新缓冲区,通常出现在文件输入中。缓冲区的大小取决于系统。行缓冲在出现换行符时刷新缓冲区,键盘输入通常是行缓冲。
ANSI C和后续的C标准规定输入是缓冲的,且没有提供调用无缓冲输入的标准方式,是否能进行无缓冲输入取决于计算机系统。
8.3 结束键盘输入
8.3.1 文件、流和键盘输入
文件是存储信息的区域。
C语言有很多用于打开、读取、写入和关闭文件的库函数。C语言可以使用主机操作系统的基本文件工具直接处理文件,这些直接调用操作系统的函数被称为底层I/O。C语言不为普通的底层I/O函数创建标准库,因为系统各不相同。C语言可以通过标准I/O包处理文件,这时由具体的C实现处理不同系统的差异,使用标准I/O包就不用考虑差异。
C语言处理的是流,而不是直接处理文件。流是实际输入或输出映射的理想化数据流。打开文件是把流与文件关联,读写是通过流来完成。
C语言把输入和输出设备视为存储设备上的普通文件,把键盘和显示设备视为自动打开的文件。stdin表示键盘输入,stdout表示屏幕输出。getchar(),putchar(),printf()和scanf()都是标准I/O包的成员,处理这两个流。
可以用处理文件的方式处理键盘输入。C语言的输入函数内置了文件结尾检测器。
8.3.2 文件结尾
操作系统使用某种方式判断文件的开始和结束。
C语言中,用getchar()和scanf()检测到文件末尾会返回EOF(end of file)。EOF定义在stdio.h头文件中。一般EOF是负值(本系统是-1),不对应任何字符。EOF标志着检测到文件结尾,不是文件中的符号。
可以使用EOF判断输入是否达到结尾。示例如下:
#include<stdio.h>
int main(void)
{
int ch;
while ((ch = getchar()) != EOF)
putchar(ch);
return 0;
}
需要输入EOF字符,Windows是在换行后立即按Crtl+Z。不同系统的输入方式不同。
8.4 重定向和文件
输入和输出涉及函数、数据和设备。默认情况下C语言使用标准I/O包查找标准输入作为输入源,也可以从别处查找。
程序可以通过特定的函数使用文件(第13章内容),也可以通过重定向输入至文件和从文件输出。
重定向与操作系统有关。Windows命令行可以重定向输入输出。重定向输入让程序用文件输入,重定向输出让程序输出至文件。
文本文件是内含文本的文件,其中存储的是字符。存储可执行程序的文件不是文本文件。
把输入重定向的指令是:
./prog(可执行文件)<file(文本文件)
把输出重定向的指令是:
./prog(可执行文件)>file(文本文件)
组合重定向的指令是:
./prog < file2 > file1
./prog > file1 < file2
把file2作为输入,把file1作为输出。file1和file2不能是同一个文件。
不能读取多个文件的输入,也不能把输出定向至多个文件。不能连接两个可执行程序,也不能连接两个文本文件。
重定向要在命令行发出指令,一些IDE提供菜单选项,可以指定重定向。
也可以用程序直接打开文件,不使用重定向。详细内容在第13章。
8.5 创建更友好的用户界面
8.5.1 使用缓冲输入
使用缓冲输入比较方便,用户在结束输入前可以修改输入,但是会给程序员带来麻烦。
按下Enter键传送了换行符,程序必须处理换行符,否则会造成输入错误。
在编写交互式程序时,要预料到用户可能输入错误,要设计能处理用户错误输入的程序。
8.5.2 混合数值和字符输入
在混合数值和字符输入时要注意丢弃换行符。可以使用以下的while循环:
while(getchar()!='\n')
continue;
8.6 输入验证
实际生活中用户不一定会按照程序的指令行事。用户的输入和程序期望的输入不匹配时常发生,会导致程序运行失败。要预料到一些可能的输入错误。
输入的错误包括输入范围错误,输入类型错误等。
程序越大,使用模块化就越重要。
8.7 菜单浏览
菜单可以为用户带来方便,菜单提供很多选项,用户输入选项随后根据选项完成任务。但是用户可能输入错误选项,程序要能够处理输入错误。