一位用户今天早些时候发布了一个类似的问题,由于其含糊不清,很快就被关闭了。因此,由于我没有在互联网上找到专门的文章来解决这个问题,所以用解决方案重新发布了这个问题。
要求是读取和打印文件的所有行,除了最后一个 K。
假设一个文件包含如下文本:
Hello there!
My name is
Mr. XYZ
I like playing football
如果 K 是 2,那么它应该打印除最后 2 之外的所有行。即:
Hello there!
My name is
一位用户今天早些时候发布了一个类似的问题,由于其含糊不清,很快就被关闭了。因此,由于我没有在互联网上找到专门的文章来解决这个问题,所以用解决方案重新发布了这个问题。
要求是读取和打印文件的所有行,除了最后一个 K。
假设一个文件包含如下文本:
Hello there!
My name is
Mr. XYZ
I like playing football
如果 K 是 2,那么它应该打印除最后 2 之外的所有行。即:
Hello there!
My name is
这可以通过创建一个大小为 K 的窗口然后遍历文件直到窗口的右端到达文件的末尾来轻松解决。基本步骤是:
遍历文件的前 K 行而不打印它。
使用另一个流对象打开同一个文件。
现在同时遍历两个流,使第一个流总是在第二个流之前 K 行。
在第二个第一个流有效时运行一个循环。在循环中,还要通读第一个流并继续打印这些行。
代码是
#include<iostream>
#include<fstream>
#include<string>
int main()
{
fstream fs;
fs.open("abc.txt",ios::in);
string str;
int K = 2;
while(getline(fs,str) && K>1)
{
K--;
}
if(K==1)
{
fstream fsNew;
fsNew.open("abc.txt",ios::in);
while(getline(fs,str))
{
getline(fsNew,str);
cout<<str;
}
}
cin.ignore();
}
为什么不简单地将行放入 astd::deque
并在其大小较大时转储一个元素k
?
#include<iostream>
#include<fstream>
#include<deque>
int main()
{
std::fstream fs;
fs.open("output.txt",std::ios::in);
std::deque<std::string> deq;
std::string str;
int k=2;
while(std::getline(fs,str))
{
deq.push_back(str);
if(deq.size() > k)
{
std::cout <<deq.front()<<std::endl;
deq.pop_front();
}
}
}