IO进程线程 DAY3作业

1.使用文件IO实现对图片的读写操作

①图片拷贝

#include <head.h>
int main(int argc, const char *argv[])
{
	//判断文件是否为3个
	if(argc != 3)
	{
		printf("Input File Error\n");
		printf("usage:a;out srcfile dstfile\n");
		return -1;
	}

	//定义两个文件描述符
	int srcfd = -1;
	int dstfd = -1;

	//分别以只读形式打开源文件,以只写形式打开目标文件
	if((srcfd = open(argv[1],O_RDONLY)) == -1)
	{
		perror("srcfd open error");
		return -1;
	}
	if((dstfd = open(argv[2],O_WRONLY | O_CREAT | O_TRUNC,0664)) == -1)
	{
		perror("dstfd open error");
		return -1;
	}
	//定义一个读取字符容器
	char rbuf[128]="";
	int res = 0;
	
	while((res = read(srcfd,rbuf,sizeof(rbuf))) != 0)
	{
		write(dstfd,rbuf,res);
	}

	//关闭文件描述符
	close(srcfd);
	close(dstfd);

	printf("拷贝成功\n");
	return 0;
}

 ②读取图片大小

#include <head.h>
int main(int argc, const char *argv[])
{
	//定义文件描述符
	int fd = -1;
	//以读写形式打开图片文件
	if((fd = open("./R-C.bmp",O_RDWR)) == -1)
	{
		perror("open error");
		return -1;
	}

	//读取图片文件的大小
	int bmpsize = 0;
	lseek(fd,2,SEEK_SET);  //向后两个字节大小
	read(fd,&bmpsize,sizeof(int));
	printf("%d\n",bmpsize);	



	//关闭文件描述符
	close(fd);

	return 0;
}

③图片部分裁切

#include <head.h>
int main(int argc, const char *argv[])
{
	//定义文件描述符
	int fd = -1;
	//以读写形式打开图片文件
	if((fd = open("./R-C.bmp",O_RDWR)) == -1)
	{
		perror("open error");
		return -1;
	}


	//向后偏移54个字节,进入编辑
	lseek(fd,54,SEEK_SET);

	//循环长和宽,改变颜色
	char color[3]={255,255,255};    //定义一个白色
	for(int i=0 ; i<60 ; i++)
	{
		for(int j=0 ; j<1920 ; j++)
		{
			write(fd,color,sizeof(color));
		}
	}

	//关闭文件描述符
	close(fd);

	return 0;
}

2.使用stat函数实现ls-l的功能

#include <head.h>
int main(int argc, const char *argv[])
{
	//判断终端输入文件是否为2个
	if(argc != 2)
	{
		printf("Input File Error\n");
		printf("usage:a.out dstfle\n");
		return -1;
	}

	//定义文件结构体变量用于接收文件信息;
	struct stat data;
	if(( stat(argv[1],&data)) == -1 )
	{
		perror("stat error");
		return -1;
	}

	//如果执行到这里,说明data结构体变量中已经存储目标文件信息
	char file_type;
	switch(data.st_mode & S_IFMT)
	{
	case S_IFSOCK:
			file_type = 's';
			break;
	case S_IFLNK:
			file_type = 'l';
			break;
	case S_IFREG:
			file_type = '-';
			break;
	case S_IFBLK:
			file_type = 'b';
			break;
	case S_IFDIR:
			file_type = 'd';
			break;
	case S_IFCHR:
			file_type = 'c';
			break;
	case S_IFIFO:
			file_type = 'p';
			break;
	}
	//定义时间指针,取消ctime后面的换行符
	char *t=ctime(&data.st_atime);
	if(t[strlen(t)-1] == '\n')
		t[strlen(t)-1] = '\0';

	//输出文件信息
	printf("%c%#o %ld %d %d %ld %s %s\n",file_type,data.st_mode&0777,data.\
			st_nlink,data.st_uid,data.st_gid,data.st_size,t,argv[1]);

	return 0;
}

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值