思维导图:
使用标准IO完成两个文件的拷贝
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, const char *argv[])
{
if(argc !=3)
{
printf("内容问题\n");
return 0;
}
//定义文件指针
FILE *rfp=NULL; //源文件
FILE *wfp=NULL; //目标文件
//以只读的形式打开源文件
if((rfp=fopen(argv[1],"r"))==NULL)
{
perror("rfp error");
return -1;
}
//以只写的形式打开目标文件
if((wfp=fopen(argv[2],"w"))==NULL)
{
perror("wfp error");
return -1;
}
//定义一个字符搬运工
char buf=0;
while(1)
{
buf=fgetc(rfp); //读取文件到字符搬运工
if(buf==EOF)
{
printf("拷贝完成\n");
break;
}
fputc(buf,wfp); //写入数据
}
//关闭文件
fclose(rfp);
fclose(wfp);
return 0;
}
运行效果:
使用文件IO完成两个文件的拷贝
代码:
#include<myhead.h>
int main(int argc, const char *argv[])
{
//判断内容
if(argc!=3)
{
printf("内容错误\n");
return -1;
}
//定义文件标示符号
int rfd=-1;
int wfd=-1;
//以只读的形式打开文件
if((rfd=open(argv[1],O_RDONLY))==-1)
{
perror("rfd error:");
return -1;
}
//以只写的形式打开文件
if((wfd=open(argv[2],O_WRONLY))==-1)
{
perror("wfd error:");
return -1;
}
//定义存储容器
char rbuf[128]="";
//定义返回字节读数
int res=0;
//循序取值
while(1)
{
res=read(rfd,rbuf,sizeof(rbuf)); //读取
if(res==0)
{
printf("拷贝完成\n");
break;
}
write(wfd,rbuf,res); //写入
}
//关闭文件
close(rfd);
close(wfd);
return 0;
}
运行效果:?
将stat函数实现一遍
代码:
#include<myhead.h>
int main(int argc, const char *argv[])
{
if(argc!=2)
{
printf("内容错误\n");
return -1;
}
//定义文件属性类型的数据
struct stat sb;//用于存储获得的文件属性
//调用函数的文件属性
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("这是字符设备文件\n");
}
break;
case S_IFIFO:
{
printf("这是管道文件\t");
}
break;
}
printf("%#o\t%ld\t%ld\n",sb.st_mode&0777,sb.st_size,sb.st_ino);
return 0;
}
运行效果:
将目录操作实现一遍
代码:
#include<myhead.h>
int main(int argc, const char *argv[])
{
//外部传参
if(argc!=2)
{
printf("内容错误\n");
return -1;
}
//定义目录指针
DIR *dp=NULL;
//打开目录
if((dp=opendir(argv[1]))==NULL)
{
perror("dp error");
return -1;
}
//读取目录信息
struct dirent *sdp=NULL;
while((sdp=readdir(dp))!=NULL) //循环读取
{
//输出当前文件或目录的信息
printf("inode:%10ld,size:%10d,%10s,",\
sdp->d_ino,sdp->d_reclen,sdp->d_name);
//输出文件类型
switch(sdp->d_type)
{
case DT_BLK:
{
printf("b\n");
}
break;
case DT_CHR:
{
printf("c\n");
}
break;
case DT_DIR:
{
printf("d\n");
}
break;
case DT_FIFO:
{
printf("p\n");
}
break;
case DT_LNK:
{
printf("l\n");
}
break;
case DT_REG:
{
printf("-\n");
}
break;
case DT_SOCK:
{
printf("s\n");
}
break;
}
}
//关闭目录
closedir(dp);
return 0;
}
运行效果: