12.1 最后K行

     《程序员面试金典》(第六版)习题:仅为记录一下以加强印象,不为商业用途,如有侵权请联系删除。以下源码和解释参考了书中源码以及解释。
     算法只读取一次文件。算法首先建立一个有k个元素的string数组,然后读取文件的每一行然后放入数组中对应的元素,第一行放入 i n d e x = 0 index=0 index=0的数组元素,…,第k行放入 i n d e x = k − 1 index=k-1 index=k1的数组元素,…,第n行放入 i n d e x = ( n − 1 ) index=(n-1)%k index=(n1)的数组元素。所以如果文件的行数远远大于k时,数组中的元素会不断的被覆盖为新的行的内容,但是内存中永远只保留有文件中的k行。算法最后会按在原文件中原有的行顺序输出文件的最后K行,例如如果文件有10行, k = 3 k=3 k=3,则算法最后会按在原文件中原有的行顺序输出第8行,第9行,第10行的内容而不会出现打乱原有的行顺序而输出文件的最后K行。 i n p u t . t x t input.txt input.txt文件见10.7节。

void printLastKLines(int k, string filePath)
{
    ifstream inputFile;
    inputFile.open(filePath, ifstream::in);
    assert(inputFile.is_open());
    vector<string> lines(k);
	int size = 0;

    while (inputFile.peek()!=EOF)
	{
		getline(inputFile, lines[size % k]);
		size++;
    }
    inputFile.close();
    //下面的代码保证算法最后会按在原文件中原有的行顺序输出文件的最后K行
	int start = size > k?(size % k) :0;
	int count = min(k, size);
	for (int i = 0; i < count; i++)
	{
		cout << lines[(start + i) % k] << endl;
	}
}
int main()
{
	int k = 10;
	string filePath = "D:\\input.txt";
	printLastKLines(k,filePath);
	
}
 
图1.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qqssss121dfd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值