C

C知识汇总-输入输出IO

Posted by zihengCat on 2017-08-07

流的概念

流是磁盘或其他外围设备中存储的数据的源点或终点。在一些系统中(如UNIX系统),文本流和二进制流是没有差别的,但是C标准库还是分别提供了这两种流。

文本流是由文本行组成的序列,每一行有0个或多个字符并以\n结尾。在某些环境中(如Windows)也许需要把文本流转换成其他表示形式(把\n映射成\r回车符和\n换行符)或从其他表示形式转换回来。

二进制流是未经处理的字节组成的序列,这些字节记录着实际数据,二进制流的输入输出的内容是完全相同的。

通过打开一个流可以将该流与某个文件或某个设备关联起来,这一关联可以通过关闭流而终止。
在C中,打开一个文件将返回一个指向FILE结构的指针,该指针中记录有用于控制该流的所有必要的信息。

在C程序开始执行时,stdinstdoutstderr 这三个流已经被打开。

格式化输入输出

格式化输出

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, ...)

printf
printf(...)函数等价于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, ...)

scanf
scanf(...)函数等价于fscanf(stdin, ...)

int scanf(const char* format, ...)

sscanf
sscanf 函数从目标字符串中格式化读取数据。

int sscanf(char *s,const *format, ... )

文件输入输出