IO进程线程-5

文章讲述了如何用C语言实现文件夹的拷贝功能,包括检查并创建目标文件夹,以及处理文件内容的复制。另外,还介绍了如何操作结构体数组,如读写文件和使用stdio库进行数据交换。最后,展示了父子进程间的简单通信示例。

1:实现文件夹的拷贝功能 注意判断被拷贝的文件夹是否存在,如果不存在则提前创建,创建文件夹的函数为 mkdir 不考虑递归拷贝的问题


int main(int argc, const char *argv[])
{
	DIR* dir1=opendir(argv[1]);
	if(dir1==NULL){
		perror("opendir");
		return -1;
	}
		DIR* dir2=opendir(argv[2]);
	if(dir2==NULL){
		mkdir(argv[2],0771);
		perror("mkdir");
	}
	struct dirent* file_name;
	while(1){
		file_name=readdir(dir1);
		if(file_name==NULL){break;}
		if(file_name->d_type==4){continue;}
		char str1[255];
		char str2[255];
		strcpy(str1,argv[1]);
		strcpy(str2,argv[2]);
		
		strcat(str1,"/");
		strcat(str2,"/");
		strcat(str1,file_name->d_name);
		strcat(str2,file_name->d_name);
		printf("%s\n",str2);
 
		int fd1=open(str1,O_RDONLY);
		if(fd1==-1){
			perror("open1");
			return -3;
		}
		int fd2=open(str2,O_WRONLY|O_CREAT|O_TRUNC,0664);
		if(fd2==-1){
			perror("open2");
			return -3;
		}
 
		char ch;
		while(1){
			int res=read(fd1,&ch,1);
			if(res==0){break;}
			write(fd2,&ch,1);
		}
 
		close(fd1);
		close(fd2);
	}
	closedir(dir1);
	closedir(dir2);
	return 0;
}

2:有如下结构体 struct Student{ char name[20]; int age; double math_score; double chinese_score; double english_score; double physical_score; double chemical_score; double biological_score; } 申请一个该结构体数组,使用 fprintf / fscanf,将该结构体数组中的所有数据,写入文件中,然后重新加载到数组中 同样的操作,使用fwrite/fread 和 write/read再做一遍

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/wait.h>
#include <pthread.h>
#define MAX 7
typedef struct node
{
	char name[20];
	int age;
	double math_score;
	double chinese_score;
	double english_score;
	double physical_score;
	double chemical_score;
	double biological_score;
}stu;
typedef struct 
{
	stu data[MAX];
	int len;  
}seq,*seq_p;
seq_p creat_seqllist()
{
	seq_p L=(seq_p)malloc(sizeof(seq));
	if(NULL==L)
	{
		printf("申请空间失败\n");
		return NULL;
	}
	L->len=0;
	return L;
}
void insert_tail(seq_p L,stu data)
{
	if(L==NULL)
	{
		printf("入参为空\n");
		return;
	}
	if( L->len==MAX )
	{
		printf("表已满\n");
		return;
	}
	L->data[L->len]=data;
	L->len++;
}
void show(seq_p L)
{
	if(L==NULL)
	{
		printf("入参为空\n");
		return;
	}
	if(L->len==0)
	{
		printf("表为空\n");
		return;
	}
	for(int i=0;i<L->len;i++)
	{
		printf("%s %d %.1lf %.1lf %.1lf %.1lf %.1lf %.1lf\n",L->data[i].name,L->data[i].age,L->data[i].math_score,L->data[i].chinese_score,L->data[i].english_score,L->data[i].physical_score,L->data[i].chemical_score,L->data[i].biological_score);
	}
}
void save(seq_p L)
{
	FILE* fp=fopen("./stu.txt","w");
	if(NULL==L)
	{
		printf("入参为空\n");
		return;
	}
	for(int i=0;i<L->len;i++)
	{
		fwrite(&L->data[i],sizeof(stu),1,fp);
	}
	fclose(fp);
	printf("保存成功\n");
}
void write_stu(seq_p L)
{
	FILE* fp=fopen("./stu.txt","r");
	if(NULL==fp)
	{
		return;
	}
	while(1)
	{
		stu data;
		int res=fread(&data,sizeof(stu),1,fp);
		if(res==0)break;
		insert_tail(L,data);
	}
	fclose(fp);
}
int main(int argc, const char *argv[])
{
	seq_p L=creat_seqllist();
	write_stu(L);
	while(1)
	{
		int ch=0;
		printf("1:添加学生信息\n");
		printf("2:查看学生信息\n");
		printf("3:保存学生信息\n");
		scanf("%d",&ch);
		while(getchar()!=10);
		switch(ch)
		{
		case 1:
			{
				stu data;
				printf("输入学生姓名、年龄、六科成绩成绩:\n");
				scanf("%s %d %lf %lf %lf %lf %lf %lf",data.name,&data.age,&data.math_score,&data.chinese_score,&data.english_score,&data.physical_score,&data.chemical_score,&data.biological_score);
				insert_tail(L,data);
				break;
			}
		case 2:
			write_stu(L);
			show(L);
			break;
		case 3:
			save(L);
			break;
		default:
			break;
			
		}
	}
	return 0;
}

3:创建一对父进程,在父进程能够向子进程发送消息的基础上发 同时子进程也能够向父进程发送消息

 

int main(int argc, const char *argv[])
{   
	int res = fork();
	if(res > 0)
	{
		int wfd = open("./write.txt",O_CREAT | O_WRONLY  , 0664);
		int rfd = open("./read.txt",O_CREAT | O_RDONLY ,0664);
		char a=0;
		printf("请输入:");
		while(1)
		{
			scanf("%c",&a);
			while(getchar()==10);
			int r=write(wfd,&a,1);
			if(r<=0)break;
		}
		while(1)
		{
			int q=read(rfd,&a,1);
			if(q<=0)break;
			printf("%c",a);
		}
		close(wfd);
		close(rfd);
	}

if(res==0)
{
	sleep(2);
	int rfd = open("./write.txt", O_RDONLY | O_CREAT , 0664 );
	int wfd = open("./read.txt", O_WRONLY | O_CREAT ,0664 );
	char a =0;
	printf("请输入:");
	while(1)
	{
		scanf("%c",&a);
		if(a==10)break;
		int r=write(wfd,&a,1);
		if(r<=0)break;
	}
	while(1)
	{
		int q=read(rfd,&a,1);
		if(q<=0)break;
		printf("%c",a);
	}
	close(rfd);
	close(wfd);
}

	return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值