1、传递一个路径名,还有一个文件名,搜索对应路径下是否有该文件,有就打印显示,显示绝对路径。
2、传递任意一个目录路径,能够显示该目录的ls -l的效果 3、定义一个学生结构体类型struct
student,里边含有学号,姓名,分数,定义结构体数组struct student
s[3],给数组赋初值后,写入文件,然后通过lseek偏移到开头,然后再读取进行打印输出
4、新建一个文件,里边内容为hello,通过mmap映射该文件后,修改hello为world,然后解除映射
基于文件指针的文件操作
1.创建与删除目录
mkdir() rmdir()
1 #include<func.h>
2
3 int main(int argc,char* argv[]){
4 ARGS_CHECK(argc,2);
5 int ret;
6 ret=mkdir(argv[1],0777);//默认掩码抵消2,实际为0775
7 ERROR_CHECK(ret,-1,"mkdir");
8 return 0;
9 }
1 #include <func.h>
2
3 int main(int argc,char* argv[]){
4 ARGS_CHECK(argc,2);
5 int ret;
6 ret=rmdir(argv[1]);
7 ERROR_CHECK(ret,-1,"rmdir");
8 return 0;
9 }
2.给opendir(dir)打开一个目录 传递的必须是相对当前程序所在目录的路径
(1)DIR* opendir(const char* name);
(2)struct dirent* readdir(const char* name);读取目录的一项信息,并返回该项信息的结构体指针
1 #include <func.h>
2
3 int main(int argc,char* argv[]){
4 ARGS_CHECK(argc,2);
5 DIR* dir;
6 dir=opendir(argv[1]);
7 ERROR_CHECK(dir,NULL,"opendir");
8 struct dirent *p;
9 while(p=readdir(dir))
10 {
11 printf("ino=%ld len=%d type=%d fileName=%s\n",p->d_ino,p->d_reclen,p->d_type,p->d_name);
12 }
13 closedir(dir);
14 return 0;
15 }
3.深度优先遍历 看该目录下的文件
注意路径路径拼接 每一级显示出来
1 #include <func.h>
2
3 int printDir(char *path,int width){
4 DIR* dir;
5 dir=opendir(path);
6 ERROR_CHECK(dir,NULL,"opendir");
7 struct dirent *p;
8 char buf[1024]={0};
9 while(p=readdir(dir)){
10 if(!strcmp(p->d_name,".")||!strcmp(p->d_name,".."))
11 {
12 continue;
13 }
14 printf("%*s%s\n",width,"",p->d_name);
15 sprintf(buf,"%s%s%s",path,"/",p->d_name);//路径拼接
16 if(4==p->d_type)
17 {
18 printDir(buf,width+4);
19 }
20 }
21 closedir(dir);
22 return 0;
23 }
25 int main(int argc,char* argv[]){
26 ARGS_CHECK(argc,2);
27 puts(argv[1]);
28 int ret=printDir(argv[1],4);
29 return 0;
30 }
- void rewinder(DIR *dir);重新定位到目录文件的头部
void seekdir(DIR dir);用来设置目录流目前的读取位置
off_t telldir(DIR dir);返回目录流当前的读取位置 记录当时的偏移
1 #include <func.h>
2
3 int main(int argc,char* argv[]){
4 ARGS_CHECK(argc,2);
5 DIR* dir;
6 dir=opendir(argv[1]);
7 ERROR_CHECK(dir,NULL,"opendir");
8 struct dirent *p;
9 off_t pos;
10 while(p=readdir(dir))
11 {
12 printf("ino=%ld len=%d type=%d fileName=%s\n",p->d_ino,p->d_reclen,p->d_type,p->d_name);
13 if(!strcmp(p->d_name,"a.out"))
14 {
15 pos=telldir(dir);
16 }
17 }
18 seekdir(dir,pos);
19 printf("----------------------\n");
20 p=readdir(dir);
21 printf("ino=%ld len=%d type=%d fileName=%s\n",p->d_ino,p->d_reclen,p->d_type,p->d_name);
22 closedir(dir);
23 return 0;
5.stat信息
ls -l前面的所有信息都是存在inode里面的,只有目录名字存在dirent里面
初步实现
1 #include <func.h>
2
3 int main(int argc,char* argv[])
4 {
5 ARGS_CHECK(argc,2);
6 struct stat buf;
7 int ret;
8 ret=stat(argv[1],&buf);//传出参数
9 ERROR_CHECK(ret,-1,"stat");
10 printf("%x %ld %s %s %ld %s\n",buf.st_mode,buf.st_nlink,getpwuid(buf.st_uid)->pw_name,getgrgid(buf.st_gid)->gr_name,buf.st_size,ctime(&buf.st_mtime));
11 return 0;
12 }
基于文件描述符的文件操作
1.打开文件
1 #include <func.h>
2
3 int main(int argc,char* argv[]){
4 ARGS_CHECK(argc,2);
5 int fd;
6 fd=open(argv[1],O_RDWR);
7 ERROR_CHECK(fd,-1,"open");
8 printf("fd=%d\n",fd);
9 close(fd);
10 return 0;
11 }
创建文件 如果存在,则返回open失败,不存在则创建新文件
1 #include <func.h>
2
3 int main(int argc,char* argv[]){
4 ARGS_CHECK(argc,2);
5 int fd;
6 fd=open(argv[1],O_RDWR|O_CREAT|O_EXCL,0666);
7 ERROR_CHECK(fd,-1,"open");
8 printf("fd=%d\n",fd);
9 return 0;
10 }
2.读写文件
1 #include <func.h>
2
3 int main(int argc,char* argv[]){
4 ARGS_CHECK(argc,2);
5 int fd;
6 fd=open(argv[1],O_RDWR);
7 ERROR_CHECK(fd,-1,"open");
8 printf("fd=%d\n",fd);
9 char buf[128]={0};
10 read(fd,buf,sizeof(buf));
11 printf("buf=%s\n",buf);
12 close(fd);
13 return 0;
14 }
1 #include <func.h>
2
3 int main(int argc,char* argv[]){
4 ARGS_CHECK(argc,2);
5 int fd;
6 fd=open(argv[1],O_RDWR);
7 ERROR_CHECK(fd,-1,"open");
8 printf("fd=%d\n",fd);
9 int ret=write(fd,&fd,sizeof(int));
10 printf("write count=%d\n",ret);
11 return 0;
12 }
3.改变文件大小
1 #include <func.h>
2
3 int main(int argc,char* argv[]){
4 ARGS_CHECK(argc,2);
5 int fd;
6 fd=open(argv[1],O_RDWR);
7 ERROR_CHECK(fd,-1,"open");
8 printf("fd=%d\n",fd);
9 int ret=ftruncate(fd,50);
10 ERROR_CHECK(ret,-1,"ftruncate");
11 close(fd);
12 return 0;
13 }
4.mmap 磁盘内存映射
用mmap时必须要用open
1 #include <func.h>
2
3 int main(int argc,char* argv[]){
4 ARGS_CHECK(argc,2);
5 int fd;
6 fd=open(argv[1],O_RDWR);
7 ERROR_CHECK(fd,-1,"open");
8 printf("fd=%d\n",fd);
9 char *p;
10 p=(char*)mmap(NULL,5,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
11 ERROR_CHECK(p,(char*)-1,"mmap");
12 p[5]=0;
13 printf("%s\n",p);
14 p[0]='H';
15 munmap(p,5);
16 close(fd);
17 return 0;
18 }
day8
1.lseek 成功返回距离文件开头的位置
fseek 成功返回0
1 #include <func.h>
2
3 int main(int argc,char* argv[])
4 {
5 ARGS_CHECK(argc,2);
6 int fd;
7 fd=open(argv[1],O_RDWR);
8 ERROR_CHECK(fd,-1,“open”);
9 int ret=lseek(fd,5,SEEK_SET);
10 printf(“pos=%d\n”,ret);
11 char buf[128]={0};
12 read(fd,buf,sizeof(buf));
13 printf(“buf=%s\n”,buf);
14 close(fd);
15 return 0;
16 }
2.mmap munmap
不需要read write
1 #include <func.h>
2
3 int main(int argc,char* argv[])
4 {
5 ARGS_CHECK(argc,2);
6 int fd;
7 fd=open(argv[1],O_RDWR);
8 ERROR_CHECK(fd,-1,“open”);
9 char* p=(char*)mmap(NULL,5,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);//NULL自动分配
10 ERROR_CHECK(p,(char*)-1,“mmap”);
11 printf("%s\n",p);
12 strcpy(p,“how”); //写入字符串替换
13 int ret=munmap(p,5);
14 ERROR_CHECK(ret,-1,“munmap”);
15 return 0;
16 }
3.fp转换为fd使用
1 #include <func.h>
2
3 int main(int argc,char* argv[])
4 {
5 ARGS_CHECK(argc,2);
6 FILE* fp;
7 fp=fopen(argv[1],“rb+”);
8 ERROR_CHECK(fp,NULL,“fopen”);
9 int fd=fileno(fp);
10 printf(“fd=%d\n”,fd);
11 char buf[128]={0};
12 read(fd,buf,sizeof(buf));
13 printf(“buf=%s\n”,buf);
14 return 0;
15 }
fd转fp
1 #include <func.h>
2
3 int main(int argc,char* argv[])
4 {
5 ARGS_CHECK(argc,2);
6 FILE* fp;
7 int fd=open(argv[1],O_RDWR);
8 ERROR_CHECK(fd,-1,“fopen”);
9 fp=fdopen(fd,“rb+”);
10 ERROR_CHECK(fp,NULL,“fdopen”);
11 char buf[128];
12 fgets(buf,sizeof(buf),fp);
13 printf(“buf=%s\n”,buf);
14 return 0;
15 }
4.dup dup2 复制
dup
1 #include <func.h>
2
3 int main(int argc,char* argv[])
4 {
5 ARGS_CHECK(argc,2);
6 int fd,fd1;
7 fd=open(argv[1],O_RDWR);
8 ERROR_CHECK(fd,-1,“open”);
9 fd1=dup(fd);//复制
10 close(fd);
11
12 char buf[128]={0};
13 int ret=read(fd1,buf,sizeof(buf));
14 printf(“ret=%d buf=%s\n”,ret,buf);
15 return 0;
16 }
实现重定向标准输出
1 #include <func.h>
2
3 int main(int argc,char* argv[])
4 {
5 ARGS_CHECK(argc,2);
6 int fd,fd1;
7 fd=open(argv[1],O_RDWR);
8 ERROR_CHECK(fd,-1,“open”);
9 printf("\n");
10 close(1);
11 fd1=dup(fd);
12 close(fd);
13 printf(“fd1=%d\n”,fd1);//不会打印到屏幕上,实现重定向标准输出
14 printf(“you can’t see me”);
15 return 0;
16 }
dup2的使用
1 #include <func.h>
2
3 int main(int argc,char* argv[])
4 {
5 ARGS_CHECK(argc,2);
6 int fd,fd1;
7 fd=open(argv[1],O_RDWR);
8 ERROR_CHECK(fd,-1,“open”);
9 printf("\n");
10 dup2(1,100);
11 fd1=dup2(fd,1);//文件描述符的复制
12 printf(“fd1=%d\n”,fd1);//不会打印到屏幕上,实现重定向标准输出
13 printf(“you can’t see me\n”);
14 dup2(100,1);
15 printf(“you can see me\n”); //打印到屏幕上,实现标准输出
16 return 0;
17 }
1 STDOUT_FILENO
5.管道文件 select
即时聊天
chat1 1)读取标准输入
2)写入管道fdw,发送给对端
3)读取管道fdr
4)打印显示
chat2
1)读取管道fdr
2)打印显示
3)读取标准输入
4)写入管道fdw,发送给对端
1 #include <func.h>
2
3 int main(int argc,char* argv[])
4 {
5 ARGS_CHECK(argc,3);
6 int fdw=open(argv[1],O_WRONLY);
7 int fdr=open(argv[2],O_RDONLY);
8 printf(“I am chat2 fdw=%d,fdr=%d\n”,fdw,fdr);
9 char buf[128]={0};
10
11 fd_set rdset;
12 int ret;
13 while(1){
14 FD_ZERO(&rdset);
15 FD_SET(STDIN_FILENO,&rdset);
16 FD_SET(fdr,&rdset);
17 ret=select(fdr+1,&rdset,NULL,NULL,NULL);//rdset是传入传出参数
18 if(FD_ISSET(STDIN_FILENO,&rdset)){
19 memset(buf,0,sizeof(buf));
20 read(STDIN_FILENO,buf,sizeof(buf));
21 write(fdw,buf,strlen(buf)-1);
22 }
23 if(FD_ISSET(fdr,&rdset)){
24 memset(buf,0,sizeof(buf));
25 read(fdr,buf,sizeof(buf));
26 printf("%s\n",buf);
27 }
28 }
29 return 0;
30 }