C Primer Plus (第五版)中文版——第 8 章 字符输入/输出和输入确认

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

getchar() 和 putchar() 每次输入和输出一个字符。一个输入回显例子:

/*使用一个while循环,该循环在遇到#时终止*/
int main(void)
{
	char ch;

	while ((ch = getchar()) != '#')
	{
		putchar(ch);
	}
	return 0;
}

8.2  缓冲区

  • 输入字符的立即回显是非缓冲(unbuffered)或直接输入(direct)的一个实例,它表示您所键入的字符对正在等待的程序立即可用。
  • 输入字符的延迟回显是缓冲输入(buffered)的一个实例,这种情况下您所键入的字符被收集并存储在一个被称为缓冲区(buffer)的临时存储区域中,按下回车键可使您所键入的字符块变为可用。

为什么需要缓冲区?

  • 将若干个字符作为一个块传输比逐个发送这些字符耗费的时间少。
  • 如果输入有误,就可以使用您的键盘更正功能来修正错误,当最终按下回车键时,就可以发送正确的输入。

为什么需要非缓冲区?

  • 一些交互性的程序需要非缓冲输入。例如:您希望一按下键就执行某个命令。

缓冲区的分类:

  • 完全缓冲(fully buffered)I/O :缓冲区满时被清空(内容被发至其目的地)
  • 行缓冲(line-buffered)I/O:遇到一个换行字符时缓冲区被清空。键盘输入是标准的行缓冲。

8.3  终止键盘输入

8.3.1  文件、流和键盘输入

  • 文件(file)是一块存储信息的存储器区域。流(stream)是一个理想化的数据流,实际输入或输出映射到这个数据流。
  • 打开文件的过程就成为将流与文件相关联,并通过流进行读写的过程。
  • 键盘输入有一个被称为 stdin 的流表示。
  • 屏幕上的输出由一个被称为 stdout 的流表示。

结论:可以使用与处理文件相同的技术来处理键盘输入。

8.3.2  文件结尾

计算机操作系统需要某种方式来断定每个文件其实和结束的位置。检测文件结尾的方法有:

  • 在文件中放置一个特殊字符来标志结尾。
  • 让操作系统存储文件大小的信息。

在 C 中,检测到文件尾时,getchar() 和scanf() 的返回值是EOF。EOF 代表的值表示检测到文件结尾。使用方法:

while((ch = getchar()) != EOF)    /*将getchar()的返回值与EOF进行比较*/

因此可以重写输入回显程序:

int main(void)
{
	char ch;

	while ((ch = getchar()) != EOF)
	{
		putchar(ch);
	}
	return 0;
}

8.4  重定向和文件

  • 输入重定向使您的程序能够使用文件代替键盘作为输入
  • 输出重定向使您的程序能够使用文件代替屏幕作为输出

一、输入重定向

echo_eof < words

< 符号是重定向运算符,该运算符把 words 文件与 stdin 流关联起来。将该文件的内容引导至 echo_eof 程序。

二、输出重定向

echo_eof > mywords

> 符号是重定向运算符,该运算符建立一个名为 mywords 的新文件供您使用,将 stdout 从显示设备重定向到该文件。

三、组合重定向

  • 重定向运算符将一个可执行(executable)程序与一个数据文件连接起来。
  • 使用重定向运算符时,输入不能来自一个以上的文件,输出也不能定向至一个以上的文件。
  • 名字和操作符之间的空格不是必须的。

8.5  创建一个更友好的用户界面

8.5.1  使用缓冲输入

缓冲输入提供给用户在将输入发送至程序前对其进行编辑的机会,但在使用字符输入时会给编程人员带来麻烦。

8.5.2  混合输入数字和字符

假设程序同时需要使用 getchar() 进行字符输入和使用 scanf() 进行数字输入。由于 getchar() 读取每个字符,包括空格、换行符和制表符;而scanf() 在读取数字时则会跳过空格、换行符和制表符。当调用 getchar() 之前 scanf() 恰好在输入中留下一个换行符或其他字符时,可能将产生问题。因此二者混合使用时需要注意。

8.6  输入确认

在实际情况中,程序的用户并不总是遵循指令。当用户完成输入后,您应该确认用户的输入是否符合指令,若不符合,可以提示用户重新进行输入,若输入符合指令,再使程序继续运行。

8.7  菜单浏览

菜单使程序对用户而言更加友好,也给编程人员提出了一些问题。编程人员希望程序达成两个目标:

  • 程序在用户遵循指令时顺利进行
  • 程序在用户没有遵循指令时也能顺利进行

通常第二个目标较难实现,因为预见程序所有可能的用户错误行为是非常困难的。当您编写程序时,要仔细地计划用户界面。尝试预见用户可能犯的错误类型,然后设计您的程序对其进行处理。

8.11  编程练习

编程练习参考程序

猜你喜欢

转载自blog.csdn.net/Mr__Gold/article/details/84103627
今日推荐