📄 fileoper.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 + -