c primer plus(第六版) - 8 字符输入输出和输入验证。

问:通过键盘怎么模拟文件结尾条件?

问:重定向只用一个>符号就行了吗?

问:输入验证是怎么操作的?

getcharputchar每次都只处理一个字符,是不是很笨拙?

  1. 但这种方法很适合计算机
  2. 而且是绝大多数文本处理程序所用的核心方法

输入一个字符串,回车,就会输出此字符串,除非字符串中有#(程序问题:想输入#怎么办)

问:既然getcharputchar都是处理一个字符,为什么输入和输出不是这样的?HHeelllloo

答:老式系统确实是这样的!!没有缓冲区就会如此!!

有缓冲区的系统,在按下Enter后,才可使用用户输入的字符。

使用缓冲区的好处1)效率更高;2)如果打错字符,还可以进行修正。

无缓冲输入的场景:游戏中,按下一个键就执行相应的指令

大部分人知道有缓冲区的,但知道缓冲分为哪两类吗?

  1. 完全缓冲I/O:缓冲区填满才刷新缓冲区。通常出现在文件输入中。缓冲区大小512字节和4096字节。
  2. 行缓冲I/O:输入Enter刷新缓冲区,这里的“行”就是换行符的意思。键盘输入通常是行缓冲输入。

冷知识:查询:conio.h为无缓冲提供函数,如getche()getch() P239

getche()回显输入:输入的字符直接显示

getch()无回显驶入:输入的字符不显示

UNIX通过ioctl()函数控制什么?控制是否使用缓冲输入?ioctl属于UNIX库,而不属于C标准。

ANSI C中,用setbuf()setvbuf()控制缓冲。

处理文件的函数也有至少两类

1C语言有许多打开、读取、写入和关闭文件的库函数。有标准I/O包!

2)主机OS也有基本文件工具直接处理文件,这些叫做底层IOOS不同,所以是没有标准的。

具体的C负责处理不同系统的差异。什么差异?OS处理文件的差异

  1. 文件内容和信息:有些OS把文件内容存储在一处,把文件信息存储在另一处;
  2. 文件内容和信息:有些OS在文件内创建一份文件描述;
  3. 末尾处理:有些OS用单个换行符
  4. 末尾处理:有些OS回车符或换行符
  5. 文件大小衡量:有些OS最小字节来衡量文件大小。比如某文件有100个字节大小;
  6. 文件大小衡量:有些OS用字节块的大小来衡量。

如果使用标准I/O包,就不用考虑这些差异!!

C程序处理的是流而不是直接处理文件,怎么理解?

不同属性和不同种类的输入,由属性更统一的流来表示。打开文件就是把流与文件关联,读写都通过流来完成。??

本章着重理解C输入和输出设备视为存储设备上的普通文件。把键盘显示器视为自动打开的文件(已经调用过open的文件,直接用getcharputcharprintfscanf即可)

stdin表示键盘输入,stdout表示屏幕输出。

8.3.2文件结尾

CP/MIBM-DOSMS-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中。

注意:重定向运算符连接的是可执行程序和文件。

>> 运算符,可以把数据添加到现有文件的末尾。

| 运算符:能把一个文件的输出连接到另一个文件的输入(没明白)。

重定向是一个命令行概念。不用命令行可以重定向吗?也可以。但后面的解释,看起来差不多都是命令行。

getcharscanf的一个区别:

getchar会读取每个字符,包括空格、制表符和换行符

scanf读取字符时会跳过空格、制表符和换行符

最好不要把getcharscanf混用,P248例子略过

输入验证:验证是否是字符什么的吗?

想验证一个非负整数n:通过判断scanf的返回值(返回成功读取项的个数) 判断n是否为非负。下面的这些例子,回头可以再研究一下P251

scanf, printf, getchar的返回值,在用的时候临时查。

8.6.2 输入流和数字:

is 28 12.4c语言而言,这是一个字节流,怎么理解?

1个字节是字母i的字符编码,第2个是s,第3个是空格

允许用文件代替键盘输入,用文件代替显示器输出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值