问:通过键盘怎么模拟文件结尾条件?
问:重定向只用一个>符号就行了吗?
问:输入验证是怎么操作的?
getchar和putchar每次都只处理一个字符,是不是很笨拙?
- 但这种方法很适合计算机
- 而且是绝大多数文本处理程序所用的核心方法。
输入一个字符串,回车,就会输出此字符串,除非字符串中有#(程序问题:想输入#怎么办)
问:既然getchar和putchar都是处理一个字符,为什么输入和输出不是这样的?HHeelllloo?
答:老式系统确实是这样的!!没有缓冲区就会如此!!
有缓冲区的系统,在按下Enter后,才可使用用户输入的字符。
使用缓冲区的好处:1)效率更高;2)如果打错字符,还可以进行修正。
无缓冲输入的场景:游戏中,按下一个键就执行相应的指令
大部分人知道有缓冲区的,但知道缓冲分为哪两类吗?
- 完全缓冲I/O:缓冲区填满才刷新缓冲区。通常出现在文件输入中。缓冲区大小512字节和4096字节。
- 行缓冲I/O:输入Enter刷新缓冲区,这里的“行”就是换行符的意思。键盘输入通常是行缓冲输入。
冷知识:查询:conio.h为无缓冲提供函数,如getche(),getch() P239
getche()回显输入:输入的字符直接显示
getch()无回显驶入:输入的字符不显示
UNIX通过ioctl()函数控制什么?控制是否使用缓冲输入?ioctl属于UNIX库,而不属于C标准。
ANSI C中,用setbuf()和setvbuf()控制缓冲。
处理文件的函数也有至少两类:
1)C语言有许多打开、读取、写入和关闭文件的库函数。有标准I/O包!
2)主机OS也有基本文件工具直接处理文件,这些叫做底层IO。OS不同,所以是没有标准的。
具体的C负责处理不同系统的差异。什么差异?OS处理文件的差异
- 文件内容和信息:有些OS把文件内容存储在一处,把文件信息存储在另一处;
- 文件内容和信息:有些OS在文件内创建一份文件描述;
- 末尾处理:有些OS用单个换行符;
- 末尾处理:有些OS用回车符或换行符;
- 文件大小衡量:有些OS用最小字节来衡量文件大小。比如某文件有100个字节大小;
- 文件大小衡量:有些OS用字节块的大小来衡量。
如果使用标准I/O包,就不用考虑这些差异!!
C程序处理的是流而不是直接处理文件,怎么理解?
不同属性和不同种类的输入,由属性更统一的流来表示。打开文件就是把流与文件关联,读写都通过流来完成。??
本章着重理解C把输入和输出设备视为存储设备上的普通文件。把键盘和显示器视为自动打开的文件(已经调用过open的文件,直接用getchar、putchar、printf、scanf即可)
stdin表示键盘输入,stdout表示屏幕输出。
8.3.2文件结尾
CP/M,IBM-DOS和MS-DOS这些操作系统如何处理文件结尾的?使用CTRL+Z,这曾经是文件结尾的唯一标记!。^Z!
现在的文件结尾还可以是“记录文件的大小”。如果文件有3000字节,程序读到3000字节时并到达文件的末尾,UNIX使用这种方法处理所有文件。
EOF(文件结尾标识):定义在stdio.h中
#define EOF (-1) // 为什么是-1,为什么要用()。因为getchar的返回值可能在0-255之间。-1都不对应任何字符,所以可以用于标记文件结尾。
问:如果是中文字符呢?其中的一个字节有可能为-1吗?
问:系统都把EOF定义为-1吗?不一定。
来了,键盘怎么模拟文件结尾?直接输入EOF吗?直接输入-1吗?错错错,要根据系统,有可能是CTRL+D,也有可能是CTRL+Z。
题外话:如果文件中间有CTRL+Z,则也认为是结尾。
getchar的返回值是int型,为什么?
一个程序的输入可以是键盘、磁带、穿孔卡、语音,或者文件。
可以通过两种方式使用文件,一种是常规的打开、关闭、读写文件。第二种是重定向。
重定向:getchar之前是从键盘输入流获得数据,现在是从文件输入流获得数据。
文本文件(text file)中是我们可以识别的字符。echo_eof < words(试一试)即可,这样就会words的内容打印的屏幕上?
“<”重定向运算符。
同理:重定向输出:echo_eof > mywords
额,还可以组合重定向:
echo_eof < mywords > savewords:先把mywords在屏幕中输出,在写入到savewords中。
注意:重定向运算符连接的是可执行程序和文件。
>> 运算符,可以把数据添加到现有文件的末尾。
| 运算符:能把一个文件的输出连接到另一个文件的输入(没明白)。
重定向是一个命令行概念。不用命令行可以重定向吗?也可以。但后面的解释,看起来差不多都是命令行。
getchar和scanf的一个区别:
getchar会读取每个字符,包括空格、制表符和换行符
scanf读取字符时会跳过空格、制表符和换行符
最好不要把getchar和scanf混用,P248例子略过
输入验证:验证是否是字符什么的吗?
想验证一个非负整数n:通过判断scanf的返回值(返回成功读取项的个数) 及 判断n是否为非负。下面的这些例子,回头可以再研究一下P251。
scanf, printf, getchar的返回值,在用的时候临时查。
8.6.2 输入流和数字:
is 28 12.4对c语言而言,这是一个字节流,怎么理解?
第1个字节是字母i的字符编码,第2个是s,第3个是空格…
允许用文件代替键盘输入,用文件代替显示器输出。