c语言实现:学生管理系统

前言

历时三天独立完成,特此记录。

 

功能

代码简单实现了以下几个功能:

1.师生账号系统及完善的账号管理机制

2.便捷的数据统计

3.作业布置及提交系统

4.验证码及格式检查机制

 

涉及的知识:

1.比较主要的是文件,目录的读写,笔者编写过程中有很多非常有意思的bug和知识点

2.一些字符串的操作

3.结构体的相关知识

 

运行代码的注意事项:

1.保证环境内有以下七个库函数,否则会一片飘红,煞是好看(乐)

#include<stdio.h>
#include<stdbool.h>
#include <stdlib.h>
#include<string.h>
#include<time.h>
#include <unistd.h> 
#include <dirent.h>

 2.确保文件具有可读写权限,代码会自动创建文件夹及对应txt文本用于存放数据。

 3.确保存放代码可执行文件的文件夹内没有同名文件”homework“__"homework_list"__"codelist.txt"__"memdata"

 

 

关于代码的不足:

1,代码中使用了一些goto语句,笔者没有想到更好的方式替代,就先这么用着吧。。

2,代码为检查格式,将scanf语句用以下形式打印:

while(scanf("%d",&input)!=1){
	printf("格式错误!\n>>");
	while (getchar() != '\n');
}

 好处是可以便捷的检查所有输入的格式问题,坏处是没有封装成函数,看上去很杂乱。

3,虽然代码已经可以正常运行,但是一些细节仍需优化,比如个人的数据库利用仍未完善

 

 

 

代码:

下面是整体的C语言代码实现:

#include<stdio.h>
#include<stdbool.h>
#include <stdlib.h>
#include<string.h>
#include<time.h>
#include <unistd.h> 
#include <dirent.h>
/*
	打开模式:r 以只读的方式打开,文件不存在就失败 
			  w 以只写的方式打开,文件不存在就创建一个
			  w+ 可读可写,如果文件存在则清空文件,不存在就创建 
	
	读写字符:fgetc fputc
	读写字符串:fgets fputs 
	
	EOF:文件的结束标记,读取字符时判断是否读完 
	feof():判断文件是否结束的函数 
	rewind(TEXT *name)移动位置指针到开头 
	fseek(fp, 0, SEEK_END);//将文件指针移到末尾 
	
	
	if (fp==NULL){
		perror("open file falled:");//输出报错 
		return;
	} 
	
	
	 
*/
struct member{	
	int identity=-1;
	char user_name[100]={'\0'};
	char myscode[100]={'\0'};
	int class1=-1;
	int age1=-1;
	int stucode=-1;	
};//存储个人信息 



void createfile(char *a);//创建文件夹
int homework(int teacode);//布置作业 
int homework_view(int stucode);//查看作业消息 
char* yzcode();//生成验证码 
void regist();//注册 
int login();//登录 
void print_file(int type,char *chan1,int chan2) ;//打印列表 
int delete_change(int jud,int item,int stucode,char* filepath);/**1,判断是删除还是改写,
																   2,判断是哪一项(1,用户名,2,班级,3,年龄)
																   3,学号,找对应学生的档案行
																   4,更改的地方								**/



