2024.1.3 IO 作业

思维导图

练习题

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;
}

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值