1、缓冲
•
文件指针:
stdin
、
stdout
、
stderr
•
缓冲方式:全缓冲、行缓冲、无缓冲
•
可以通过
setbuf
()
或
setvbuf
()
更改缓冲方式
•
int
fflush
(FILE *
fp
);
刷新缓冲区
2、打开/关闭流
•
FILE *
fopen
(
const
char *pathname,
const
char *type);
打开一个指定的文件
•
FILE *
freopen
(
const
char *pathname,
const
char *type, FILE *
fp
);
打开一个指定的文件,重新关联fp,通常用于重定向
•
FILE *
fdopen
(
int
filedes
,
const
char *type);
操作文件描述符,转换为文件指针
•
同时以读写方式打开文件时:
一个输出操作不能紧跟一个输入操作,其间必须加入fflush,fseek,fsetpos, 或rewind
一个输入操作不能紧跟一个输出操作,其间必须加入fseek,fsetpos,或 rewind
•
int
fclose
(FILE *
fp
); //
关闭流
3、读/写操作
•
int
getc
(FILE *
fp
);
int
fgetc
(FILE *
fp
);
int
getchar
(void);
每次读入一个字符,注意函数的返回值类型,不要使用char。
getc与fgetc的区别:
getc可能是宏,它的参数不能是带有副作用的表达式;
fgetc必须是函数(可以使用它的地址);
getc可能比fgetc更快;
•
int
ferror
(FILE *
fp
); //
错误检测
•
int
feof
(FILE *
fp
); //
是否到达文件结尾
•
int
ungetc
(
int
c, FILE *
fp
); //
回送一个字符
•
int
putc
(
int
c, FILE *
fp
); //
输出一个字符
•
int
fputc
(
int
c, FILE *
fp
); //
输出一个字符
•
int
putchar
(
int
c); //
输出一个字符到
stdout
4、每次读写一行
•
char *
fgets
(char *
buf
,
int
n, FILE *
fp
);
读取一行,最多n - 1个字符
不推荐使用gets()
•
int
fputs
(
const
char *
str
, FILE *
fp
);
并不自动添加换行符
5、二进制I/O
•
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
);
•
二进制
I/O
需要注意:
通常只能读取在同一台机器上生成的文件;
更严格的说,只能读取同一个程序生成的文件;
6、流的定位
•
long
ftell
(FILE *
fp
);
•
int
fseek
(FILE *
fp
,
long
offset,
int
whence);
•
rewind
()
•
off_t
ftello
(FILE *
fp
); // single
unix
标准
•
int
fseeko
(FILE *
fp
,
off_t
offset,
int
whence);
•
int
fgetpos
(FILE *
fp
,
fpos_t
*
pos
); // ISO C
•
int
fsetpos
(FILE *
fp
,
const
fpos_t
*
pos
);
•
三组函数支持的偏移量大小依次递增
7、实现细节
•
int
fileno
(FILE *
fp
);
•
获取文件指针对应的文件描述符
8、临时文件
•
char *
tmpnam
(char *
ptr
);
•
FILE *
tmpfile
(void);
tmpfile创建一个临时文件(类型w+),在关闭该文件或程序结束时将自动删除