int main()
{
	
	char file1[100]="memdata";
	createfile(file1);//创建关于人员数据的文件夹 
	char file2[100]="homework_list";
	createfile(file2);//创建教师信息文件夹 
	char file3[100]="homework";
	createfile(file3);//存储作业文件 
	
    
	

	while(1){
START:
		printf("-----------------------\n\
lets go!!\n\
欢迎来到学生管理系统!\n\
输入1 注册账户\n\
输入2 登录账户\n\
输入-1 退出程序\n\
-----------------------\n\
>>");
		int a;
		while(scanf("%d",&a)!=1){
			printf("格式错误!\n>>");
			while (getchar() != '\n');
		}
		switch(a){
			case -1:
				printf("byebye^_^");
				return 0;
			case 1:
				regist();
				break;
			case 2:
		
				int stucode;
				stucode=login();
				if (stucode==0) {
					printf("登陆失败!\n");
					
				}else if(stucode<0){//教师 
					while(1){
						printf("输入:\n1 修改学生信息 \n2 布置作业 \n3 注销账号\n4 查看学生列表\n5 退出登录\n>>");
						int cmd;
						while(scanf("%d",&cmd)!=1){
							printf("格式错误!\n>>");
							while (getchar() != '\n');
						}
						char in1[100]={'\0'};
						int in2=0;//这里是后面的打印函数参数 
						
						switch (cmd){
							case 1:
								int item;
								int stucode1; 
								printf("请输入对应学生的学号:\n>>");
								while(scanf("%d",&stucode1)!=1){
									printf("格式错误!\n>>");
									while (getchar() != '\n');
								}
								
								
								printf("请输入你要更改信息的对应序号(1,用户名,2,班级,3,年龄)\n>>");
								while(scanf("%d",&item)!=1){
									printf("格式错误!\n>>");
									while (getchar() != '\n');
								}
								if (delete_change(1,item,stucode1,".\\codelist.txt")==1) printf("修改成功!\n");
								else printf("修改失败!\n");	
								break;				
							case 2:
								if(homework(stucode)==1) printf("布置成功!\n");
								else printf("布置失败!放过孩子们吧www\n");
								break;
							case 3:
								printf("你确定要注销吗?确定请输入:yes,输入no退出\n>>");
								char cmddd[100];
						ZHUXIAO1:
								 while(scanf("%s",&cmddd)!=1){
									printf("格式错误!\n>>");
									while (getchar() != '\n');
								}
								if(strcmp(cmddd,"yes")==0){
									delete_change(0,0,stucode,".\\codelist.txt"); 
									printf("注销成功\n"); 
								}else if(strcmp(cmddd,"no")==0){
									break;
								}else{
									printf("输入错误,请重新输入!\n>>");
									goto ZHUXIAO1;
								}
								break;
							case 4:
								printf("请输入你想要的查找模式:\n1.通过用户名查找\n2.通过学号查找\n3.打印班级学生\n4.打印指定年龄学生\n5.打印全部学生\n>>");
								int com_print;
								while(scanf("%d",&com_print)!=1){
									printf("格式错误!\n>>");
									while (getchar() != '\n');
								}
								
								switch(com_print)
								{
									case 1:
										printf("请输入要查找的用户名:\n>>");
										while(scanf("%s",&in1)!=1){
											printf("格式错误!\n>>");
											while (getchar() != '\n');
										}
										break;
									case 2:
										printf("请输入要查找的学号:\n>>");
										while(scanf("%d",&in2)!=1){
											printf("格式错误!\n>>");
											while (getchar() != '\n');
										}
										break;
									case 3:
										printf("请输入要打印的班级名:\n>>");
										while(scanf("%d",&in2)!=1){
											printf("格式错误!\n>>");
											while (getchar() != '\n');
										}
										break;
									case 4:
										printf("请输入年龄:\n>>");
										while(scanf("%d",&in2)!=1){
											printf("格式错误!\n>>");
											while (getchar() != '\n');
										}
										break;
									case 5:
										break;
								}
								
								
									print_file(com_print,in1,in2) ;
									break;
							case 5:
								goto START;	
							 
							}//教师操作界面  
						
					}//while(1)
				}else{//学生 
				while(1){
					
					printf("输入命令:\n1 修改个人信息 \n2 查看作业 \n3 注销账号\n4 退出账号\n>>"); 
					int cmd;
					scanf("%d",&cmd);
					switch (cmd){
						case 1:
							int item;
							printf("请输入你要更改的信息名(1,用户名,2,班级,3,年龄)\n>>");
							while(scanf("%d",&item)!=1){
								printf("格式错误!\n>>");
								while (getchar() != '\n');
							}
							if (delete_change(1,item,stucode,".\\codelist.txt")==1)printf("修改成功!\n");
							else printf("修改失败\n");
							break;
						case 2:
							homework_view(stucode);
							break;
						case 3:
							printf("你确定吗?确定请输入:yes,输入no退出\n>>");
							char cmddd[100];
					ZHUXIAO2:
							 while(scanf("%s",&cmddd)!=1){
								printf("格式错误!\n>>");
								while (getchar() != '\n');
							}
							if(strcmp(cmddd,"yes")==0){
								if (delete_change(0,0,stucode,".\\codelist.txt")==1) printf("注销成功\n"); 
								
							}else if(strcmp(cmddd,"no")==0){
								break;
							}else{
								printf("输入错误,请重新输入!\n>>");
								goto ZHUXIAO2;
							}
						case 4:
							goto START;
						}
					}
				}
				break;
			default:
				printf("格式错误!\n");
				return 0;
				
		}//switch 
	}//循环 
	return 0;
} 





