文件I/O

1、文件I/O——介绍
posix(可移植操作系统接口)定义的一组函数;
不提供缓冲机制,每次读写操作都引起系统调用;
核心概念是文件描述符;
Linux下, 标准I/O基于文件I/O实现。
2、文件I/O——文件描述符
每个打开的文件都对应一个文件描述符
文件描述符是一个非负整数。Linux为程序中每个打开的
文件分配一个文件描述符
文件描述符从0开始分配,依次递增。
文件IO操作通过文件描述符来完成
0, 1, 2 的含义:标准输入、标准输出、标准错误
3、文件I/O——open
open函数用来创建或打开一个文件:
#include <fcntl.h>
int open(const char *path, int oflag, …);
成功时返回文件描述符;出错时返回EOF。
打开文件时使用两个参数;
创建文件时第三个参数指定新文件的权限;
只能打开设备文件。
原型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进制表示法。
4、文件I/O——close
close函数用来关闭一个打开的文件:
#include <unistd.h>
int close(int fd);
成功时返回0;出错时返回EOF
程序结束时自动关闭所有打开的文件
文件关闭后,文件描述符不再代表文件
5、文件I/O——read
read函数用来从文件中读取数据:
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
成功时返回实际读取的字节数;出错时返回EOF
读到文件末尾时返回0
buf是接收数据的缓冲区
count不应超过buf大小
6、文件I/O——write
write函数用来向文件写入数据:
#include <unistd.h>
ssize_t write(int fd, void *buf, size_t count);
成功时返回实际写入的字节数;出错时返回EOF
buf是发送数据的缓冲区
count不应超过buf大小
7、文件IO——lseek
lseek函数用来定位文件:
#include <unistd.h>
off_t lseek(int fd, off_t offset, intt whence);
成功时返回当前的文件读写位置;出错时返回EOF
参数offset和参数whence同fseek完全一样
8、访问目录——opendir
opendir函数用来打开一个目录文件:
#include <dirent.h>
DIR *opendir(const char *name);
DIR是用来描述一个打开的目录文件的结构体类型
成功时返回目录流指针;出错时返回NULL
9、访问目录——readdir
readdir函数用来读取目录流中的内容:
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
struct dirent是用来描述目录流中一个目录项的结构体类型
包含成员char d_name[256]
成功时返回目录流dirp中下一个目录项;出错或到末尾时时返回NULL
10、访问目录——closedir
closedir函数用来关闭一个目录文件:
#include <dirent.h>
int closedir(DIR *dirp);
成功时返回0;出错时返回EOF
11、修改文件访问权限——chmod/fchmod
chmod/fchmod函数用来修改文件的访问权限:
#include <sys/stat.h>
int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);
成功时返回0;出错时返回EOF
root和文件所有者能修改文件的访问权限
12、获取文件属性——stat/lstat/fstat
stat/lstat/fstat函数用来获取文件属性:
#include <sys/stat.h>
int stat(const char *path, struct stat *buf);
int lstat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
成功时返回0;出错时返回EOF
如果path是符号链接stat获取的是目标文件的属性;而lstat获取的是链接文件的属性
13、文件属性——struct stat
struct stat是存放文件属性的结构体类型:
mode_t st_mode        类型和访问权限
uid_t st_uid               所有者id
uid_t st_gid               用户组id
off_t st_size              文件大小
time_t st_mtime        最后修改时间
14、文件类型——st_mode
通过系统提供的宏来判断文件类型:st_mode & 0170000
S_ISREG(st_mode)     0100000
S_ISDIR(st_mode)      0040000
S_ISCHR(st_mode)     0020000
S_ISBLK(st_mode)      0060000
S_ISFIFO(st_mode)     0010000
S_ISLNK(st_mode)      0120000
S_ISSOCK(st_mode)    0140000
15、文件访问权限——st_mode
通过系统提供的宏来获取文件访问权限:
S_IRUSR     00400    bit:8
S_IWUSR    00200         7
S_IXUSR     00100         6
S_IRGRP     00040         5
S_IWGRP    00020         4
S_IXGRP     00010         3
S_IROTH     00004         2
S_IWOTH    00002         1
S_IXOTH     00001         0

posted on 2019-03-25 15:41  三无蛮子  阅读(207)  评论(0编辑  收藏  举报

导航