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

被折叠的 条评论
为什么被折叠?



