流的概念
流是磁盘或其他外围设备中存储的数据的源点或终点。在一些系统中(如UNIX系统),文本流和二进制流是没有差别的,但是C标准库还是分别提供了这两种流。
文本流是由文本行组成的序列,每一行有0个或多个字符并以\n
结尾。在某些环境中(如Windows)也许需要把文本流转换成其他表示形式(把\n
映射成\r
回车符和\n
换行符)或从其他表示形式转换回来。
二进制流是未经处理的字节组成的序列,这些字节记录着实际数据,二进制流的输入输出的内容是完全相同的。
通过打开一个流可以将该流与某个文件或某个设备关联起来,这一关联可以通过关闭流而终止。
在C中,打开一个文件将返回一个指向FILE
结构的指针,该指针中记录有用于控制该流的所有必要的信息。
在C程序开始执行时,stdin
、stdout
和 stderr
这三个流已经被打开。
格式化输入输出
格式化输出
printf 类函数用于提供格式化的输出转换。接受一个格式化字符串。
格式化字符串包含两种类型字符对象:普通字符(它们被拷贝到输出流)与转换规格说明(它们决定参数的转换和输出格式)。每个转换规格说明均以字符%
开头,以转换字符结束。
printf 常用的转换字符表
在%
与转换字符这二者之间依次可以有以下转换字符:
格式字符 | 参数 | 意义 |
---|---|---|
d , i |
int | 带符号十进制整型数 |
u |
int | 无符号十进制整型数 |
o |
int | 无符号八进制整型数(无前导0) |
x , X |
int | 无符号十六进制整型数(无前导0x) |
c |
char | 整数对应的ASCII字符 |
s |
char* | 字符串(以\0 结尾的字符数组) |
f |
double | 十进制浮点数, 默认精度为6(可指定) |
e , E |
double | e记法浮点数, 默认精度为6(可指定) |
g , G |
double | 自动选择浮点数的表示形式([-4, 6]为f ,否则为e ) |
p |
void* | 打印地址值 |
% |
\ | 打印百分号 % |
fprintf
fprintf 函数用于按照 format 说明的格式把参数列表中参数的内容进行转换,并写入stream指向的流。返回值是实际写入的字符数。若出错则返回一个负值。
int fprintf(FILE *stream, const char *format, ...)
printfprintf(...)
函数等价于fprintf(stdout, ...)
int printf(const char *format, ...)
sprintf
sprintf 函数与 printf 函数的功能基本相同,但输出到数组中,并以\0
结束。 s必须足够大,以便能装下输出结果,否则会溢出。该函数返回实际输出的字符数,不包括\0
。
int sprintf(char *str, const char *format, ...);
格式化输入
scanf 类函数用于提供格式化输入转换。
格式字符串 format 通常包含有用于指导输入转换的转换规格说明。格式字符串中可以包含:
- 空格或制表符,它们将被忽略。
- 普通字符(“%”除外),与输入流中下一个非空白的字符相匹配。
- 转换规格说明,由一个 %、一个赋值屏蔽字符 *(可选)、一个用于指定最大字段宽的数(可选)、一个用于指定目标字段的字符 (h、l或 L )(可选)以及一个转换字符组成。
转换规格说明决定了输入字段的转换方式。通常把结果保存在由对应参数指向的变量中。然而,如果转换规格说明中包含有赋值屏蔽字符“*”,例如%*s
,那么就跳过对应的输入字段,不进行赋值。输入字段是一个由非空白符组成的字符串,当遇到空白符或到达最大字段宽(如果有的话)时,对输入字段的读入结束。这意味着 scanf 函数可以跨越行的界限来读入其输入,因为换行符也是空白符(空白符包括空格、横向制表符、纵向制表符、换行符、回车符和换页符)。
scanf 常用的转换字符表
格式字符 | 参数 | 意义 |
---|---|---|
d |
int* | 带符号十进制整数 |
u |
unsigned int* | 无符号十进制整数 |
o |
int* | 八进制整数(带不带前导0都可以) |
x |
int* | 十六进制整数(带不带前导0x都可以) |
i |
int* | 整数(前导0为八进制, 前导0x为十六进制) |
c |
char* | 字符(可指定字符宽度,默认为1) |
s |
char* | 不带空白符的字符串(承载数组必须足够大) |
e , f , g |
float* | 浮点数(任意合法的C浮点数表示) |
p |
void* | 地址值 |
fscanf
fscanf 函数用于在格式串 format 的控制下从流stream中读入字符,把转换后的值赋给后续各个参数,在此每一个参数都必须是一个指针。当格式串 format 结束时函数返回。返回实际被转换并赋值的输入项的数目。如果到达文件的末尾或在参数被转换前出错,那么该函数返回 EOF。
int fscanf(FILE *stream, const char *format, ...)
scanfscanf(...)
函数等价于fscanf(stdin, ...)
int scanf(const char* format, ...)
sscanf
sscanf 函数从目标字符串中格式化读取数据。
int sscanf(char *s,const *format, ... )