char* yzcode(){
	int srnum;
	static char re[10];
	srand(time(0));
	int a=0;
	for (int i=0;i<10;i++){
		
		srnum=rand()%20+40;
		if(srnum<=57&&srnum>=48){
			re[a]=char(srnum);
			a++;
		}
		re[a]='\0'; 
	}
	return re;
}

int delete_change(int jud,int item,int stucode,char* filepath){
	FILE*fp=fopen(".\\temp.txt","w"); 
	if (fp==NULL){
			perror("open file falled:");
			return 0;
        }
	
	
	
	FILE*fq=fopen(filepath,"a+");
		if (fq==NULL){
			perror("open file falled:");
			return 0;
        }
        struct member stu;
    while(!(fscanf(fq,"%d %s %s %d %d %d\n",&stu.identity,&stu.user_name,&stu.myscode,&stu.class1,&stu.age1,&stu.stucode)==EOF)){
    	if(stu.stucode==stucode){
    		if(jud==0){
    			continue;//判断是删除还是修改 
			}else if(jud==1) {//修改 
				switch(item){
					case 1://用户名 
						printf("请输入新的用户名\n>>"); 
						char username[100];
						
						while(scanf("%s",&username)!=1){
							printf("格式错误!\n>>");
							while (getchar() != '\n');
						}
						fprintf(fp,"%d %s %s %d %d %d\n",stu.identity,username,stu.myscode,stu.class1,stu.age1,stu.stucode);
						break;
					case 2://班级
						printf("请输入新的班级\n>>");
						int class1;
						while(scanf("%d",&class1)!=1){
							printf("格式错误!\n>>");
							while (getchar() != '\n');
						}
						fprintf(fp,"%d %s %s %d %d %d\n",stu.identity,stu.user_name,stu.myscode,class1,stu.age1,stu.stucode);
						break;
					case 3://年龄 
						printf("请输入新的年龄\n>>");
						int age;
						while(scanf("%d",&age)!=1){
							printf("格式错误!\n>>");
							while (getchar() != '\n');
						}
						fprintf(fp,"%d %s %s %d %d %d\n",stu.identity,stu.user_name,stu.myscode,stu.class1,age,stu.stucode);
						break; 
				}
				
			}
    		
		}else fprintf(fp,"%d %s %s %d %d %d\n",stu.identity,stu.user_name,stu.myscode,stu.class1,stu.age1,stu.stucode);
		
	}
	fclose(fq);
	fclose(fp);
	if(remove(filepath)!=0){

		perror("remove");
		return 0;
	}
	if (rename( ".\\temp.txt",filepath) != 0) {
		perror("rename");
		return 0;
		}
	return 1;
}

void createfile(char *a)
{
	if(access(a,F_OK)!=0){
		char command[100];
		sprintf(command, "mkdir %s", a);
		system(command);//创建具体存储数据的文件夹 
	}
} 

