1:实现文件夹的拷贝功能 注意判断被拷贝的文件夹是否存在,如果不存在则提前创建,创建文件夹的函数为 mkdir 不考虑递归拷贝的问题
#include <myhead.h>
//文件夹的拷贝copy
int main(int argc, const char *argv[])
{
if(argc!=2){
printf("输入参数错误\n");
return -1;
}
char str[128]={0};
char str1[256]={0};
//两个数组存放./argv[1]
strcpy(str,"./");
strcat(str,argv[1]);
strcpy(str1,str);
//从终端输入需要创建的文件夹
DIR *dp=opendir(str);
//打开文件夹
if(NULL==dp){
perror("opendir");
//不存在则创建
if(-1==mkdir(str,S_IRWXU|S_IRWXG|S_IRWXO)){
perror("mkdir");
return -1;
}
}
//打开文件夹
dp=opendir(str);
if(NULL==dp){
perror("opendir");
return -1;
}
struct dirent *attr;
//创建拷贝文件夹
strcat(str1,"_backup");
if(-1==mkdir(str1,S_IRWXU|S_IRWXG|S_IRWXO)){
perror("mkdir error");
return -1;
}
//
strcat(str,"/");
strcat(str1,"/");
while(1){
//读取目录下的文件
attr=readdir(dp);
if(NULL==attr){
break;
}
char name[256]={0};
memset(name,0,sizeof(name));
strcpy(name,attr->d_name);
char src[256];
char dest[256];
//拷贝文件夹中的文件
if(strcmp(name,".")&&strcmp(name,"..")){
//拼接每次读到的源文件
memset(src,0,sizeof(src));
strcat(src,str);
strcat(src,name);
//打开源文件
int sfd=open(src,O_RDONLY);
if(-1==sfd){
perror("sfd");
return -1;
}
//拼接每次要打开的源文件
memset(dest,0,sizeof(dest));
strcat(dest,str1);
strcat(dest,name);
int dfd=open(dest,O_WRONLY|O_CREAT|O_TRUNC,0664);
//打开目标文件
if(-1==dfd){
perror("dfd");
return -1;
}
//文件拷贝
while(1){
char copybuf[128];
memset(copybuf,0,sizeof(copybuf));
printf("%s",copybuf);
int res=read(sfd,copybuf,sizeof(copybuf));
if(0==res){
break;
}
write(dfd,copybuf,res);
}
close(sfd);
close(dfd);
}
}
printf("copy complete\n");
closedir(dp);
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再做一遍
主函数部分
int main(int argc, const char *argv[])
{
puts(" \033[1;34;10mStudent Score Management System");
puts(" 1.Show student score");
puts(" 2.Insert student score");
puts(" 3.Search student score");
puts(" 4.Delete student score file");
puts(" 5.Exit\033[0m");
while(1){
int choice;
printf("\033[1;33;10mChoose Your Choice:\033[0m");
scanf("%d",&choice);
while(getchar()!=10);
switch(choice){
case 1:{
//从文件中读取存储的学生信息并打印
node_p H=link_create();
//read_read(H);
//read_fread(H);
read_fscanf(H);
link_show(H);
link_free(&H);
break;
}
case 2:{
//录入学生信息
node_p H=link_create();
while(1){
Stu buf;
memset(&buf,0,sizeof(Stu));
entering(&buf);
//insert_tail(H,buf);
//write_fwrite(buf);
//write_write(buf);
write_fprintf(buf);
printf("press space contine or any key to exit...");
if(getchar()!=' '){
break;
}
}
link_free(&H);
break;
}
case 3:{
//查找学生
printf("Student Name:");
char name[128];
scanf("%s",name);
while(getchar()!=10);
FILE *fp=fopen("./stu.txt","r");
if(NULL==fp){
ERR_MSG("open");
break;
}
while(1){
Stu data;
memset(&data,0,sizeof(Stu));
node_p H=link_create();
char buf[128];
int res=fscanf(fp,"%s%s%s%d%s%lf%s%lf%s%lf%s%lf%s%lf%s%lf",\
buf,data.name,buf,&(data.age),buf,&(data.math_score),buf,&(data.chinese_score),buf,&(data.english_score),buf,&(data.physics_score),\
buf,&(data.chemistry_score),buf,&(data.biology_score));
if(strcmp(data.name,name)==0){
insert_tail(H,data);
link_show(H);
link_free(&H);
fclose(fp);
break;
}
if(EOF==res){
printf("\033[1;33;10mNot Exist\n\033[0m");
link_free(&H);
fclose(fp);
break;
}
}
break;
}
case 4:{
//删除学生信息文件
printf("\033[1;33;10mAdmin Passwd:\033[0m");
char passwd[128];
system("stty -echo");
fgets(passwd,sizeof(passwd),stdin);
passwd[strlen(passwd)-1]='\0';
/*
int i=0;
while(i<sizeof(passwd)-1){
system("stty -echo");
char ch=getchar();
if(ch=='\n'||ch==EOF){
break;
}
passwd[i++]=ch;
system("stty echo");
printf("*");
fflush(stdout);
}
passwd[i]='\0';
*/
system("stty echo");
puts("");
if(strcmp(passwd,"1")==0){
if(-1==remove("./stu.txt")){
ERR_MSG("remove");
break;
}
printf("\033[1;32;10mDelete Complete\033[0m\n");
break;
}
else{
printf("\033[1;31;10mWrong Passwd\n\033[0m");
break;
}
}
case 5:
//退出
return 1;
default:
//错误输入
printf("\033[1;31;10mWrong Input\n\033[0m");
break;
}
printf("press space return menu or any key to exit...");
if(getchar()!=' '){
break;
}
}
return 0;
}
3:创建一对父进程,在父进程能够向子进程发送消息的基础上发 同时子进程也能够向父进程发送消息
#include <myhead.h>
//创建父子进程
//实现父进程可以往子进程发送
//子进程也可以往父进程发送
#define ERR_MSG(msg) do{fprintf(stdout,"__%d__",__LINE__);\
perror(msg);\
}while(0)
void *read_t(void *arg){
sleep(3);
int fd=open("./test.txt",O_RDONLY);
if(-1==fd){
ERR_MSG("open");
return NULL;
}
char buf[128];
memset(buf,0,sizeof(buf));
read(fd,buf,sizeof(buf));
printf("%s\n",buf);
close(fd);
pthread_exit(NULL);
}
void *write_t(void *arg){
int fd=open("./test.txt",O_WRONLY|O_CREAT|O_APPEND,0664);
if(-1==fd){
ERR_MSG("open");
return NULL;
}
char buf[128]={0};
printf("input:");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]='\0';
write(fd,buf,sizeof(buf));
close(fd);
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
//创建子进程
pid_t pid = fork();
if(pid>0){
pthread_t tid1=-1;
if(pthread_create(&tid1,NULL,read_t,NULL)!=0){
ERR_MSG("pthread_create");
return -1;
}
pthread_t tid2=-1;
if(pthread_create(&tid2,NULL,write_t,NULL)!=0){
ERR_MSG("pthread_create");
return -1;
}
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
wait(NULL);
}
else if(0==pid){
pthread_t tid1=-1;
if(pthread_create(&tid1,NULL,read_t,NULL)!=0){
ERR_MSG("pthread_create");
return -1;
}
pthread_t tid2=-1;
if(pthread_create(&tid2,NULL,write_t,NULL)!=0){
ERR_MSG("pthread_create");
return -1;
}
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
exit(EXIT_SUCCESS);
}
else{
ERR_MSG("fork");
return -1;
}
return 0;
}