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