⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fileoper.cpp

📁 学生成绩管理系统。实现学生的添加 删除和各科成绩管理。
💻 CPP
字号:
#include "main.h"
#include <fstream>
#include <time.h>
bool saved=true;
char currentfile[128]={0};
char currentcomment[128]={0};
bool filelistfirst=true;
extern int *filtersort, filterstucnt;
extern bool showscore;

const char datafile[10][16]={"Sheet0.score","Sheet1.score","Sheet2.score","Sheet3.score","Sheet4.score","Sheet5.score","Sheet6.score","Sheet7.score","Sheet8.score","Sheet9.score"};
bool available[10]={0};

//================= ChooseSave ====================
void choosesave()
{
	int fid, ch;
	char ss[20];
	bool retry=true, relist=true;
	FuncRunResult frr;

	while (retry)
	{
		if (relist)
		{
			relist=false;
			showheader();
			cout<<"            我想...\n\n";

			if (currentfile[0]==0)
			{	cout<<"                 保存档案为...                                 1\n\n"; }
			else
			{	cout<<"                 保存到打开了的档案                        Enter\n\n"
					<<"                 另存档案为...                                 1\n\n"; }

			cout<<"                 导出当前表单到 txt - 文本文件(制表符分隔)...  2\n\n"
				<<"                 导出当前表单到 csv - 文本文件(逗号分隔)...    3\n\n"
				<<"                 返回                                        Esc\n\n";
		}

		ch=scankey(0,0,KEY_ENTER,'1','2','3',KEY_ESC,0);
		switch (ch)
		{
		case 13:
			if (currentfile[0]!=0)
			{
				cout<<"\n正在写入..."<<endl;
				savethis(currentfile);
				cout<<"写入成功。"<<endl;
				sleep(1000);
				retry=false;
			}
			break;

		case '1':
			fid=savelist();
			if (fid==-1) { relist=true; break; } else;
			
			cout<<"\n请输入档案描述(直接回车则使用当前时间作为描述):";
			cin.getline(currentcomment,128);
			if (currentcomment[0]==0)
			{
				strcpy(currentcomment,_strdate(ss));
				strcat(currentcomment," ");
				strcat(currentcomment,_strtime(ss));
			}

			cout<<"\n正在写入..."<<endl;
			savethis((const char*)datafile[fid]);
			cout<<"写入成功。"<<endl;
			sleep(1000);
			retry=false;
			break;
			
		case '2':
			frr=savecsv(false);
			retry=relist=(frr==FRR_FAIL || frr==FRR_SKIP);
			break;
		case '3':
			frr=savecsv(true);
			retry=relist=(frr==FRR_FAIL || frr==FRR_SKIP);
			break;
		case 27:
			retry=false;
			break;

		default: ;
		}
	}
}

//================= LoadList ====================
int loadlist()
{
	showfilelist();
	cout<<"\n\n                             请选择要读取的文件:"<<flush;

	int ch;
	bool retry=true;
	while (1)
	{
		ch=scankey(0,1,KEY_ESC,0);
		if (ch==27) return -1;
		if (available[ch-48]) { cout<<ch-48<<endl; return ch-48; }
	}
}

//================= LoadData ====================
FuncRunResult loaddata(const char* filename)
{
	int fid,ch;
	bool first=true;
	
	while (1)
	{
		showheader();

		if (first)
		{
			first=false;
			if (filename!=NULL)
			{
				cout<<"欢迎使用 YoungCat 制作的“成绩管理系统”。\n\n读取 "<<filename<<" ...\n";
				if (loadthis(filename)) return FRR_SUCCEED;

				cout<<"读取文件失败!\n\n\n"
					<<"                      现在我想...\n\n";
			}
			else
			{
				cout<<"\n                    欢迎使用 YoungCat 制作的“成绩管理系统”。\n\n"
					<<"                    我想...\n\n";
			}
		}
		else
		{
			cout<<"                      现在我想...\n\n";
		}

		cout<<"                             新建一张成绩单     1\n\n"
			<<"                             读取档案...        2\n\n"
			<<"                             退出系统         Esc\n\n";

		ch=scankey(0,0,'1','2',KEY_ESC,0);
		switch (ch)
		{
		case '1':
			return FRR_SUCCEED;

		case '2':
			fid=loadlist();
			if (fid==-1) break; else;
			cout<<"\n正在读取..."<<endl;
			if (loadthis((const char*)datafile[fid])) return FRR_SUCCEED;
			cout<<"读取失败!"<<endl;
			sleep(1000);
			break;

		case KEY_ESC:
			return FRR_STOP;
		}
	}
}

