IO作业 day3 6/25

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;
} 

你可能感兴趣的:(开发语言)