void regist()
{
	FILE*fp=fopen("./codelist.txt","a+");
	if (fp==NULL){
		perror("open file falled:");//输出报错 
		return ;
	} 
	
	fseek(fp, 0, SEEK_END);//将文件指针移到末尾 
	
//	char user_name[100]={'\0'},myscode[100]={'\0'};
//	int identity=-1,stucode=-1,class1=-1,age1=-1;
    struct member stu; 
	printf("欢迎!学生请输入1,教师请输入2\n>>");
	while(scanf("%d",&stu.identity)!=1){
			printf("格式错误!\n>>");
			while (getchar() != '\n');
	} 
	
	
	if(stu.identity==1){
		printf("请输入班级\n>>"); 
		while(scanf("%d",&stu.class1)!=1){
			printf("格式错误!\n>>");
			while (getchar() != '\n');
		}
		
		printf("请输入年龄\n>>"); 
		
		while(scanf("%d",&stu.age1)!=1){
			printf("格式错误!\n>>");
			while (getchar() != '\n');
			
		}
	}
	printf("请输入学号(教职工号)\n>>");
	while (scanf("%d",&stu.stucode)!=1){
		printf("格式错误!\n>>");
		while (getchar() != '\n');
		
	}
	if(stu.identity==2) stu.stucode=-stu.stucode;//区别教职工号和学号 
Restartregist: 
	printf("请输入您的用户名\n>>");
	while(scanf("%s",&stu.user_name)!=1){
		printf("格式错误!\n>>");
		while (getchar() != '\n');
	}
	int jud=0;
	//这里判断是否重复 
	char filename[100]={'\0'};
	char filename2[100]={'\0'};
	char stucodde[100]={'\0'};
	itoa(stu.stucode,stucodde,10);
	if(jud==0){
	jud++;
		strcat(filename,".\\memdata\\");
		strcat(filename,stu.user_name);
		strcat(filename,".txt"); 
		strcat(filename2,".\\memdata\\");
		strcat(filename2,stucodde);
		strcat(filename2,".txt");
	}
		if(access(filename,F_OK)==0){
			printf("用户名已被注册,请重新输入!\n") ;
			goto Restartregist;
		}
	
Restartcode:
	printf("请输入密码\n>>");
	int i=0;
	while(scanf("%s",&stu.myscode)!=1){
		printf("格式错误!\n>>");
		while (getchar() != '\n');
	}
Rejustifycode:
	printf("请再次输入密码\n>>");
	char scode2[100];
	
	while(scanf("%s",&scode2)!=1){
		printf("格式错误!\n>>");
		while (getchar() != '\n');
	}
	
	if(strcmp(scode2,"-1")==0) goto Restartcode;
	if(strcmp(scode2,stu.myscode)!=0){
		printf("密码错误!");
		if(i!=0&&strcmp(scode2,"-1")!=0) printf("你可输入\"-1\"来重新设置密码\n");
		i++;
		goto Rejustifycode;
	}
	
	int a=fprintf(fp,"%d %s %s %d %d %d\n",stu.identity,stu.user_name,stu.myscode,stu.class1,stu.age1,stu.stucode);//ov
	fclose(fp);
	if(a){
		printf("注册成功!\n");
		 
		FILE*fq=fopen(filename2,"w");
		if (fq==NULL){
			perror("open file falled:");//输出报错 
			fclose(fq);
			return ;
        }
        fclose(fq);
		
	}else{
		printf("注册失败!\n");
	}
	
}

int login()
{
	char user_name[100],password[100];
	char user_name1[100],password1[100]; 
	/*	while(scanf("%d",&stu.class1)!=1){
			printf("格式错误!\n>>");
			while (getchar() != '\n');
		}*/
Login_begin1:
	printf("请输入用户名:(输入‘1’退出程序)\n>>");
	
	while(scanf("%s",&user_name)!=1){
		printf("格式错误!\n>>");
		while (getchar() != '\n');
	}
	
	if(!strcmp(user_name,"1")) return 0;
	printf("请输入密码\n>>");
	while(scanf("%s",&password)!=1){
		printf("格式错误!\n>>");
		while (getchar() != '\n');
	} 
	char* yz_code1=yzcode();
	printf("验证码为:%s\n请输入验证码\n>>",yz_code1);
	char yz_code[10];
Login_begin2:
	while(scanf("%s",&yz_code)!=1){
			printf("格式错误!\n>>");
			while (getchar() != '\n');
		}
	if(!strcmp(yz_code,yz_code1)){
			printf("验证码正确!\n");
	}else{
		printf("输入错误!请重新输入:\n>>"); 
		goto Login_begin2;
	}
	FILE*fp=fopen("./codelist.txt","r");
	if (fp==NULL){
		perror("open file falled:");//输出报错 
		return 0;
	}
	
	while(1){
		struct member stu;
		fscanf(fp,"%d %s %s %d %d %d\n",&stu.identity,&stu.user_name,&stu.myscode,&stu.class1,&stu.age1,&stu.stucode);
		if(!strcmp(stu.user_name,user_name)&&!strcmp(stu.myscode,password)){
			if (stu.identity==1)
			printf("欢迎你,%s同学!\n",stu.user_name);
			else{
				printf("欢迎你,%s老师!\n",stu.user_name);
			}; 
			fclose(fp);
			return stu.stucode;
		}
		if(feof(fp)){
			printf("用户名或密码错误!"); 
			goto Login_begin1; 
		}
	} 
}

