C语言
- 知识基础
- 控制语句
- 函数
- 输入输出
- 指针和数组
- 用户自定义数据类型
- 文件操作
文章目录
对头文件<stdio.h>中的标准输入输出库函数的总结
C语言标准库
一、流(Stream)
计算机处理数据必然设计对文件的读写、对用户输入输出的处理,如何理解这个过程?引入流(Stream)
的概念:
流
是一个抽象概念,是程序和数据交互的桥梁,可以理解为“字节流”“数据流”;- 输入输出控制实际上就是对
流
的控制; - 一个输入输出操作对应一个
流
,写操作对应输入流,读操作对应输出流; - C语言中
流
具体为FILE
数据类型定义的文件操作符;
综上,标准输入输出库函数都直接或缺省的对应一个流(有一个文件操作符);
输入输出操作流程
1.为想要操作的文件创建一个`文件操作符`;(通过`文件操作符`区分对不同文件流的操作)
2.通过库函数实现具体的读写操作(缓冲区);
3.关闭文件流。
二、缓冲区
直接读写磁盘效率较低,如果输入输出直接与磁盘数据交互是不太合理的,所以标准输入输出会自动设置缓存区,提高效率;
- 读操作,首先打开数据流(对应一个文件操作符),将磁盘中的数据复制到缓存区,程序从缓存区读入数据;
- 键盘输入的信息同样会暂存在缓存区,只有读入到回车才会将之前的所有数据(包括最后的回车)一起交给程序;
- 写操作,首先打开数据流(对应一个文件操作符),将信息写入缓冲区,只有当缓冲区已满或者关闭文件时,才会写入磁盘当中。
三、标准输入输出
更一般的,对文件的输入输出操作及FILE结构体在最后的文章中讲解
标准输入接口:用户从键盘输入的接口;
标准输出接口:向用户显示窗口输出的接口;
系统在程序运行时会自动定义三个文件类型指针stdin
、stdout
、stderr
,也就是提前打开了标准输入流、标准输出流、标准错误流,并且已经设置好了文件操作符中的成员,在程序结束时自动关闭,所以可以直接通过库函数实现键盘输入和窗口输出而无需打开和关闭操作,常用的标准输入输出函数:
1.字符输入输出
函数原型:int getcahr(void)
- 输入:
void
,默认从键盘缓冲区读入一个unsigned char
型; - 返回值:将输入强制类型转换为
int
型,如果在文件末尾或读错误,返回EOF
; - 说明:键盘输入时只有输入’\n’才会将所有输入(包括’\n’)从缓冲区流向程序,下一次调用本函数,不再需要键盘输入,会自动读入缓存区的下一个字符,最后读到的字符会是’\n’。
函数原型:int putchar(int ch);
- 输入:
ch
代表一个unsigned char
型,传参时以int
型传递其值; - 返回值:以
unsigned char
强制转换为int
的形式返回写入的字符,发生错误则返回EOF
; - 说明:本函数可以向窗口输出任意字符,包括 ‘\n’、‘\t’ 等特殊字符。
函数原型:char *gets(char *str)
- 输入:一个指向字符数组的指针(存储字符串);
- 返回值:如果成功,该函数返回
str
,如果发生错误或者到达文件末尾时还未读取任何字符,则返回NULL
。 - 说明:本函数读取输入的一行,遇到除换行符’\n’之外的空白字符正常的读入,读入结束之后会在末尾加上
‘\0’
;
函数原型:int puts(const char *str)
- 输入:一定是字符数组的静态地址,存储将要写入的字符串;
- 返回值:如果成功,该函数返回一个非负值为字符串长度(包括末尾的 ‘\0’),如果发生错误则返回
EOF
。 - 说明:本函数在输出末尾会自动添加换行符’\n’;
2.格式化输入输出
函数原型:int printf(const char *format, ...)
- 输入:
format
字符串是输出到stdout
的文本,特殊的,其中带有一些标签:
%[flags][width][.precision][length]specifier
这些标签会被字符串之后的附加参数
值一对一替代。
specifier | 格式字符——意义 |
---|---|
d | 以十进制形式输出带符号整数(正数不输出符号) |
ld | 32位带符号整数 |
lld | 64位带符号整数 |
o | 以八进制形式输出无符号整数(不输出前缀0) |
x,X | 以十六进制形式输出无符号整数(不输出前缀0x) |
u | 以十进制形式输出无符号整数 |
f | 以小数形式输出单、双精度实数 |
e,E | 以指数形式输出单、双精度实数 |
g,G | 以%f或%e中较短的输出宽度输出单、双精度实数 |
c | 输出单个字符 |
s | 输出字符串 |
p | 输出指针地址 |
lu | 32位无符号整数 |
llu | 64位无符号整数 |
flags | 标识——意义 |
---|---|
- | 在给定的字段宽度内左对齐,默认是右对齐 |
+ | 强制在结果之前显示加号或减号(+ 或 -) |
【空格】 | 如果没有写入任何符号,则在该值前面插入一个空格 |
# | 与 o、x 或 X 说明符一起使用时,非零值前面会分别显示 0、0x 或 0X; 与 e、E 和 f 一起使用时,会强制输出包含一个小数点,即使后边没有数字时也会显示小数点; 默认情况下,如果后边没有数字时候,不会显示显示小数点; 与 g 或 G 一起使用时,结果与使用 e 或 E 时相同,但是尾部的零不会被移除 |
0 | 在指定填充 padding 的数字左边放置零(0),而不是【空格】 |
width | 宽度——意义 |
---|---|
【数值】 | 要输出的字符的最小数目。如果输出的值短于该数,结果会用空格填充。 如果输出的值长于该数,结果不会被截断 |
* | 宽度在 format 字符串中未指定,但是会作为附加整数值参数放置于要被格式化的参数之前 |
.precision | .精度——意义 |
---|---|
.【数值】 | 对于整数说明符(d、i、o、u、x、X):precision 指定了要写入的数字的最小位数。如果写入的值短于该数,结果会用前导零来填充。如果写入的值长于该数,结果不会被截断。精度为 0 意味着不写入任何字符。 对于 e、E 和 f 说明符:要在小数点后输出的小数位数。 对于 g 和 G 说明符:要输出的最大有效位数。 对于 s: 要输出的最大字符数。默认情况下,所有字符都会被输出,直到遇到末尾的空字符。 对于 c 类型:没有任何影响。当未指定任何精度时,默认为 1。如果指定时不带有一个显式值,则假定为 0。 |
.* | 精度在 format 字符串中未指定,但是会作为附加整数值参数放置于要被格式化的参数之前 |
length | 长度——意义 |
---|---|
h | 参数被解释为短整型或无符号短整型(仅适用于整数说明符:i、d、o、u、x 和 X) |
l | 参数被解释为长整型或无符号长整型,适用于整数说明符(i、d、o、u、x 和 X)及说明符 c(表示一个宽字符)和 s(表示宽字符字符串) |
L | 参数被解释为长双精度型(仅适用于浮点数说明符:e、E、f、g 和 G) |
- 返回值:如果成功,则返回写入的字符总数,否则返回一个负数;
- 说明:格式化输出虽然复杂,但是功能强大,最好熟练掌握。
函数原型:int scanf(const char *format, ...)
输入:format
是对读入内容的格式说明可以是【空格】或【非空格字符】说明符
%[*][width][modifiers]type
非空格字符需要在键盘输入时,按照相同格式、位置输入!需要注意的是格式化输入的附加参数数据类型一般为指针,可以用取地址运算符&
,添加正确的参数。
* | 参数——意义 |
---|---|
可选的星号 | 表示数据是从流 stream 中读取的,但是可以被忽视,即它不存储在对应的参数中 |
width | 宽度——意义 |
---|---|
【数值】 | 指定了在当前读取操作中读取的最大字符数 |
modifiers | 指针对象大小——意义 |
---|---|
h | 短整型(针对 d、i 和 n),或无符号短整型(针对 o、u 和 x) |
l | 长整型(针对 d、i 和 n),或无符号长整型(针对 o、u 和 x),或双精度型(针对 e、f 和 g) |
L | 长双精度型(针对 e、f 和 g) |
type | 类型——需要的输入 | 附加参数类型 |
---|---|---|
c | 单个字符:读取下一个字符。如果指定了一个不为 1 的宽度 width,函数会读取 width 个字符,并通过参数传递,把它们存储在数组中连续位置。在末尾不会追加空字符 | char * |
d | 十进制整数:数字前面的 + 或 - 号是可选的 | int * |
u | 无符号的十进制整数 | unsigned int * |
e,E,f,F,g,G | 浮点数:包含了一个小数点、一个可选的前置符号 + 或 -、一个可选的后置字符 e 或 E,以及一个十进制数字 | float * |
i | 读入十进制,八进制,十六进制整数 | int * |
o | 八进制整数 | int * |
x,X | 十六进制整数 | int * |
s | 字符串。这将读取连续字符,直到遇到一个空格字符(空格字符可以是空白、换行和制表符) | char * |
p | 读入一个指针 | —— |
[字符集] | 扫描字符集合 | —— |
% | 读 % 符号 | —— |
- 返回值:如果成功,该函数返回成功匹配和赋值的说明符的个数。如果到达文件末尾或发生读错误,则返回
EOF
; - 说明:注意附加参数类型!scanf函数以空白字符(空格符、制表符、回车符)结束对变量的赋值所有变量都已赋值的情况下,回车是对scanf函数的结束。
总结
本文介绍了标准输入输出函数中的几个常用概念和函数,深入理解流
这个概念能很好的帮助我们掌握输入输出函数的使用;另外格式化输入、输出函数一定要熟悉。