文章目录提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
- 格式化I/O
- 格式化输出
- 格式控制字符串format
- 格式化输入
- I/O缓冲
- 总结
格式化I/O
在前面的编写的测试代码中,会经常使用到库函数,printf()用于输出程序中的打印信息,printf()函数可将格式化数据写入到标准输出,所以通常称为格式化输出。除了printf()之外,格式化输出还包括:fprintf()、dprintf()、sprintf()、snprintf()这4个库函数。与之对应的格式化输入包括scanf()、fscanf()、sscanf()这三个库函数。
格式化输出C库函数提供了5个格式化输出函数,包括:printf()、fprintf()、dprintf()、sprintf()、snprintf(),其函数定义如下所示:
#includeint printf(const char *format, ...); int fprintf(FILE *stream, const char *format, ...); int dprintf(int fd, const char *format, ...); int sprintf(char *buf, const char *format, ...); int snprintf(char *buf, size_t size, const char *format, ...);
能够看到,这5个函数都是可变参数函数,他们有一个共同的参数format,format是一个字符串——格式控制字符串,用于制定后续的参数如何进行格式转换。所以对于这些函数来说主要的就是学习如何掌握这个格式控制字符串的format的书写格式。
printf()函数用于将格式化数据写入到标准输出;
dprintf()和fprintf()函数用于将格式化数据写入到指定的文件中,两者不同之处在于,fprintf()使用FILE指针指定对应的文件、而dprintf()则使用文件描述符fd指定对应的文件;
sprintf()、snprintf()函数可将格式化的数据存储在用户指定的缓冲区buf中。
1、printf()函数
printf("Hello World!n");
2、fprintf()函数
fprintf()可将格式化数据写入到由FILE指针指定的文件中
fprintf(stderr, "Hello World!n");
3、dprintf()函数
dprintf()可将格式化数据写入到由文件描述符fd指定的文件中,譬如将字符串“Hello World”写入到标准错误:
dprintf(STDERR_FILENO, "Hello World!n");
4、sprintf()函数
sprintf()函数将格式化数据存储在参数buf所指定的缓冲区中。
char buf[100]; sprintf(buf, "Hello World!n");
更为常见的是这种用法,使用这个函数进行格式转换,将转换后的字符放在缓冲区。如下所示将数字100转换为字符串100放在buf中。
char buf[20] = {0}; sprintf(buf, "%d", 100);
sprintf()函数会在字符串尾端自动加上一个字符串终止字符‘ ’。
5、snprintf()函数
sprintf()函数可能会发生缓冲区溢出的问题,存在安全隐患。引入了snprintf()函数,在该函数中,使用参数size显式的指定缓冲区的大小,如果写入到缓冲区的字节数大于参数size指定的大小,超出的部分将会被丢弃!如果缓冲区空间足够大,snprintf()函数就会返回写入到缓冲区的字符数,与sprintf()函数相同,也会在字符串末尾自动添加终止字符’ ’。
是一个以字符串的形式来控制后续变参格式的转换。
格式控制字符串由两部分组成,普通字符(非%字符)和转换说明。普通字符会进行原样输出。
%[flags][width][.precision][length]type
flags:标志
width:输出最小宽度
precision:精度,前面有一个小数点“.”
length:长度修饰符
type:转换类型,指定转换数据的类型
常用的转换类型:
d o u x f e g s p c
flags:
# type为o时,输出字符串加前缀0;输出字符串为x时,输出字符串前加前缀0x
0 当输出数字时,在输出的字符串前面补0
- 默认右对齐,使用-标志变成左对齐,然后右边补空格
’ ’ 输出正数时,在前面加空格,负数时在前面加一个-号
- 输出正数默认没有+号,使用了标志+后,输出的数字都带有符号(正数为+,负数为-)
C库函数提供了3个格式化输入函数,包括:scanf()、fscanf()、sscanf(),其函数定义如下所示:
#includeint scanf(const char *format, ...); int fscanf(FILE *stream, const char *format, ...); int sscanf(const char *str, const char *format, ...);
1、scanf()函数
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
2、fscanf()函数
fscanf()函数从指定文件中读取数据,作为格式转换的输入数据,文件通过FILE指针指定,所以它有两个固定参数,FILE指针和格式控制字符串format。譬如从标准输入文件中读取数据进行格式化转换:
int a, b, c; fscanf(stdin, "%d %d %d", &a, &b, &c);
3、sscanf()函数
sscanf()将从参数str所指向的字符串缓冲区中读取数据,作为格式转换的输入数据,所以它也有两个固定参数,字符串str和格式控制字符串format,譬如:
char *str = "5454 hello"; char buf[10]; int a; sscanf(str, "%d %s", &a, buf);I/O缓冲
出于速度和效率的考虑,系统I/O调用(即文件I/O,open、read、write等)和标准C语言库I/O函数(即标准I/O函数)在操作磁盘文件时会对数据进行缓冲
总结基础部分的内容应该相应掌握,关于I/O缓冲,进阶知识,用到的时候在详细了解吧,这里仅给出并未深入研究。