void print_file(int type,char *chan1,int chan2)
{
	FILE*fp=fopen(".\\codelist.txt","r");
		if (fp==NULL){
			perror("open file falled:");//输出报错 
			return;
		} 
	struct member stu;
	printf("请输入你想要的查找模式:\n1.通过用户名查找\n2.通过学号查找\n3.打印班级学生\n4.打印指定年龄学生\n5.打印全部学生\n6.打印老师名单\n>>");
		int judge1=0;
		int judge2=0;
		int judge3=0;
		int judge4=0;
		int judge5=0;
		int judge6=0;
		switch(type){
		case 1:
			printf("\n");
			while(!(fscanf(fp,"%d %s %s %d %d %d\n",&stu.identity,&stu.user_name,&stu.myscode,&stu.class1,&stu.age1,&stu.stucode)==EOF)){
				if(!strcmp(stu.user_name,chan1)&&stu.identity==1){
					printf("用户名:%s\n班级:%d\n年龄:%d\n学号:%d\n",stu.user_name,stu.class1,stu.age1,stu.stucode);
					judge1++;
					break;
				}
			}
			if (judge1==0) printf("未找到指定文本qaq\n");
			break;
		case 2:
			printf("\n");
			while(!(fscanf(fp,"%d %s %s %d %d %d\n",&stu.identity,&stu.user_name,&stu.myscode,&stu.class1,&stu.age1,&stu.stucode)==EOF)){
				if(chan2==stu.stucode){
					printf("用户名:%s\n班级:%d\n年龄:%d\n学号:%d\n",stu.user_name,stu.class1,stu.age1,stu.stucode);
					judge2++;
					break;
				}
			}
			if (judge2==0) printf("未找到指定文本qaq\n");
			break;
		case 3:
			printf("\n");
			while(!(fscanf(fp,"%d %s %s %d %d %d\n",&stu.identity,&stu.user_name,&stu.myscode,&stu.class1,&stu.age1,&stu.stucode)==EOF)){
				if(chan2==stu.class1){
					if(judge3==0) printf("用户名   年龄   学号\n");
					judge3++;
					printf("%s  %d  %d\n",stu.user_name,stu.age1,stu.stucode);
				}
			}
			if (judge3==0) printf("未找到指定文本qaq\n");
			break;
		case 4:
			printf("\n");
			while(!(fscanf(fp,"%d %s %s %d %d %d\n",&stu.identity,&stu.user_name,&stu.myscode,&stu.class1,&stu.age1,&stu.stucode)==EOF)){
				if(chan2==stu.age1){
					if(judge4==0) printf("用户名   班级   学号\n");
					judge3++;
					printf("%s  %d  %d\n",stu.user_name,stu.class1,stu.stucode);
				}
			}
			if (judge4==0) printf("未找到指定文本qaq\n");
			break;
		case 5:
			printf("\n");
			while(!(fscanf(fp,"%d %s %s %d %d %d\n",&stu.identity,&stu.user_name,&stu.myscode,&stu.class1,&stu.age1,&stu.stucode)==EOF)){
				if(stu.identity==1){
					if(judge5==0) printf("用户名   班级   年龄   学号\n");
					judge5++;
					printf("%s  %d  %d  %d\n",stu.user_name,stu.class1,stu.age1,stu.stucode);
				}
			}
			if (judge5==0) printf("什么都没有欸!qaq\n");
			break;
		case 6:
			printf("\n");
			while(!(fscanf(fp,"%d %s %s %d %d %d\n",&stu.identity,&stu.user_name,&stu.myscode,&stu.class1,&stu.age1,&stu.stucode)==EOF)){
				if(stu.identity==2){
					
					judge6++;
					printf("%s\n",stu.user_name);
				}
			}
			if (judge6==0) printf("什么都没有欸!qaq\n");
			break;
	}
	
	printf("-------------------------------------------\n");
	
	fclose(fp);
}	