//================= LoadThis ====================
bool loadthis(const char* filename)
{
	ifstream fin;
	fin.open(filename);
	if (!fin) return false;
	if (fin.eof()) return false;

	char ss[64]={0};
	fin.getline(ss,64); fin.getline(ss,64); fin.getline(ss,64);
	fin.getline(currentcomment,128);

	int scnt=0,ccnt=0, i=0,j=0, cc=1, id=0, *sort=NULL;

	fin>>ccnt>>scnt; fin.ignore();
	for (i=0; i<ccnt; i++) { fin.getline(ss,64); s.AddCourse(ss); }
	for (i=1; i<=ccnt; i++) { fin>>cc; s.SetCourseCoefficient(i,cc); }
	sort=s.CourseSort();
	for (i=0; i<ccnt; i++) fin>>sort[i];

	for (i=0; i<scnt; i++)
	{
		if (ccnt!=0) fin.ignore();
		id=s.AddStudent();
		fin.getline(ss,64); s.SetStuNum(id,ss);
		fin.getline(ss,64); s.SetStuName(id,ss);
		for (j=1; j<=ccnt; j++) { fin>>cc; s.SetScoreInt(i,j,cc,0,0,0); }
		s.Calculate(i);
	}

	sort=s.StudentSort();
	for (i=0; i<scnt; i++) fin>>sort[i];

	fin.close();
	strcpy(currentfile,filename);
	saved=true;
	return true;
}

//================= SaveCsv ====================
FuncRunResult savecsv(bool comma)
{
	cout<<"输入文件名(直接回车为放弃):";
	char f[100]={0},ff[5];
	cin.getline(f,100);
	if (0==f[0]) return FRR_SKIP;

	strcpy(ff,f+strlen(f)-4);
	strlwr(ff);
	if (comma) { if (strcmp(ff,".csv")!=0) strcat(f,".csv"); }
	else	   { if (strcmp(ff,".txt")!=0) strcat(f,".txt"); }

	ofstream fout;
	fout.open(f);
	if (!fout)
	{
		cout<<"打开 "<<f<<" 失败!"<<flush;
		sleep(1000);
		return FRR_FAIL;
	}

	cout<<"正在保存 "<<f<<" ..."<<flush;

	char ss[64]={0}, splitter=(comma?',':'\t');
	fout<<currentcomment<<endl;
	fout<<"学号"<<splitter<<"姓名";

	int scnt=0,ccnt=0, i=0,j=0, cc=1, id=0, *sort=NULL;
	ccnt=s.GetCourseCount();
	
	for (i=0; i<=ccnt; i++) fout<<splitter<<s.GetCourseName(i,true);
	fout<<endl;

	if (filterstucnt==0)
	{
		scnt=s.GetStudentCount();
		sort=s.StudentSort();
	}
	else
	{
		scnt=filterstucnt;
		sort=filtersort;
	}
	
	for (i=0; i<scnt; i++)
	{
		fout<<'\"'<<s.GetStuNum(sort[i])<<'\"'<<splitter<<'\"'<<s.GetStuName(sort[i])<<'\"';

		if (showscore)
		{	for (j=0; j<=ccnt; j++) fout<<splitter<<s.GetScoreStr(sort[i],j,false,true); }
		else
		{	for (j=0; j<=ccnt; j++) fout<<splitter<<s.GetPointStr(sort[i],j,false,true); }

		fout<<endl;
	}

	fout.close();
	cout<<"\n保存成功。"<<flush;
	sleep(1000);
	return FRR_SUCCEED;
}

