📄 dirvecfun.cpp
字号:
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
using namespace std;
#include "directory.h"
#include "prompt.h"
#include "tvector.h"
// illustrates templated functions, function objects
// find large files
struct SizePred // satisfies if DirEntry::Size() >= size
{
SizePred(int size)
: mySize(size)
{}
bool Satisfies(const DirEntry& de) const
{
return de.Size() >= mySize;
}
int mySize;
};
// find recent files
struct DatePred // satisfies if DirEntry::GetDate() >= date
{
DatePred(const Date& d)
: myDate(d)
{ }
bool Satisfies(const DirEntry& de) const
{
return !de.IsDir() && de.GetDate() >= myDate;
}
Date myDate;
};
void Print(const tvector<DirEntry>& list)
// post: all entries in list printed, one per line
{
int k;
DirEntry de;
for(k=0; k < list.size(); k++)
{ de = list[k];
cout << setw(10) << de.Size() << "\t" << setw(12)
<< de.Name() << "\t" << de.GetDate() << endl;
}
cout << "---\n# entries = " << list.size() << endl;
};
template <class Iter, class Pred, class Kind>
void IterToVectorIf(Iter& it, const Pred& p, tvector<Kind>& list)
// post: all items in Iter that satisfy Pred are added to list
{
for(it.Init(); it.HasMore(); it.Next())
{ if (p.Satisfies(it.Current()))
{ list.push_back(it.Current());
}
}
}
int main()
{
Date today;
string dirname = PromptString("directory ");
int size = PromptRange("min file size",1,300000);
int before = PromptRange("# days before today",0,300);
DatePred datePred(today-before); // find files within before days of today
SizePred sizePred(size); // find files larger than size
DirStream dirs(dirname); // iterate over directory entries
tvector<DirEntry> dirvec; // store satisfying entries here
IterToVectorIf(dirs,datePred,dirvec);
cout << "date satisfying" << endl << "---" << endl;
Print(dirvec);
dirvec.resize(0); // remove old entries
cout << endl << "size satisfying"<< endl << "---" << endl;
IterToVectorIf(dirs,sizePred,dirvec);
Print(dirvec);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -