嵌入式学习-IO线程进程-Day3
一、思维导图
二、作业
1.使用标准io完成两个文件的拷贝
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
//定义两个文件指针
FILE *srcfp=NULL,*dstfp=NULL;
if(argc!=3)
{
printf("input file error\n");
return -1;
}
//打开文件
if((srcfp=fopen(argv[1],"r"))==NULL)
{
perror("fopen error");
return -1;
}
if((dstfp=fopen(argv[2],"w"))==NULL)
{
perror("fopen error");
return -1;
}
//拷贝字符串
char rbuf[10]="";
while(1)
{
if(feof(srcfp)!=0)// 光标到底时 退出循环
break;
int res=fread(rbuf,1,sizeof(rbuf),srcfp);
fwrite(rbuf,1,res,dstfp);
memset(rbuf,0,sizeof(rbuf));//对rbuf清零
}
printf("拷贝成功\n");
//关闭文件
fclose(srcfp);
fclose(dstfp);
return 0;
}
运行结果
2.使用文件IO完成两个文件的拷贝
#include <myhead.h>
int main(int argc, const char *argv[])
{
int fd1=-1,fd2=-2;
char buf[10]="";
//判断外部传参文件个数
if(argc!=3)
{
printf("error\n");
return -1;
}
//打开源文件
if((fd1=open(argv[1],O_RDONLY))==-1)
{
perror("open srcfile error");
return -1;
}
//打开目标文件
if((fd2=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664))==-2)
{
perror("open dstfile error");
return -1;
}
//拷贝
while(1)
{
memset(buf,0,sizeof(buf));
int res=read(fd1,buf,sizeof(buf));//读取数据
write(fd2,buf,res); //写入数据,传res避免拷贝过多内容
if(res==0) //退出循环的条件
break;
}
//关闭文件
close(fd1);
close(fd2);
printf("拷贝成功\n");
return 0;
}
运行结果
3.将stat函数实现一遍
#include <myhead.h>
//stat函数读取文件信息的操作
int main(int argc, const char *argv[])
{
//定义文件属性类型的数据
struct stat sb;//存储获得的文件属性
if(argc!=2)
{
printf("error\n");
return -1;
}
//调用函数得到文件属性
stat(argv[1],&sb);
switch(sb.st_mode&S_IFMT)
{
case S_IFSOCK:
printf("是套接字文件\t");
break;
case S_IFLNK:
printf("是链接文件\t");
break;
case S_IFREG:
printf("是普通文件\t");
break;
case S_IFBLK:
printf("是块设备文件\t");
break;
case S_IFDIR:
printf("是目录文件\t");
break;
case S_IFCHR:
printf("是字符设备文件\t");
break;
case S_IFIFO:
printf("是管道文件\t");
break;
}
printf("文件权限:%#o 文件大小:%ld inode:%ld\n",\
sb.st_mode&0777,sb.st_size,sb.st_ino);
return 0;
}
运行结果
4.将目录操作实现一遍
#include <myhead.h>
//对目录的打开\关闭\读取信息的操作
int main(int argc, const char *argv[])
{
if(argc!=2)
{
printf("input error\n");
printf("usage: ./a.out name\n");
return -1;
}
//定义目录指针
DIR *dp=NULL;
//打开目录
if((dp=opendir(argv[1]))==NULL)
{
perror("opendir error");
return -1;
}
//读取目录中所有的文件或目录信息
struct dirent *sdp=NULL; //定义指针读取目录
while((sdp=readdir(dp))!=NULL) //循环读取
{
printf("inode:%ld,size=%d,%s",sdp->d_ino,sdp->d_reclen,sdp->d_name);
switch(sdp->d_type)//输出类型
{
case DT_BLK:
printf(" 块设备文件\n");
break;
case DT_CHR:
printf(" 字符设备文件\n");
break;
case DT_DIR:
printf(" 目录文件\n");
break;
case DT_FIFO:
printf(" 管道文件\n");
break;
case DT_LNK:
printf(" 链接文件\n");
break;
case DT_REG:
printf(" 普通文件\n");
break;
case DT_SOCK:
printf(" 套接字文件\n");
break;
}
}
//关闭目录
closedir(dp);
return 0;
}
运行结果