IOday3

本文介绍了使用C语言通过标准IO库和系统调用实现文件的拷贝,包括使用`fread`和`fwrite`进行数据传输,以及使用`stat`函数获取文件属性并判断文件类型,还展示了如何遍历目录并处理文件和目录的不同类型。
摘要由CSDN通过智能技术生成

思维导图

1> 使用标准io完成两个文件的拷贝

#include<myhead.h>
int main(int argc, const char *argv[])
{
	//输入3个正确的文件
	if(argc!=3)
	{
		printf("input error\n");
		printf("usage: ./a.out srcfile dstfile\n");
		return -1;
	}

	//定义两个文件,源文件和目标文件
	FILE *src, *dst;

	//以只读形式打开src
	if((src=fopen(argv[1],"r"))==NULL)
	{
		printf("fopen srcfile error\n");
		return -1;
	}
	//以只写形式打开dst	
	if((dst=fopen(argv[2],"w"))==NULL)
	{
		printf("fopen dstfile error\n");
		return -1;
	}
	//定义一个数组存放读取内容
	char buf[128]="";
	while(!feof(src))
	{
		int res=fread(buf,1,sizeof(buf),src);
		fwrite(buf,1,res,dst);
	}
	//关闭两个文件
	fclose(src);
	fclose(dst);
	return 0;
}

2> 使用文件IO完成两个文件的拷贝

#include<myhead.h>
int main(int argc, const char *argv[])
{
	//提醒输入错误
	if(argc!=3)
	{
		printf("input file error\n");
		printf("usage: ./a.out srcfile dstfile\n");
		return -1;
	}
	//定义两个文件
	int src=-1;
	int dst=-1;
	//以只读形式打开文件srcfile
	if((src = open(argv[1], O_RDONLY))==-1)
	{
		perror("open srcfile error");
		return -1;
	}
	//以只写形式打开文件dstfile
	if((dst = open(argv[2],O_WRONLY | O_CREAT | O_TRUNC,0664))==-1)
	{
		perror("open dstfile error");
		return -1;
	}
	//定义一个数组存储读取内容
	char buf[128]="";
	//循环遍历
	while(1)
	{
		int res=read(src,buf,sizeof(buf));
		if(res==0 || res==-1)
			break;
		write(dst,buf,res);       //res保证只写入文件读取个数
	}
	//关闭两个文件
	close(dst);
	close(src);
	return 0;
}

3> 将stat函数实现一遍

#include<myhead.h>
int main(int argc, const char *argv[])
{
	//定义文件属性类型的数据,用于存储获得的文件属性
	struct stat sb;
	//调用函数,把文件属性存储到结构体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("这是字符文件\t");
			}
			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;
}

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=0;
	//打开目录
	if((dp = opendir(argv[1]))==NULL)
	{
		perror("opendir 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;
		case DT_UNKNOWN:
			{
				printf("un\n");
			}
			break;
		}
	}

	//关闭文件
	closedir(dp);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值