1,标准IO和文件IO的区别
类别 | 标准IO | 文件IO |
---|---|---|
标准规范 | C标准:ANSI C | 操作系统规范:POSIX(可移植操作系统接口) |
读写实现 | 缓冲机制:先操作缓冲区,后操作实际文件,以减少系统调用次数,提高访问效率 | 无缓冲:每次读写都执行系统调用,读写相应文件 |
描述一个打开的文件 | 流,FILE结构体 | 文件描述符fd |
应用 | 只能访问普通文件或终端文件 | 可以访问不同类型文件(如Linux里的七种文件类型) |
关系 | 基于文件IO实现的,在文件IO的基础上封装了一个缓冲机制 | 偏下层 |
2,文件描述符
- 每个打开的文件都对应一个文件描述符
- 文件描述符是一个非负整数。 Linux为程序中每个打开的文件分配一个文件描述符
- 文件描述符从0开始分配, 依次递增。
- 文件IO操作通过文件描述符来完成
- 当程序运行的时候,系统会默认打开3个流:标准输入、标准输出、标准错误,所对应的文件描述符分别是0、1、2
3,open()函数
#include <fcntl.h>
int open(const char *path, int oflag, …);
- 成功时返回文件描述符; 出错时返回EOF
- 打开文件时使用两个参数
- 创建文件时第三个参数指定新文件的权限
- 只能通过open()打开设备文件,不能通过open()创建设备文件
原型 | int open(const char *pathname, int flags, mode_t mode); | ||
---|---|---|---|
参数 | pathname | 被打开的文件名(可包括路径名) 。 | |
flags | O_RDONLY: 只读方式打开文件 | 这三个参数互斥 | |
O_WRONLY: 可写方式打开文件。 | |||
O_RDWR: 读写方式打开文件。 | |||
O_CREAT: 如果该文件不存在,就创建一个新的文件,并用第三的参数为其设置权限。 | |||
O_EXCL: 如果使用O_CREAT时文件存在, 则可返回错误消息。 这一参数可测试文件是否存在。 | |||
O_NOCTTY: 使用本参数时, 如文件为终端, 那么终端不可以作为调用open()系统调用的那个进程的控制终端。 | |||
O_TRUNC: 如文件已经存在, 那么打开文件时先删除文件中原有数据。 | |||
O_APPEND: 以添加方式打开文件, 所以对文件的写操作都在文件的末尾进行。 | |||
mode | 被打开文件的存取权限, 为8进制表示法。 |
open()示例
- 以只写方式打开文件1.txt。 如果文件不存在则创建, 如果文件存在则清空:
int fd;
if ((fd = open(“1.txt”, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0) {
perror(“open”);
return -1;
}
- 以读写方式打开文件1.txt。 如果文件不存在则创建, 如果文件存在则报错:
int fd;
if ((fd = open(“1.txt”, O_RDWR|O_CREAT|O_EXCL, 0666)) < 0) {
if (errno == EEXIST) {
perror(“exist error”);
}
else {
perror(“other error”);
}
}
4,close()函数
#include <unistd.h>
int close(int fd);
- 成功时返回0; 出错时返回EOF
- 程序结束时自动关闭所有打开的文件
- 文件关闭后, 文件描述符不再代表文件