int homework(int teacode){
	
	struct member stu2;
	char teaname[100]={'\0'};
	
	FILE*fpp=fopen(".\\codelist.txt","r"); 
	if (fpp==NULL){
			perror("open file falled:");
			return 0;
        }
    while(!(fscanf(fpp,"%d %s %s %d %d %d\n",&stu2.identity,&stu2.user_name,&stu2.myscode,&stu2.class1,&stu2.age1,&stu2.stucode)==EOF)){
		if(stu2.stucode==teacode) {
			strcpy(teaname,stu2.user_name);
			break;
		}
	}
	fclose(fpp);
	
	char homework[4096];
	printf("请输入作业标题\n>>");
	char title[100];
	while(scanf("%s",&title)!=1){
		printf("格式错误!\n>>");
		while (getchar() != '\n');
	}
	char work_file[100]=".\\homework\\";
	strcat(work_file,title);
	strcat(work_file,"_.txt");
	char work_list;
	
	FILE*work=fopen(work_file,"a+");
	
	printf("请输入作业内容(输入-1退出)\n>>");
	char teach_name[100]="来自<"; 
	strcat(teach_name,teaname);
	strcat(teach_name,">老师的作业");
	fprintf(work,"%s\n",teach_name);
	while(1){
		while (getchar() != '\n');
		scanf("%[^\n]",&homework);
		if(strcmp(homework,"-1")==0) break; 
		fprintf(work,"%s\n",homework);
	}
	fclose(work);
	
	char worklist[4096]=".\\homework_list\\";
	strcat(worklist,title);
	strcat(worklist,"_worklist.txt");
	
	FILE*work_list1=fopen(worklist,"a+");
	if (work_list1==NULL){
		perror("open file falled:");//输出报错 
		return 0;
	} 
	
	FILE*fp=fopen(".\\codelist.txt","a+");
	if (fp==NULL){
		perror("open file falled:");//输出报错 
		return 0;
	} 
	
	printf("向全部学生布置作业,输入1\n向指定班级布置作业,输入2\n向特定学生布置作业,输入3\n>>");
	
	int cmd_work;
	struct member stu;
	int class2;
	char work_name[100]; 
	
	while(scanf("%d",&cmd_work)!=1){
		printf("格式错误!\n>>");
		while (getchar() != '\n');
	}
	switch(cmd_work){
		case 1:
			while(!(fscanf(fp,"%d %s %s %d %d %d\n",&stu.identity,&stu.user_name,&stu.myscode,&stu.class1,&stu.age1,&stu.stucode)==EOF)){
					fprintf(work_list1,"%d\n",stu.stucode);
				}
			break;
		case 2:
			printf("请输入要布置作业的班级(多次输入 输入-1退出)\n>>");
			while(1){
				while(scanf("%d",&class2)!=1){
					printf("格式错误!\n>>");
					while (getchar() != '\n');
				}
				if(class2==-1) break;
				while(!(fscanf(fp,"%d %s %s %d %d %d\n",&stu.identity,&stu.user_name,&stu.myscode,&stu.class1,&stu.age1,&stu.stucode)==EOF)){
					if(stu.class1==class2) fprintf(work_list1,"%d\n",stu.stucode);
				}
			} 
			break;
		case 3:
			printf("请输入要布置作业的学生(多次输入 输入-1退出)\n>>");
			while(1){
				while(scanf("%s",&work_name)!=1){
					printf("格式错误!\n>>");
					while (getchar() != '\n');
				}
				if(strcmp("-1",work_name)==0) break;
				while(!(fscanf(fp,"%d %s %s %d %d %d\n",&stu.identity,&stu.user_name,&stu.myscode,&stu.class1,&stu.age1,&stu.stucode)==EOF)){
					if(strcmp(stu.user_name,work_name)==0) fprintf(work_list1,"%d\n",stu.stucode);
				}
				
			}
			
		fclose(fp);
		fclose(work_list1);
	}
	return 1;
	
} 

