第五章 标准IO库(下)
一:每次一行IO
下面的两个函数提供每次输入一行IO的功能:
char *fgets(char *restrict buf, int n, FILE restrict fd);
char *gets(char *buf);
成功返回buf,失败返回NULL
这里我们并不推荐使用gets这个函数,因为他不指定读入缓冲区的数据大小,容易造成缓冲区溢出,当最后一行超过了缓冲区的长度的时候,就会出现该问题。
输出一行IO的函数有如下两个:
int fputs(const char *restrict buf, FILE restrict fd);
int puts(const char *str);
成功返回
puts函数也容易造成缓冲区溢出的问题,所以也要尽量避免使用。
二:二进制IO
在某些情况下,我们不希望在进行读取操作的时候遇到null就停止,而是希望一次性读取完;写的情况也是这样,这时就需要用到下面两个函数
size_t fread(void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp);
size_t fwrite(const void *restrict ptr, size_t size size_t nobj, FILE *restrict fp);
返回值:读或写的对象数
但是使用二进制IO还会遇到一个问题:对于同一个二进制文件,可能由于不同操作系统对偏移量的处理或者是对于浮点数的处理不一样导致一个二进制文件到了另一个系统就不可用了。
三:格式化IO
格式化的输出是由五个printf函数来处理的
printf使我们用的最多的一个格式化输出函数,它将格式化的数据写入到标准输出中;fprintf会写到指定的流;dprintf写到指定的文件描述符;sprintf写入到一个char 缓冲区中,它会自动的在末尾加入一个null,但是null不包含在返回的值中;snprintf规定了写入的大小,这是由于sprintf可能会由于buf缓冲区大小不够导致的缓冲区溢出问题,snprintf试图通过增加一个参数来解决这个问题。
格式化的输出是由一个%为开始的字符,后续可能跟着最多四中标志,标志如下
其中flags的可能值如下:
fldwidth说明了最小字段宽度,如果转换后参数字符数小于宽度,会用空格补充。字符宽度是一个非负的十进制整数,或者是
precision说明转换后最少的输出位数或者是浮点数小数点后的数字个数或者是字符串转换后的最大字节数。
lenmodifier说明参数长度,可能的值如下:
convtype是控制如何解释参数的,对应关系如下: