open()函数
函数原型:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int creat(const char *pathname, mode_t mode);
open()函数用来打开一个文件,返回一个文件描述符。
linux下一切皆文件,默认打开标准输入、标准输出、错误输出,分别对应文件描述符0、1、2。当打开一个文件时,文件描述符编号依次从小到大,也就是从3开始(0、1、2没有关闭的情况下)。
creat()函数用于创建文件,一般不用.
O_TRUNC 调用 open 函数打开文件的时候会将文件原本的内容全部丢弃,文件大小变为 0。
open()函数参数说明:
- pathname:文件的路径名。
- flags:文件的打开模式,常用
O_RDONLY, O_WRONLY, O_RDWR
。 - mode(可选参数):给文件赋予相应权限,如0644。
返回值:
- 返回值类型:
int
- 调用成功时返回一个文件描述符
fd
- 调用失败时返回
-1
,并设置errno
read()函数
函数原型:
ssize_t read(int fd, void *buf, size_t count);
read() 从文件描述符 fd 中读取 count 字节的数据并放入从 buf开始的缓冲区中.
read() 函数参数说明:
- fd:文件描述符
- buf:存储读入数据的缓冲区。
- count:将要读入的数据的个数。用数组存放内容时,一般来说count就是数组的大小--buf.size()
返回值:
- 返回值类型是:
ssize_t
,32位机上等同于int
- > 0 : 实际读取的字节数(读取成功)
- = 0:读到文件末尾(对端关闭),返回0
- -1, errno == EAGAIN 或 EWOULDBLOCK: 非阻塞读设备文件,网络文件或者其它文件,且这个文件无数据。 ---这不是错误,是一个特殊场景。
- -1,errno != EAGAIN 或 EWOULDBLOCK: 真正的出错,可使用 perror() 打印出错信息。
补充:
read函数只是一个通用的读文件设备的接口。是否阻塞需要由设备的属性和设定所决定。一般来说,读字符终端、网络的socket描述字,管道文件等,这些文件的缺省read都是阻塞的方式。如果是读磁盘上的文件,一般不会是阻塞方式的。但使用锁和fcntl设置取消文件O_NOBLOCK状态,也会产生阻塞的read效果。
write()函数
函数原型:
ssize_t write(int fd, const void *buf, size_t count);
write 向文件描述符 fd 所引用的文件中写入 从 buf 开始的缓冲区中 count 字节的数据.
write()和read()操作是差不多的,形参都是相同的,函数名不同而已。
write() 函数参数说明:
- fd:文件描述符
- buf:要写入的数据缓冲区
- count:要写入内容的大小,大小不应该大于buf大小
返回值:
- 返回值类型为:
ssize_t
- 成功时返回写入的字节数
- 出错时返回EOF,读到文件末返回0
close()函数
函数原型:
int close(int fd);
函数参数:
- fd: 要关闭的文件描述符。
返回值:
- 关闭成功时返回0,出错时返回EOF 。
文件复制
打开文件–>读取源文件内容–>将内容写入目的文件–>关闭文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
#include<unistd.h>
#include<pthread.h>
int main(int argc, char* argv[])
{
int fd1, fd2; //定义两个文件描述符
fd1 = open(argv[1], O_RDONLY); //以只读的方式打开文件1
fd2 = open(argv[2], O_RDWR | O_CREAT | O_TRUNC, 0664); //以读写的方式打开文件2,如果文件2不存在就创建它,权限为664。下次再打开时,就把内容清空。
char buffer[1024]; //定义缓冲区
int read_size=0;
read_size = read(fd1, buffer, 1024); //1024是想读取的字节数,read_size是实际读取的字节数。
while(read_size !=0 ) //实际读取的字节数只要不为0,说明还没有读到文件尾。
{
write(fd2, buffer, read_size); //将实际读取的字节数read_size 送入要写入的文件fd2中。不一定读满1024
read_size = read(fd1, buffer, 1024); //接着读
}
close(fd1);
close(fd2);
return 0;
}
参考链接:
Linux开发——文件IO open、read、write、close函数的使用及实现文件复制