方案一:
采用比较粗暴的方法,先遍历一遍文件,计算出文件的行数N,然后再从头遍历一遍文件,并输出第N-K行到第N行。
void solution1(const string& filePath,const int K)
{
fstream in(filePath);
int linesCount = 0;
string lineStr;
while(!in.eof())//遍历一遍求取文件行数
{
getline(in,lineStr);
++linesCount;
}
in.close();
in.open(filePath);
while(!in.eof())//重新遍历文件,输出最后K行
{
getline(in,lineStr);
if(linesCount<=K)
{
cout<<lineStr<<endl;
}
--linesCount;
}
in.close();
}
方案二:
由于方案一需要遍历两次文件,效率不高。本方案只需遍历一次文件,就可以找出最后的K行。采用一个大小为K的循环数组来记录最新的K行,每次读取新的一行时,都用最新的一行替换掉数组中旧的一行。遍历完文件后,数组中保存的便是最后的K行,按由旧到新的顺序输出即可。
void solution2(const string& filePath, const int K)
{
fstream in(filePath);
string *recordK = new string[K];
int lines = 0;
while (!in.eof())//遍历文件,并更新最新的K行
{
getline(in,recordK[lines % K]);
++lines;
}
int start,count;//计算开始位置
if (lines<K)
{
start = 0;
count = lines;
}
else
{
start = lines % K;
count = K;
}
for (int i=0;i<K;++i)
{
cout<<recordK[(start+i) % K]<<endl;
}
in.close();
}