- open
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
功能:
打开文件
参数:
@pathname --- 文件名
@flags
必选:
O_RDONLY
O_WRONLY
O_RDWR
附加:
O_APPEND //追加 ---写
O_CREAT //创建
O_TRUNC //截断
@mode
表示创建文件的权限 --- 只有前面有O_CREAT时,才需要指定
0777
0666
返回值:
成功 返回文件描述符
失败 -1 &&errno
fopen("1.txt", "r") ---> open("1.txt",O_RDONLY);
fopen("1.txt","r+") ---> open("1.txt",O_RDWR);
fopen("1.txt", "w") ---> open("1.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);
fopen("1.txt","w+") ---> open("1.txt",O_RDWR|O_CREAT|O_TRUNC, 0666);
fopen("1.txt", "a") ---> open("1.txt",O_WRONLY|O_APPEND|O_CREAT, 0666);
fopen("1.txt","a+") ---> open("1.txt",O_RDWR|O_APPEND|O_CREAT, 0666);
//流指针 <----> 文件描述符
stdin 0
stdout 1
stderr 2
实际的文件权限:
- rw- r-- r--
110 100 100
6 4 4
mode & ~umask
110 110 110 mode
000 010 010 umask
111 101 101 ~umask
110 110 110 mode
& 111 101 101 ~umask
-----------------
110 100 100 //644
ssize_t read(int fd, void *buf, size_t count);
功能:
从fd对应文件中读取数据,读count个字节,存放到buf指定的一块空间
参数:
@fd 就是要读取的文件
@buf 存放数据的空间
@count 要读取的字节数
返回值;
成功 读取到的字节数
失败 -1 &&errno
练习:
cat //open + read
注意:
read读到的数据,如果要当作字符串处理,
注意,需要手动处理成字符串
ssize_t write(int fd, const void *buf, size_t count);
功能:
从buf中获得数据,写count个字节到 fd对应文件中
参数:
@fd 就是要写的文件
@buf 存放数据的空间
@count 要写入的字节数
返回值;
成功 写入的字节数
失败 -1 &&errno
练习:
用read 和 write实现文件拷贝
lseek
off_t lseek(int fd, off_t offset, int whence);
功能:
将fd定位到从whence开始的offset的位置
参数:
@fd 文件
@offset 偏移量
@offset --- 偏移量
>0 //需要考虑参考点是否可以
<0
@whence --- 参考点
SEEK_SET //文件开头
SEEK_CUR //文件当前位置
SEEK_END //文件结尾
定位开头:
lseek(fd,0,SEEK_SET);
定位到末尾
lseek(fd,0,SEEK_END);
返回值:
成功 返回从文库开头到当前定位处的偏移量
失败 -1 && errno
//获得文件大小
off_t len = lseek(fd,0,SEEK_END); //off_t //long int型
创建空洞:
1.定位
2.写操作
write
练习:
输入一个文件,创建一个 同样大小的空洞文件
功能:
统计行数
fgets
日志
fd = open
read
fgets(fp);
fprintf()
write
标准IO --- FILE * fp
文件IO --- fd
FILE *fp ---> fd
int fileno(FILE *stream); //将FILE *fp 流指针转换为 fd
fd ---> FILE *fp
FILE *fdopen(int fd, const char *mode);
功能:
将 fd 对应文件打开 关联一个 FILE * 指针
fd = open("1.txt",O_RDONLY);
fdopen(fd,"r+");