习题一
遍历含有学生提交作业的文件夹,并找出相应学生(预先输入该学生的学号)的有效文件(当天作业当天提交的次数,程序文件以当天布置作业的时间命名)
void listFiles(const char * dir);
定义遍历文件夹的函数 listFiles
void listFiles(const char * dir) { char dirNew[200]; strcpy(dirNew, dir); strcat(dirNew, "\*.*"); intptr_t handle; _finddata_t findData; handle = _findfirst(dirNew, &findData); if (handle == -1) return; do { if (findData.attrib & _A_SUBDIR)//.attrib表示文件的属性 { if (strcmp(findData.name, ".") == 0 || strcmp(findData.name, "..") == 0) continue; strcpy(dirNew, dir); strcat(dirNew, "\"); strcat(dirNew, findData.name); listFiles(dirNew); } else { if(strstr(findData.name, number)) { char strTime[100] = {0}; unixTime2Str(findData.time_write, strTime, sizeof(strTime)); if(strstr(findData.name,strTime)) { m[findData.name]++; } } } } while (_findnext(handle, &findData) == 0); _findclose(handle); }
遍历文件夹的函数使用#include <io.h>头文件下的_finddata_t结构体来获取文件的属性.attrib,若文件属性为_A_SUBDIR(目录directory)则继续向下打开文件夹查找,直到文件的属性不为_A_SUBDIR为止
匹配所查找的学生与其对应的.cpp文件所用的时strstr()函数,通过在文件名中查找学号的子串来确定所找的文件,查找时间也是通过同样的方法,只不过.time_write返回的最后修改时间用得时unix时间戳,
需要函数将其转化为标准时间
完整代码
#include <bits/stdc++.h> #include <io.h> using namespace std; int sum=0; map<string,int> m; map<string,int>::iterator it; void listFiles(const char * dir, char * number);//遍历目录 void unixTime2Str(int n, char strTime[], int bufLen);//将unix时间戳转化为标准时间 int main() { int n; char dir[200]; cout<<"Enter total number of students: "; cin>>n;//输入查找的人数 cin.ignore();//删除流中的 cout<<"Enter a directory: "; cin.getline(dir, 200);//输入目录 while(n--) { sum=0; char number[20]; cout<<"Enter student number: "; cin.getline(number, 20); listFiles(dir,number); for(it=m.begin();it!=m.end();it++) { if(it->second>=1)//迭代排除同一天所交的相同作业 sum++; } m.clear();//清空map cout<<"Valid assignments submitted on the day: "; cout<<sum<<endl; } return 0; } void listFiles(const char * dir, char * number) { char dirNew[200]; strcpy(dirNew, dir); strcat(dirNew, "\*.*"); intptr_t handle; _finddata_t findData; handle = _findfirst(dirNew, &findData); if (handle == -1) return; do { if (findData.attrib & _A_SUBDIR)//.attrib表示文件的属性 { if (strcmp(findData.name, ".") == 0 || strcmp(findData.name, "..") == 0) continue; strcpy(dirNew, dir); strcat(dirNew, "\"); strcat(dirNew, findData.name); listFiles(dirNew,number); } else { if(strstr(findData.name, number)) { char strTime[100] = {0}; unixTime2Str(findData.time_write, strTime, sizeof(strTime)); if(strstr(findData.name,strTime)) { m[findData.name]++; } } } } while (_findnext(handle, &findData) == 0); _findclose(handle); } void unixTime2Str(int n, char strTime[], int bufLen) { struct tm tm = *localtime((time_t *)&n); strftime(strTime, bufLen - 1, "_%m%d_", &tm); strTime[bufLen - 1] = '