1、文件描述符
1)顺序分配的非负整数
2)内核用以标识一个特定进程正在访问的文件
3)其他资源(socket、pipe)的访问标识
2、标准输入、标准输出和标准出错
stdio stdout stderr
由shell默认打开,分别为 0\1\2
3、不用缓存的I\O
1)通过文件描述符进行访问
2)文件I\O: open read write close lseek
4、标准I\O
1) 通过FILE*进行访问
2)printf fprintf fopen fread fwrite fseek fclose
标准I\O 库由ANSIC标准说明。
标准I\O :
流和FILE对象:
标准I\O库的所有操作都是围绕流(stream)来进行的,在标准I\O中,流用FILE*来描述。
流(stream): 分为文本流和二进制流
文本流: 在处理中数据以字符出现。 "\n" -> CR blabla ....
二进制流:流中处理的是二进制序列。字符用ascii码表示。
文件缓冲:
缓冲文件系统(高级磁盘I\O):
目的:尽量减少文件I/O的调用
分类: 全缓冲、行缓冲(遇到"\n"输出)、不缓冲(stderr)
使用setbuf()和setvbuf()可以更改缓存类型,在任意时刻,可以使用fflush强制刷新一个数据流,使缓存数据刷新到内核。
非缓冲文件系统(低级磁盘I\O) 文件I/O没有缓存
依靠操作系统,通过操作系统的功能对文件进行读写,是系统级的输入输出。
标准流的一些操作: freopen函数支持文件流的重定向
FILE *fopen(const char *path, const char *mode);
FILE *fdopen(int fd, const char *mode);
FILE *freopen(const char *path, const char *mode, FILE *stream);
mode:
打开一个标准I/O流的六种不同方式:
限制 | r | w | a | r+ | w+ | a+ |
文件已经存在 | ? | ? | ||||
擦出文件以前的内容 | ? | ? | ||||
流可以读 | ? | ? | ? | ? | ||
流可以写 | ? | ? | ? | ? | ? | |
流只可在尾端处写 | ? | ? |
fopen要求文件具有0666的权限。 可以通过(0666 &~umask )修改文件的权限 ,或则在bash中使用chmod 命令。
ulimit -a 命令可以查看和修改最大文件数
fclose用于关闭一个已经打开的文件流:
fclose()调用成功返回0,失败返回EOF,并设置errno。
在该文件被关闭之前,刷新缓存中的数据。如果标准I/O库已经为该流自动分配了一个缓存,则释放此缓存。
当一个进程正常终止时(直接调用exit函数,或从main函数返回)则所有带未写缓存数据的标准I/O流都被刷新,所有打开的标准I\O流都被关闭。
读写流:
每次一个字符的I/O。fgetc()/fputc()
每次一行的I/O。fgets()feputs()。当调用fgets时,应说明能处理的最大行长
直接I/O。fread fwrite。可指定读写长度,常用于从二进制文件中读写一个结构
读写流结束判断:
feof()判断文件是否结束
检查文件出错函数;
#include <stdio.h>
void clearerr(FILE *stream);
int feof(FILE *stream);
int ferror(FILE *stream);
int fileno(FILE *stream)
定位流;
#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);
long ftell(FILE *stream);
void rewind(FILE *stream);
int fgetpos(FILE *stream, fpos_t *pos);
int fsetpos(FILE *stream, fpos_t *pos);