//================= SaveGraph ====================
void savegraph(char screen[18][70])
{
	showheader();
	cout<<"输入文件名(直接回车为放弃):";
	char f[100]={0},ff[5];
	cin.getline(f,100);
	if (0==f[0]) return;

	strcpy(ff,f+strlen(f)-4);
	strlwr(ff);
	if (strcmp(ff,".txt")!=0) strcat(f,".txt");
	
	int i;
	ofstream fout;
	fout.open(f);
	if (!fout)
	{
		cout<<"打开 "<<f<<" 失败!"<<flush;
		sleep(1000);
	}
	else
	{
		cout<<"正在保存 "<<f<<" ..."<<flush;
		for (i=0; i<=17; i++) fout<<rtrim(screen[i])<<endl;
		fout.close();
		cout<<"\n保存成功。"<<flush;
		sleep(1000);
	}
}

//================= SaveList ====================
int savelist()
{
	showfilelist();
	cout<<"\n\n                             请选择要写入的文件:"<<flush;

	char ch,cch;
	bool rretry;
	while (1)
	{
		ch=scankey(0,1,KEY_ESC,0);
		if (ch==27) return -1; else;

		if (!available[ch-48])
		{
			cout<<ch<<endl;
			return ch-48;
		}
		else
		{
			cout<<ch-48<<"\n\n                             文件已存在,覆盖?Y/N ";
			rretry=true;
			cch=scankey(0,0,'Y','y','N','n',KEY_ESC,0);
			if (cch=='y')
			{
				cout<<cch<<endl;
				return ch-48;
			}
			else
			{
				showfilelist();
				cout<<"\n\n                             请选择要写入的文件:"<<flush;
			}
		}
	}
}

//================= SaveThis ====================
bool savethis(const char* filename)
{
	ofstream fout;
	fout.open(filename);
	if (!fout) return false;

	char ss[64]={0};
	fout<<"### ScoreManagement(YoungCat) Sheet File ###\n### DO NOT EDIT ###\n"<<endl;
	fout<<currentcomment<<endl;

	int scnt=0,ccnt=0, i=0,j=0, cc=1, id=0, *sort=NULL;
	student* st=NULL;
	scnt=s.GetStudentCount(); ccnt=s.GetCourseCount();
	fout<<ccnt<<' '<<scnt<<endl;
	for (i=1; i<=ccnt; i++) fout<<s.GetCourseName(i)<<endl;
	for (i=1; i<=ccnt; i++) fout<<s.GetCourseCoefficient(i)<<(i==ccnt?'\n':'\t');
	sort=s.CourseSort();
	for (i=0; i<ccnt; i++) fout<<sort[i]<<(i==ccnt-1?'\n':'\t');
	fout<<flush;

	for (i=0; i<scnt; i++)
	{
		st=s.Stu(i);
		fout<<st->num<<endl;
		fout<<st->name<<endl;
		for (j=1; j<=ccnt; j++) fout<<st->score[j].score<<(j==ccnt?'\n':'\t');
		fout<<flush;
	}

	sort=s.StudentSort();
	for (i=0; i<scnt; i++) fout<<sort[i]<<(i==scnt-1?'\n':'\t');
	fout<<flush;
	fout.close();

	strcpy(currentfile,filename);
	filelistfirst=true;
	saved=true;
	return true;
}

//================= ShowFileList ====================
void showfilelist()
{
	static char ss[10][80]={0};
	int i,j;

	if (filelistfirst)
	{
		filelistfirst=false;
		cout<<"读取档案列表中..."<<endl;

		ifstream fin[10];

		for (i=0; i<10; i++)
		{
			fin[i].open(datafile[i]);
			if (!fin[i])
			{
				strcpy(ss[i],"(无档案)");
			}
			else
			{
				for (j=1; j<=4; j++)
				{
					if (!(fin[i].eof())) fin[i].getline(ss[i],80); else { strcpy(ss[i],"(无档案)"); break; }
				}
				if (j==5) available[i]=true;
			}
			fin[i].close();
		}
	}

	showheader();
	cout<<"                              ----- 档案目录 -----";
	for (i=1; i<=9; i++) cout<<"\n                              "<<i<<". "<<ss[i];
	cout<<"\n                              0. "<<ss[0];
	cout<<"\n                              ( Esc. 退出 )";
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -