字符输入输出和输入验证
本文最后更新于426 天前,其中的信息可能已经过时,如有错误请发送邮件到echobydq@gmail.com

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

getchar() & putchar 每次只处理一个字符

头文件 stdio.h 中包含这两个,他们被定义为供预处理器使用的宏

2. 缓冲区

老式系统,无缓冲区,输入 hello 时,显示为 hheelloo。即正在等待的程序可立即使用输入的字符

 缓冲输入和无缓冲

好坏

缓冲区好处:

  1. 若干字符作为一个块进行传输比逐个发送节约时

    1. 用户打错可直接修改

无缓冲区好处:游戏指令

缓冲分类

缓冲分为:

  1. 完全缓冲I/O:缓冲区填满时刷新缓冲区
  2. 行缓冲I/O:出现换行符时刷新缓冲区

无缓冲

ANSI C 和 后续的 C标准都规定输入是缓冲的:一些计算机不允许无缓冲输入

conino.h:包含无缓冲输入函数

getchae();回显无缓冲输入(回显输入意味着用户输入字符直接显示在屏幕上)

getch():无回显无缓冲输入 (无回显输入意味着击键后对应的字符不显示)

3. 结束键盘输入

3.1 文件、流和键盘输入

文件

文件:存储器中存储信息的区域。通常文件保存在某种永久存储器中

I/O:C存在对文件进行操作的库函数。从较低层面上,C 可以使用主机操作系统基本文件工具直接处理文件,这些直接调用操作系统的函数被称为底层 I/O。

由于计算机系统各不相同(差异),不能为普通的底层I/O函数创建标准库,但从较高层面上,C 还可以通过标准I/O包来处理文件。

这里的差异有多种。例如,不同系统存储文件的方式不同。有些系统把文件内容和文件相关信息分开存储;另一些系统在文件中创建一份文件描述。

在处理文件方面,有些使用单个换行符标记行末尾,其他系统可能使用回车符和换行符组合来表示行末尾。如果使用标准I/O包则不用考虑这些差异。

C程序处理的是流而不是文件。Java也是的(个人觉得)

流 是一个实际输入或输出映射的理想化数据流。这意味着不同属性和不同种类的输入,由属性更统一的流来表示。于是打开文件过程就是把流与文件关联,读写都通过流来完成.

重点:理解 C 把输入和输出设备视为存储设备上的普通文件,尤其是把键盘和显示设备视为每个C程序自动打开的文件。

stdin流表示键盘输入,stdout流表示屏幕输出,getchar()、putchar()、printf()、scanf() 函数都是标准I/O包的成员,处理这两个流。

综上所述:可以用处理文件的方式处理键盘输入。C的输入函数内置了文件结尾检测器。既然可以把键盘输入视为文件,那么也应该能使用文件结尾检测器结束键盘输入。

3.2 文件结尾

计算机操作系统要以某种方式判断文件的开始和结束。检测文件结尾的一种方法是,在文件末尾放一个特殊的字符标记文件结尾。

如今。这些操作系统可以使用内嵌的Ctrl+Z字符来标记结尾。曾经是操作系统使用的唯一标记,不过现在有其他选择,例如记录文件的大小。

带文件结尾标记的文件

操作系统使用的另一种方法是存储文件大小的信息。如果文件有三千字节,则读到三千字节时到达末尾。MS-DOS及其相关系统使用此方法处理二进制文件,,因为这种方法可以在文件中存储所有字符,包括 Ctrl+Z。新版的DOS也使用这种方法处理文本文件。UNIX 使用这种方法处理所有文件。

但是无论操作系统实际使用哪种方法,在C语言中,用 getchar()/scanf() 读取文件检测到文件结尾时将返回一个特殊的值,即EOF(end of file)。

EOF定义在 stdio.h 文件中 #define EOF (-1)

为-1原因:字符集在 0——255。-1不对应任何字符。

一些系统也许把EOF定义为其他,但是定义的值一定与输入字符所产生的返回值不同。

如何在程序中使用EOF? 把 getchar() 值和EOF比较。如果两值不同,就说明没有到达文件结尾。即如下表达式

while ( (ch = getchar()) != EOF)

4. 重定向和文件

输入和输出设计函数、数据和设备。如果输入函数和输入数据不变,仅改变程序查找数据的位置,如何完成?

程序可以通过两种方法使用文件

  1. 显式使用特定的函数打开文件、关闭文件、读取我文件、写入文件
  2. 设计能与键盘交互的程序,通过不同渠道重定向输入至文件和从文件输出。即把stdin流重新赋给文件,继续使用getchar() 函数从输入流中获取数据
觉得有帮助可以投喂下博主哦~感谢!
作者:Echo
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0协议
转载请注明文章地址及作者哦~

评论

发送评论(请正确填写邮箱地址,否则将会当成垃圾评论处理) 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