ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

IO / day03 作业

2026/8/4 23:48:18 拓冰建站 浏览量
IO / day03 作业

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

代码

#include<myhead.h>int main(int argc, const char *argv[])
{int fd=-1;if((fd = open("./bird.bmp", O_RDWR)) == -1){perror("fopen error");return -1;}//读取该图片的大小,需要将光标向后偏移2个字节lseek(fd, 2, SEEK_SET);int bmpsize = 0;//读取出图片的大小read(fd, &bmpsize, sizeof(int));printf("bmpsize = %d\n", bmpsize);//前54字节是文件头和信息头所占空间//想要对图像内容进行读写操作//需要将光标向后偏移54字节后,再进行操作lseek(fd, 54, SEEK_SET);unsigned char color[3] = {255, 255, 255};      //定义一个颜色,白色for(int i=0; i<65; i++)     //外行{for(int j=0; j<1200; j++)   //内列{for (int k=0; k<3; k++){char c;read(fd, &c, sizeof(char));c=(c+32)%255;write(fd, &c, sizeof(char));}}}//关闭文件close(fd);return 0;
}

原图片

修改后图片

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

代码

#include <myhead.h>int main(int argc, const char *argv[])
{//1.define dir ptrDIR *dptr = NULL;//2.open directoryif( (dptr=opendir("./") )==NULL ){perror("opendir error ");}//3. define file ptrstruct dirent *fptr = NULL;//定义文件状态结构体struct stat st;size_t size;struct passwd *pwd=NULL;struct group *grp=NULL;//4.read files while((fptr=readdir(dptr))!=NULL){char filename[256]="./";strcat(filename, fptr->d_name);//printf("filename=%s\n", filename);//定义文件状态结构体struct stat st;//获取信息存放在结构体变量st里if( (stat(filename, &st))==-1 ){perror("stat error");return -1;}//file typeswitch (st.st_mode & S_IFMT) {case S_IFBLK:  printf("b"); break;case S_IFCHR:  printf("c"); break;case S_IFDIR:  printf("d"); break;case S_IFIFO:  printf("p"); break;case S_IFLNK:  printf("l"); break;case S_IFREG:  printf("-"); break;case S_IFSOCK: printf("s"); break;default:       printf("unknown?\n"); break;}//file accessint au=st.st_mode&0777;	//printf("au=%o\n", au);char crwx[9]="";char tmp[9]="";for(int i=0; i<3; i++){for(int j=1; j<=3; j++){char bit =(char) au&(01);if(bit==0){strcpy(tmp, "-");strcat(tmp, crwx);strcpy(crwx, tmp);}else if(bit==1 && (j%3)==1 ){strcpy(tmp, "x");strcat(tmp, crwx);strcpy(crwx, tmp);}else if(bit==1 && (j%3)==2 ){strcpy(tmp, "w");strcat(tmp, crwx);strcpy(crwx, tmp);}else if(bit==1 && (j%3)==0 ){strcpy(tmp, "r");strcat(tmp, crwx);strcpy(crwx, tmp);}au=au>>1;}		}printf("%s ", crwx);printf("%ld ", st.st_nlink);pwd=getpwuid(st.st_uid);printf("%s ", pwd->pw_name);grp=getgrgid(st.st_uid);printf("%s ", grp->gr_name);printf("%10ld ", st.st_size);struct tm *at = localtime(&(st.st_atime));printf("%2d %2d %02d:%02d:%02d ", at->tm_mon+1, at->tm_mday, at->tm_hour, at->tm_min, at->tm_sec);printf("%s\n", fptr->d_name);}return 0;
}

运行结果

ubuntu@ubuntu:~/embedded/04_io/day03$ ./a.out
drwxrwxr-x 5 ubuntu ubuntu       4096 12  5 17:12:30 ..
-rwxrwxr-x 1 ubuntu ubuntu      13000 12  5 21:01:30 a.out
-rw-rw-r-- 1 ubuntu ubuntu         77 12  5 15:36:06 11_dup.c
-rwxrwxrwx 1 ubuntu ubuntu         14 12  5 14:14:42 test.txt
-rw-rw-r-- 1 ubuntu ubuntu         14 12  5 14:29:39 test.bk
-rw------- 1 ubuntu ubuntu    2844054 12  5 20:58:46 bird_r.bmp
-rw-rw-r-- 1 ubuntu ubuntu        400 12  5 11:42:12 05_umask.c
-rw-rw-r-- 1 ubuntu ubuntu        240 12  5 10:46:58 02_open.c
-rw-rw-r-- 1 ubuntu ubuntu         91 12  5 14:48:38 09_lseek.c
-rw-rw-r-- 1 ubuntu ubuntu        109 12  5 15:02:35 10_fd_cpy.c
-rw-rw-r-- 1 ubuntu ubuntu       1007 12  5 20:53:17 12_hw_read_write.c
-rw-rw-r-- 1 ubuntu ubuntu        215 12  5 09:42:22 01_file_desc.c
-rw-rw-r-- 1 ubuntu ubuntu       2139 12  5 21:00:37 14_hw_stat.c
drwxrwxr-x 2 ubuntu ubuntu       4096 12  5 21:01:30 .
-rw-rw-r-- 1 ubuntu ubuntu        910 12  5 17:20:39 13_stat.c
-rw-rw-r-- 1 ubuntu ubuntu        527 12  5 13:59:38 07_read_write.c
-rw-rw-r-- 1 ubuntu ubuntu        385 12  5 11:33:14 04_open_excl.c
-rw-rw-r-- 1 ubuntu ubuntu        734 12  5 14:32:39 08_cpy.c
-rw-rw-r-- 1 ubuntu ubuntu        594 12  5 20:47:33 06_close.c
-rw-rw-r-- 1 ubuntu ubuntu        247 12  5 11:28:57 03_open.c