APUE-读和写流

东阳的学习笔记

1. 输入函数

一但打开了流,则可在3种不同类型的非格式化I/O中进行选择,对其进行读、写操作。

  1. 每次一个字节的I/O,一次读或者写一个字符,如果流是带缓冲的,则标准I/O流处理所有缓冲
  2. 每次一行的I/O。如果想要一次读或者写一行,则使用 fgets 和 fputs 。没行都以一个换行符终止。当调用 fgets 时,应说明能处理的最大行数
  3. 直接I/O。fread和fwrite函数支持这种类型的I/O。常用于从二进制文件中每次读或者写一个结构

在大多数实现中,为每个流在 FILE 对象中维护了两个标志:

  • 出错标志
  • 文件结束标志

调用 clearerr可以清除这两个标志
从流中读取数据后,可以调用 ungetc 将字符再压送回流中

2. 输出函数:

int putc(int c, FILE *fp);
int fputs(int c, FILE *fp);
int putchar(int c);

与输入函数一样,putchar© 等同于 putc(c, stdout),putc 可被实现为宏,而 fputc 不能实现为宏

每次一行 I/O

char *fgets(char *restrict buf, int n, FILE *restrict fp);
char *gets(char *buf);

fgets必须,必须指定缓冲区的长度n,此函数一直读到下一个换行符为止,单是不超过 n -1 个字符。

gets() 是一个不推荐使用的函数。其问题在于调用着调用 gets 时不能指定缓冲区的长度,这样就有可能造成缓冲区溢出,写到缓冲区之后的储存空间里,从而产生不可预料的后果。

int fputs(const char *restrict str, FILE *restrict fp);
int puts(const char *str);

函数 fputs() 将一个以 null 字节终止的字符串写道指定的流,尾端的终止符 null 不写出。通常,在 null 字节之前是一个换行符,但并不要求总是如此。

puts() 将一个以 null 结尾的字符串写到标准输出,终止符不写出,但是,puts随后又将一个换行符写到标准输出。

puts() 并不像gets()一样不安全。但是我们还是应该避免使用它,以免需要记住它是否在最后添加了一个换行符。

猜你喜欢

转载自blog.csdn.net/qq_22473333/article/details/114365419