UNIX环境高级编程——第五章 标准I/O库

5.1 引言

5.2 流与FILE对象

5.3 标准输入、标准输出和标准出错

  • 这三个标准I/O流通过预定义文件指针stdin,stdout和stderr加以引用。这三个文件指针同样定义在头文件<stdio.h>

5.4 缓存

缓存类型 缓存说明
全缓存 当填满标准I/O缓存后才进行实际I/O操作(一般用于放在磁盘上的文件)
行缓存 当输入和输出中遇到新行符时,标准I/O库执行I/O操作
不带缓存 标准I/O库不对字符进行缓存(标准错误流stderr通常不带缓存)
  • 当且仅当标准输入和标准输出并不涉及交互作用设备时,它们才是全缓存的
  • 标准出错绝不会是全缓存的

更改缓存类型的函数:0表示成功,非0表示失败

#include <stdio.h>
void setbuf(FILE *fp, char *buf);
int setvbuf(FILE *fp, char *buf, int mode, size_t size);

在这里插入图片描述

#include <stdio.h>
int fflush(FILE* fp);

fflush函数可以强制刷新一个流

5.5 打开流

#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);

在这里插入图片描述

5.6 读和写流

  1. 每次一个字符的I/O:用fgetc和fputc函数
  2. 每次一行的I/O:用fgets和fputs一次读或写一行,每行都已一个新行符终止;
  3. 直接I/O:fread和fwrite函数支持这种类型的I/O;

5.6.1 输入函数

  1. 以下三个函数可用于一次读一个字符:成功返回下一个字符,读到尾端或出错则为EOF

    • getc的参数不应当是具有副作用的表达式(副作用的意思就是表达式的执行会影响表达式中的参数)
    • 因为fgetc一定是个函数,所以可以得到器地址
    • 调用fgetc所需时间很可能长于调用getc
#include <stdio.h>
int getc(FILE *fp);
int fgetc(FILE *fp);
int getchar(void);
  1. 调用ferror或feof函数可以区分出错还是到达文件尾端:若条件为真则返回非0,否则返回0
#include <stdio.h>
int ferror(FILE *fp);
int feof(FILE *fp);
void clearerr(FILE *fp);
  1. clearerr函数清除两个标志
  2. 从一个流读之后,可以调用ungetc将字符再送回流中
#include <stdio.h>
int ungetc(int c, FILE *fp);

5.6.2 输出函数

  1. 以下每个函数可以输出一个字符:与输入函数对应
#include <stdio.h>
int putc(int c, FILE *fp);
int fpuc(int c, FILE *fp);
int putchar(int c);

5.7 每次一行I/O

#include <stdio.h>
char *fgets(char *buf, int n, FILE *fp);
char *gets(char *buf);
  1. gets从标准输入读,儿fgets则从指定的流读
  2. fgets,必须指定缓存的长度n
  3. gets是一个不推荐使用的函数
#include <stdio.h>
int fputs(const char *str, FILE *fp);
int puts(const char *str);
  1. fputs 函数将一个以null符终止的字符串写到指定的流,终止符null不写出;注意:这并不一定是每次输出一行;
  2. puts将一个以null符终止的字符串写到标准输出,终止符不写出;但是,puts然后又将一个新行符写到标准输出;
  3. puts也最好不要用;

5.8 标准I/O的效率

5.9 二进制I/O

执行二进制I/O操作的函数:

#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nobj, FILE* fp);
size_t fwrite(const void *ptr, size_t size, size_t nobj, FILE *fp);

5.10 定位流

  1. ftell和fseek
  2. fgetpos和fsetpos:需要一直到非unix系统上运行的应用程序应当使用这组函数
#include <stdio.h>
long ftell(FILE *fp); 成功返回当前位置,出错返回-1
int fseek(FILE *fp, long offset,int whence); 成功返回0,出错返回非0
void rewind(FILE *fp);
int fgetpos(FILE *fp, fpos_t *pos);
int fsetpos(FILE *fp, const fpos_t *pos);

5.11 格式化I/O

5.11.1 格式化输出

#include <stdio.h>
int printf(const char *format, ...);
int fprintf(FILE *fp, const char *format, ...);
										两个函数返回:若成功则为输出字符数,若输出出错则为负值
int sprintf(char *buf, const char *format, ...);
										返回:存入数组的字符数

5.11.2 格式化输入

#include <stdio.h>
int scanf(const char *format, ...);
int fscanf(FILE *fp, const char *format, ...);
int sscanf(const char *buf, const char *format, ...);

5.12 实现细节

每个I/O流都有一个与其相关联的文件描述符,可以对一个流调用fileno以获得其描述符

#include <stdio.h>
int fileno(FILE *pf);

猜你喜欢

转载自blog.csdn.net/u012850592/article/details/103088073