-4

一位用户今天早些时候发布了一个类似的问题,由于其含糊不清,很快就被关闭了。因此,由于我没有在互联网上找到专门的文章来解决这个问题,所以用解决方案重新发布了这个问题。

要求是读取和打印文件的所有行,除了最后一个 K。

假设一个文件包含如下文本:

Hello there!
My name is
Mr. XYZ
I like playing football

如果 K 是 2,那么它应该打印除最后 2 之外的所有行。即:

Hello there!
My name is
4

2 回答 2

1

这可以通过创建一个大小为 K 的窗口然后遍历文件直到窗口的右端到达文件的末尾来轻松解决。基本步骤是:

  1. 遍历文件的前 K 行而不打印它。

  2. 使用另一个流对象打开同一个文件。

  3. 现在同时遍历两个流,使第一个流总是在第二个流之前 K 行。

  4. 在第二个第一个流有效时运行一个循环。在循环中,还要通读第一个流并继续打印这些行。

代码是

#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();
}
于 2013-08-22T18:26:55.667 回答
1

为什么不简单地将行放入 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();
            }
    }

}
于 2013-08-22T19:25:42.273 回答