1.open
(1)案例
#include
int main(int argc, const char *argv[])
{
//定义文件描述符
int fd;
//打开文件
if((fd=open("./a.txt",O_WONLY|O_CREAT|O_TRUNC))==-1)
{
perror("open error");
return -1;
}
return 0;
}
(2)O_EXCI
#include
int main(int argc, const char *argv[])
{
//定义文件描述符
int fd;
//打开文件
if((fd=open("./a.txt",O_RDWR|O_CREAT|O_EXCL,0664))==-1)
{
//判断错误原因
//已存在文件,会将错误码置为EEXIST
if(errno==EEXIST)
{
printf("文件已经创建,无需重复创建\n");
fd=open("./a.txt",O_RDWR);
}
else
{
perror("open error");
return -1;
}
}
return 0;
}
2.close
#include
int main(int argc, const char *argv[])
{
//定义文件描述符
int fd;
//打开文件
if((fd=open("./a.txt",O_RDWR|O_CREAT|O_EXCL,0664))==-1)
{
//判断错误原因
//已存在文件,会将错误码置为EEXIST
if(errno==EEXIST)
{
printf("文件已经创建,无需重复创建\n");
fd=open("./a.txt",O_RDWR);
}
else
{
perror("open error");
return -1;
}
}
//关闭文件
if(close(fd)==-1)
{
printf("文件关闭失败!\n");
}
else
{
printf("文件关闭成功!\n");
}
return 0;
}
3.write、read
(1)案例
#include
int main(int argc, const char *argv[])
{
//定义文件描述符
int fd;
//打开文件
if((fd=open("./a.txt",O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
{
perror("open error");
return -1;
}
//定义容器存放数据
char str[128]="hello world";
//向文件中写入数据
write(fd,str,sizeof(str));
//关闭文件
close(fd);
//打开文件
if((fd=open("./a.txt",O_RDONLY))==-1)
{
perror("open error");
return -1;
}
char str1[12]="";
//从文件中读取数据
read(fd,str1,sizeof(str1)-1);
close(fd);
//输出读取的数据
printf("str1=%s\n",str1);
return 0;
}
(2)文件拷贝
#include
int main(int argc, const char *argv[])
{
//定义文件描述符
int fd,fd1,ret;
//打开文件
if((fd=open("./a.txt",O_RDONLY))==-1)
{
perror("open error");
return -1;
}
//打开文件
if((fd1=open("./b.txt",O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
{
perror("open error1");
return -1;
}
//定义容器存放数据
char str[128]="";
//将文件1的内容拷贝到文件2
while((ret=read(fd,str,sizeof(str)))>0)
{
write(fd1,str,ret);
}
return 0;
}
4.lseek
#include
int main(int argc, const char *argv[])
{
//定义文件描述符
int fd,fd1,ret;
//打开文件
if((fd=open("./a.txt",O_RDONLY))==-1)
{
perror("open error");
return -1;
}
//计算文件大小
printf("%ld\n",lseek(fd,0,SEEK_END));
return 0;
}
#include
int main(int argc, const char *argv[])
{
//定义文件描述符
int fd,fd1,ret;
//打开文件
if((fd=open("./m.bmp",O_RDONLY))==-1)
{
perror("open error");
return -1;
}
printf("文件大小%ld\n",lseek(fd,0,SEEK_END));
//移动光标
lseek(fd,2,SEEK_SET);
int image_size;
//获取bmp文件大小
read(fd,&image_size,sizeof(image_size));
printf("mouse.bmp=%ld",image_size);
//关闭文件
close(fd);
return 0;
}
5.关于文件描述符拷贝问题
(1)直接拷贝
#include
int main(int argc, const char *argv[])
{
//定义文件描述符
int fd,fd1,ret;
//打开文件
if((fd=open("./a.txt",O_RDWR|O_CREAT|O_TRUNC,0664))==-1)
{
perror("open error");
return -1;
}
//直接拷贝
fd1=fd;
write(fd,"hello",strlen("hello"));
//定义一个容器存放使用fd1读取的数据,如果能读取出来数据,说明不共享光标
//如果不能读取出来数据,则说明共享光标
char str[4]="";
read(fd1,str,sizeof(str));
//输出到终端
write(1,str,sizeof(str));
//关闭文件
if(close(fd)!=0)
{
perror("close fd error ");
return-1;
}
if(close(fd1)!=0)
{
perror("close fd1 error");
return -1;
}
return 0;
}
(2)dup拷贝
#include
int main(int argc, const char *argv[])
{
//定义文件描述符
int fd,fd1,ret;
//打开文件
if((fd=open("./a.txt",O_RDONLY))==-1)
{
perror("open error");
return -1;
}
//dup函数拷贝
fd1=dup(fd);
printf("fd1=%d\n",fd1);
//移动2个
lseek(fd,2,SEEK_SET);
//关闭文件
if(close(fd)!=0)
{
perror("close fd error ");
return-1;
}
//定义一个容器存放使用fd1读取的数据,如果读取hello,说明不共享光标
//如果读取llo,则说明共享光标
char str[4]="";
read(fd1,str,sizeof(str));
puts("");
//输出到终端
write(1,str,sizeof(str));
if(close(fd1)!=0)
{
perror("close fd1 error");
return -1;
}
return 0;
}
(3)多次使用open函数函数打开同一个文件,每次使用open函数,都会产生一个新的文件描述符,记录同一个文件的文件描述符,没有任何关系,也不共享同一光标
#include
int main(int argc, const char *argv[])
{
//定义文件描述符
int fd,fd1,ret;
//打开文件
if((fd=open("./a.txt",O_RDONLY))==-1)
{
perror("open error");
return -1;
}
if((fd1=open("./a.txt",O_RDONLY))==-1)
{
perror("open error");
return -1;
}
printf("fd=%d\n",fd);
printf("fd1=%d\n",fd1);
//移动2个
lseek(fd,2,SEEK_SET);
//关闭文件
if(close(fd)!=0)
{
perror("close fd error ");
return-1;
}
//定义一个容器存放使用fd1读取的数据,如果读取hello,说明不共享光标
//如果读取llo,则说明共享光标
char str[5]="";
read(fd1,str,sizeof(str));
puts("");
//输出到终端
write(1,str,sizeof(str));
if(close(fd1)!=0)
{
perror("close fd1 error");
return -1;
}
return 0;
}
(4)dup2
#include
int main(int argc, const char *argv[])
{
//定义文件描述符
int fd,fd1,ret;
//打开文件
if((fd=open("./a.txt",O_RDONLY))==-1)
{
perror("open error");
return -1;
}
if((fd1=open("./b.txt",O_RDONLY))==-1)
{
perror("open error");
return -1;
}
printf("fd=%d\n",fd);
printf("fd1=%d\n",fd1);
//都指向fd
dup2(fd,fd1);
//移动2个
lseek(fd,2,SEEK_SET);
//关闭文件
if(close(fd)!=0)
{
perror("close fd error ");
return-1;
}
//定义一个容器存放使用fd1读取的数据,如果读取hello,说明不共享光标
//如果读取llo,则说明共享光标
char str[5]="";
read(fd1,str,sizeof(str));
puts("");
//输出到终端
write(1,str,sizeof(str));
if(close(fd1)!=0)
{
perror("close fd1 error");
return -1;
}
return 0;
}
6.文件状态函数stat
#include
int main(int argc, const char *argv[])
{
struct stat sb;
stat("./a.txt",&sb);//获取状态
printf("inode:%ld\n",sb.st_ino);//iNode
printf("type:%#o\n",sb.st_mode&S_IFMT);//类型
printf("mode:%#o\n",sb.st_mode&0777);//权限
return 0;
}