华清远见作业第二十一天

使用文件IO完成对图像的读写操作

代码:

#include
#include 
#include 
#include   // 包含 open() 函数的头文件
#include  // 包含 read() 和 write() 函数的头文件
int main(int argc,const char *argv[])
{
    int fd_src = open("src.bmp", O_RDONLY);//以只读的形式打开图片
  	 if (fd_src ==-1) 
	 {
       		perror("open src:");
        	return -1;
         }

    // 创建新的图片文件
    int fd_dest = open("dest.bmp", O_CREAT | O_WRONLY, 0664);
	if (fd_dest ==-1) 
	{
	       	perror("open dest:");
        	close(fd_src); // 关闭原始图片文件
      	 	return -1;
    	}

    // 读取原始图片内容,并写入新的图片文件中
    char buf[1024];
    int num = 0;//读取数据的个数
    while ( (num = read(fd_src, buf, sizeof(buf)) ) >0) //循环读取
    {
        write(fd_dest, buf, num);
    }

    // 关闭两个文件
    close(fd_src);
    close(fd_dest);

    return 0;
}

运行效果:

华清远见作业第二十一天_第1张图片

使用stat函数实现ls -l指令功能

代码:

#include
#include
#include 
#include 
#include 
#include //对应getpwuid函数
#include //对应getgrgid函数
#include//对应ctime函数
int main(int argc, const char *argv[])
{
    //判断外部传参的个数
    if(argc != 2)
    {
        write(2, "input file error\n", strlen("input file error\n"));
        write(2, "usage:./a.out filename\n", strlen("usage:./a.out filename\n"));
        return -1;
    }

    //定义文件状态结构体变量,用于返回文件信息
    struct stat st;
    //调用函数,获取给定的文件状态
    if(stat(argv[1], &st) == -1)
    {
        perror("stat error");
        return -1;
    }
    char perms[11]={0};//用于保存文件类型和文件权限的字符串
    //如果程序执行到此,说明st中已经存放了指定文件的信息
    switch(st.st_mode&S_IFMT)
    {
    case S_IFSOCK:
        printf("这是一个套接字文件\n");
	perms[0] = 's';
        break;

    case S_IFLNK:
        printf("这是一个链接文件\n");
	perms[0] = 'l';
        break;


    case S_IFREG:
        printf("这是一个普通文件文件\n");
	perms[0] = '-';
        break;

    case S_IFBLK:
        printf("这是一个块设备文件文件\n");
	perms[0] = 'b';
        break;

    case S_IFDIR:
        printf("这是一个目录文件\n");
	perms[0] = 'd';
        break;

    case S_IFCHR:
        printf("这是一个字符设备文件\n");
	perms[0] = 'c';
        break;

    case S_IFIFO:
        printf("这是一个管道文件\n");
	perms[0] = 'p';
        break;
    default:
	printf("未知文件");
	perms[0]='?';
	break;
    }
	//判断文件访问权限
	//文件所有者
	perms[1] = (st.st_mode & S_IRUSR ? 'r' : '-');//读
	perms[2] = (st.st_mode & S_IWUSR ? 'w' : '-');//写
	perms[3] = (st.st_mode & S_IXUSR ? 'x' : '-');//执行
	//文件所有组
	perms[4] = (st.st_mode & S_IRGRP ? 'r' : '-');//读
	perms[5] = (st.st_mode & S_IWGRP ? 'w' : '-');//写
	perms[6] = (st.st_mode & S_IXGRP ? 'x' : '-');//执行
	//其他
	perms[7] = (st.st_mode & S_IROTH ? 'r' : '-');//读
	perms[8] = (st.st_mode & S_IWOTH ? 'w' : '-');//写
	perms[9] = (st.st_mode & S_IXOTH ? 'x' : '-');//执行

	// 硬连接数
	int linkNum = st.st_nlink;
	// 文件所有者
	char * fileUser = getpwuid(st.st_uid)->pw_name;//getpwuid函数通过id获得信息,
	// 文件所在组
	char * fileGrp = getgrgid(st.st_gid)->gr_name;
	// 文件大小
	long int fileSize = st.st_size;
    	// 获取修改的时间
    	char * time = ctime(&st.st_mtime);//时间网上找的
	// 去除回车换行
    	char mtime[512] = {0};
    	strncpy(mtime, time, strlen(time) - 1);
	//输出
	char buf[1024];
	sprintf(buf, "%s %d %s %s %ld %s %s", perms, linkNum, fileUser, fileGrp, fileSize, mtime, argv[1]);
	printf("%s\n", buf);
	
  /*  printf("文件权限为:%#o\n", st.st_mode&0777);   //得到文件权限
    printf("inode: %ld\n", st.st_ino);           //文件inode号
    printf("文件大小为:%ld\n", st.st_size);        //文件大小*/

    return 0;
}

运行效果:

还有许多问题比如时间是在网上找的,还有用户也是在网上找的

华清远见作业第二十一天_第2张图片

思维导图:

你可能感兴趣的:(华清远见作业,c语言)