文档操作open,read,wirte,lseek,stat,lstat
-
open函数的定义和参数
我们首先来看下open函数在Linux下的定义://需要使用到的头文件
#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);
头文件:
如上所示,我们在使用open函数时候需要添加的头文件是#include <sys/types.h>//这里提供类型pid_t和size_t的定义 #include <sys/stat.h> #include <fcntl.h>
返回值
open函数的返回值如果操作成功,它将返回一个文件描述符,如果操作失败,它将返回-1。参数含义:
1、pathname:
在open函数中第一个参数pathname是指向想要打开的文件路径名,或者文件名。我们需要注意的是,这个路径名是绝对路径名。要是直接给文档名称,文档名则是在当前路径下的。2、flags:
flags参数表示打开文件所采用的操作,我们需要注意的是:必须指定以下三个常量的一种,且只允许指定一个O_RDONLY:只读模式
O_WRONLY:只写模式
O_RDWR:可读可写
以下的常量是选用的,这些选项是用来和上面的必选项进行按位或起来作为flags参数。O_APPEND 表示追加,如果原来文件里面有内容,则这次写入会写在文件的最末尾。
O_CREAT 表示如果指定文件不存在,则创建这个文件
O_EXCL 表示如果要创建的文件已存在,则出错,同时返回 -1,并且修改 errno 的值。
O_TRUNC 表示截断,如果文件存在,并且以只写、读写方式打开,则将其长度截断为0。
O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端。
O_NONBLOCK 如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设置为非阻塞模式(nonblocking mode)
以下三个常量同样是选用的,它们用于同步输入输出O_DSYNC 等待物理 I/O 结束后再 write。在不影响读取新写入的数据的前提下,不等待文件属性更新。
O_RSYNC read 等待所有写入同一区域的写操作完成后再进行
O_SYNC 等待物理 I/O 结束后再 write,包括更新文件属性的 I/O
3、mode:
mode参数表示设置文件访问权限的初始值,和用户掩码umask有关,比如0644表示-rw-r–r–,也可以用S_IRUSR、S_IWUSR等宏定义按位或起来表示,详见open(2)的Man Page。要注意的是,有以下几点文件权限由open的mode参数和当前进程的umask掩码共同决定。
第三个参数是在第二个参数中有O_CREAT时才作用,如果没有,则第三个参数可以忽略 - read函数:
#include <unistd.h> ssize_t read(int fd, void *buf, size_t count);
头文件:
包含的头文件为unistd.h
返回值:
>0:表示返回读到buff的长度
=0:表示读到了最后一个元素,应该结束了
-1:表示没有读到fd所指的文件
参数:
fd:需要读取的文件的描述符
buff:要把读取的数据放入到这个buff中
count:一次性读取多少的字符到buff,一般用sizeof(buff) - wirte
#include <unistd.h> ssize_t write(int fd, const void *buf,size_t count);
可以配合read使用,看一下的拷贝过程就知道了:
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include<stdio.h> #include <unistd.h> int main(){
//打开需要拷贝的文件 int srcfd = open("a.txt",O_RDONLY); if(srcfd==-1){ perror("open"); return -1; } //创建一个新的文件(也就是拷贝到那里去) int desfd = open("copy.txt",O_WRONLY|O_CREAT,0664); if(desfd==-1){ perror("open"); return -2; }
//建立一个缓冲区 char buff[1024]={0}; int len;
//读取拷贝文件的数据,将其拷贝到创建的新文件"copy.txt" while((len=read(srcfd,buff,sizeof(buff)))){ write(desfd,buff,len); }
//关闭两个描述符,释放这两个描述符,因为描述符数组的大小是一定的 close(desfd); close(srcfd); return 0; } - lseek函数:
lseek函数用于设置文件偏移量。
每个打开的文件都有一个与其相关联的“当前文件偏移量”(current file offset)。它通常是一个非负整数,用以度量从文件开始处计算的字节数。通常,读写操作都从当前文件偏移量处开始,并使偏移量增加所读写的字节数。按系统默认的情况,当打开一个文件时,除非制定O_APPEND选项,否则该偏移量被设置为0。
#include<unistd.h> off_t lseek(int filedes, off_t offset, int whence);
对参数offset 的解释与参数whence的值有关。
- 若whence是SEEK_SET,则文件偏移量设置为距文件开始处 offset个字节。
- 若whence是SEEK_CUR,则文件偏移量设置为当前值加 offset,offset可为正或负。
- 若whence是SEEK_END,则文件偏移量设置为文件长度加 offset,offset可为正或负。
若lseek成功执行,则返回新的文件偏移量,为此可以用下列方式确定打开文件的当前偏移量:
off_t currpos; currpos = lseek(fd, 0,SEEK_CUR);
这种方法也可用来确定所涉及的文件是否可以设置偏移量。如果文件描述符引用的是一个管道,FIFO或网络套接字,则lseek返回 -1,并将errno设置为ESPIPE。
- lseek函数的一般作用:
作用1:lseek(fd,0,SEEK_SET);//移动文件指针到文件头 作用2:lseek(fd,0,SEEK_CUR);//返回现在文件只指针的位置
作用3:lseek(fd,0,SEEK_END);//返回现在文件的大小
作用3:lseek(fd,100,SEEK_END);//将文件的大小往下扩容100b- stat函数:
/*
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>int stat(const char *pathname, struct stat *statbuf);
作用:获取一个文件相关的一些信息
参数:
- pathname:操作的文件的路径
- statbuf:结构体变量,传出参数,用于保存获取到的文件的信息
返回值:
成功:返回0
失败:返回-1 设置errnoint lstat(const char *pathname, struct stat *statbuf);
参数:
- pathname:操作的文件的路径
- statbuf:结构体变量,传出参数,用于保存获取到的文件的信息
返回值:
成功:返回0
失败:返回-1 设置errno*/
#include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <stdio.h> int main() { struct stat statbuf; int ret = stat("a.txt", &statbuf); if(ret == -1) { perror("stat"); return -1; } printf("size: %ld\n", statbuf.st_size); return 0; }

浙公网安备 33010602011771号