int homework_view(int stucode){
	int jud=0;
	char zuoye[100][100]; 
    struct dirent *entry;
	DIR *dir;
    dir = opendir(".\\homework_list"); 
    if (dir == NULL) {
        perror("opendir");
        return 0;
    }

    while ((entry = readdir(dir)) != NULL) {//遍历所有名单 
    	if((strcmp(entry->d_name,".")==0)||(strcmp(entry->d_name,"..")==0)) continue;
    	char fileNAME[100]=".\\homework_list\\";
    	strcat(fileNAME,entry->d_name);
        
        FILE *file = fopen(fileNAME, "r");
        if (file == NULL) {
            perror("fopen1");
            return 0;
        }
        
        int stucode2;
        char workname[100]="-1";//为找到的作业名 
        while(fscanf(file,"%d\n", &stucode2)==1){
        	
        	if (stucode2==stucode){
        		strncpy(workname,entry->d_name,strlen(entry->d_name)-12);//找作业名单里有没有自己 
        		fclose(file);
        		break;
			}
		}
		
		if (strcmp(workname,"-1")!=0) {//如果有自己,打开作业目录,寻找对应作业并打印 
			DIR*dir_work = opendir(".//homework");
			if (dir_work == NULL) {
		        perror("opendir");
		        return 0;
    		}
    		
    		struct dirent *entry_work;
    		
			while ((entry_work = readdir(dir_work)) != NULL) {//遍历作业文件夹下所有作业 
				if((strcmp(entry_work->d_name,".")==0)||(strcmp(entry_work->d_name,"..")==0)) continue;
				if (strncmp(entry_work->d_name,workname,strlen(workname))==0){
					
			        char fileNAME2[100]=".\\homework\\";
    				strcat(fileNAME2,workname);
    				strcat(fileNAME2,".txt");
			        FILE *work = fopen(fileNAME2, "r");
			        if (work == NULL) {

						break;
			        }
					
					char text[4096];
					printf("------------------------\n");
					printf("%d.",jud+1) ;
					while(fscanf(work,"%s\n",&text)!=EOF){
						printf("%s\n",text);
					}
					
					strcpy(zuoye[jud],workname);
					jud++;
					fclose(work);
					
				}
				
			}
			closedir(dir_work);
			
		}
		
        fclose(file);
    }

    closedir(dir);
    if (jud==0) printf("骚年,你太幸运了,一个作业都没有哇!!\n");
    else {
    	printf("---------------------------------------\n");
    	int cmd;
    	while(1){
    		printf("请输入你想提交的作业序号(输入-1退出)\n>>"); 
    		scanf("%d",&cmd);
    		if(cmd==-1) break;
			char name[100]=".\\homework_list\\";
			strcat(name,zuoye[cmd-1]);
			strcat(name,"worklist.txt");
			
			FILE*fp=fopen(name,"a+");
			if (fp == NULL) {
		        perror("fopen");
		        return 0;
		    }
		    FILE*fq=fopen(".\\homework_list\\temp.txt","w"); 
			if (fq==NULL){
				perror("open file falled:");
				return 0;
	        }
	        int tempcode;
			while(fscanf(fp,"%d\n",&tempcode)!=EOF){
				if(tempcode==stucode) continue;
				fprintf(fq,"%d\n",tempcode);
			}
			
			fclose(fq);
			fclose(fp);
			if(remove(name)!=0){
		
				perror("remove");
				return 0;
			}
			if (rename( ".\\homework_list\\temp.txt",name) != 0) {
				perror("rename");
				return 0;
				}
				printf("提交成功!\n");
			return 1;
		}	
	}
	return 1;
}

后记:

完成这个程序给我的最大感受:debug要有耐心。。

一个bug看三四个小时,真的很痛苦wwwwww

(晚上一点竟然不困,也是很神奇了)

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值