思维导图
练习题
1> 使用标准IO完成两个文件的拷贝
#include <myhead.h>
int main(int argc, const char *argv[])
{
//标准IO函数fopen fread fwrite
//打开要读取文件
FILE *file=fopen("./test.txt","r");
if(file==NULL)
{
perror("file文件打开失败");
return -1;
}
//设置读取内容的容器
char buf[10]="";
//打开或新建要写入内容的文件
FILE *file2=fopen("./output.txt","w");
if(file2==NULL)
{
perror("file2文件打开失败");
return -1;
}
while (1)
{
//每次清空上一次写入留下的残余数据
memset(buf,0,sizeof(buf));
//读取并写入内容
fread(buf,sizeof(buf),1,file);
fwrite(buf,sizeof(buf),1,file2);
//判断读取的文件里,光标是否到文件末尾,如果是则表示数据已经全部遍历,退出循环
if(feof(file)) break;
}
fclose(file);
fclose(file2);
printf("拷贝成功\n");
return 0;
}
2> 使用文件IO完成两个文件的拷贝
#include <myhead.h>
int main(int argc, const char *argv[])
{
//使用系统IO拷贝文件内容 系统函数有open read write
//打开读取目标文件
int file=open("./test.txt",O_RDONLY);
if(file==-1)
{
perror("文件打开失败");
return -1;
}
char buf[10]="";
//打开写入文件,设定文件标识为只写、创建、清空,有创建就要写第三个参数,创建的文件权限
int file2=open("./output.txt",O_WRONLY|O_CREAT|O_TRUNC,0664);
if(file2==-1)
{
perror("文件打开失败");
return -1;
}
//遍历原文件,并写入目标文件
while(1)
{
memset(buf,0,sizeof(buf));
int res=read(file,buf,sizeof(buf));
write(file2,buf,sizeof(buf));
//判断读取的字符为0时,表示遍历完成,结束循环
if(res==0) break;
}
close(file);
close(file2);
puts("拷贝完成");
return 0;
}
3> 将stat函数实现
#include <myhead.h>
int main(int argc, const char *argv[])
{
//文件属性获取
//定义结构体变量sb
struct stat sb;
//stat函数将文件属性写入结构体成员中
stat(argv[1],&sb);
//判断文件类型
switch (sb.st_mode&S_IFMT)
{
case S_IFSOCK:
printf("这是套接字文件");
break;
case S_IFBLK:
printf("这是块设备文件");
break;
case S_IFCHR:
printf("这是字符文件");
break;
case S_IFLNK:
printf("这是链接文件");
break;
case S_IFREG:
printf("这是普通文件");
break;
case S_IFDIR:
printf("这是目录");
break;
case S_IFIFO:
printf("这是管道文件");
break;
default:
printf("error");
break;
}
return 0;
}
4> 将目录操作实现
#include <myhead.h>
int main(int argc, const char *argv[])
{
//判断外部传参
if (argc != 2)
{
printf("input error\n");
return -1;
}
//定义目录指针
DIR *dp = opendir(argv[1]);
//打开目录
if (dp == 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;
default:
printf("error");
}
}
//关闭目录
closedir(dp);
return 0;
}