APUE:标准I/O库(一)

标准I/O库

流和FILE对象

对于标准I/O库,操作都是围绕着流来进行的。fopen返回一个指向FILE对象的指针。

缓存

标准I/O提供了三种类型的缓存:

  1. 全缓存:当填满标准I/O缓存后才进行实际的I/O操作,对于再磁盘上的文件通常是使用全缓存的,缓存通过malloc来获得。

术语刷新说明标准I/O缓存的写操作。可以自动刷新也可以调用fflush来刷新一个流。再UNIX刷新有两种意思,一个是指将缓存写进磁盘中,再终端程序中,表示丢弃已在缓存中的数据。

  1. 行缓存:在输入输出时遇到换行符的时候,才执行I/O操作,主要用于终端。
  2. 不带缓存。通常用于stderr使得字符可以尽快显示出来。
#include <stdio.h>
void setbuf(FILE *fp, char *buf ) ;
int setvbuf(FILE *fp, char *buf, int mode, size_t size) ;
返回:若成功则为0,若出错则为非0

该函数可以改变流的缓存类型,前提是流必须是打开的。

在这里插入图片描述
如果在一个函数中分配一个自动变量类的标准I/O缓存,则从该函数返回之前,必须关闭该流。

#include<stdio.h >
int fflush(FILE *fp) ;
返回:若成功则为0,若出错则为EOF

此函数使该流所有未写的数据都被传递至内核。作为一种特殊情形,如若 fp是NULL,则此函数刷新所有输出流。

打开流

#include <stdio.h>
FILE *fopen(const char *pathname, const char *type) ;
FILE *freopen(const char *pathname, const char *type, FILE *fp) ;
FILE *fdopen(int filedes, const char *type) ;
三个函数的返回:若成功则为文件指针,若出错则为NULL
  • fopen通过路径打开流。
  • freopen指定所打开的流,如果已打开则先关闭,通常用于标准输入输出和错误。
  • fdopen通过一个文件描述符来关联到相应的流来进行操作。

在这里插入图片描述
在这里插入图片描述
注意,在指定w或a类型创建一个新文件时,我们无法说明该文件的存取许可权位。
除非流引用终端设备,否则按系统默认,它被打开时是全缓存的。若流引用终端设备,则
该流是行缓存的。一旦打开了流,那么在对该流执行任何操作之前,如果希望,则可使用前节
所述的setbuf和setvbuf改变缓存的类型。

#include <stdio.h>
int fclose(FILE *fp) ;
返回:若成功则为0,若出错则为EOF

用于关闭一个流

  • 在该文件被关闭之前,刷新缓存中的输出数据。缓存中的输入数据被丢弃。如果标准I/O库已经为该流自动分配了一个缓存,则释放此缓存。
  • 当一个进程正常终止时(直接调用exit函数,或从main函数返回),则所有带未写缓存数据的标准I/O流都被刷新,所有打开的标准I/O流都被关闭。

读和写流

  1. 每次一个字符的I/O。
  2. 每次一行的I/O。
  3. 直接I/O。

输入函数

#include <stdio.h>
int getc(FILE *fp) ;
int fgetc(FILE *fp) ;
int getchar(void);
三个函数的返回:若成功则为下一个字符,若已处文件尾端或出错则为EOF

getchar等同于getc(stdin)。前两个函数的区别是getc可被实现为宏,而fgetc则不能实现为宏。所有fgetc可以作为一个参数传送给另一个函数。

#include <stdio.h>
int ferror(FILE *fp) ;
int feof(FILE *fp) ;
两个函数返回:若条件为真则为非 0(真),否则为0(假)
void clearerr(FILE *f p) ;

输出函数

#include <stdio.h>
int putc(int c, FILE *fp ) ;
int fputc(int c, FILE *fp);
int putchar(int c) ;
三个函数返回:若成功则为 C,若出错则为EOF

使用方式与输入函数类似

每次一行I/O

#include <stdio.h>
char *fgets(char *buf, int n,FILE * fp) ;
char *gets(char *buf) ;
两个函数返回:若成功则为buf,若已处文件尾端或出错则为NUL

gets从标准输入读,fgets从指定的流读,不推荐使用gets,不能指定缓存长度,容易越界,且gets不将新行符存入缓存。

#include <stdio.h>
int fputs(const char *str, FILE *fp) ;
int puts(const char *str) ;
两个函数返回:若成功则为非负值,若出错则为EOF

puts会将新行符写到标准输出

puts并不像它所对应的gets那样不安全。但是我们还是应避免使用它,以免需要记住它在最后又加上了一个新行符。如果总是使用fgets和fputs, 那么就会熟知在每行终止处我们必须自己加一个新行符。

发布了18 篇原创文章 · 获赞 0 · 访问量 295

猜你喜欢

转载自blog.csdn.net/weixin_42162340/article/details/94555910