访问文本文件c ++中的最后6行

时间:2014-06-19 07:02:10

标签: c++ file

我想使用c ++访问文本文件中的最后6行。任何人都可以为我提供一个在恒定时间内到达那里的代码吗?提前致谢。 :)

fstream myfile("test.txt");
myfile.seekg(-6,ios_base::end);
string line;
while(getline(myfile,line))
{
    if(vect.size() != VSIZE)
    {
        vect.push_back(line);
    }
    else
    {
        vect.erase(v.begin());
        vect.push_back(line);
    }
}

似乎没有工作...... VSIZE是6 ...请向我提供帮助和工作代码。

4 个答案:

答案 0 :(得分:2)

这一行:

myfile.seekg(-6,ios_base::end);

寻找文件结尾前的第6个字节,而不是6行。您需要向后计算换行或从头开始。因此,如果删除上面的行,您的代码应该可以正常工作。

答案 1 :(得分:0)

This回答解释了为什么你所做的事情无法奏效。下面我将解释一下将起作用。

  1. 以二进制模式打开文件。
  2. 从开始存储位置向前读取' \ n'在长度为6的循环缓冲区中。(boost :: circular_buffer可以帮助)
  3. 从环形缓冲区中的最小位置开始转储文件内容。
  4. 第2步可以通过寻找end-X来改进,其中X是通过文件末尾的某种二分法派生的。

答案 2 :(得分:0)

这是一项非常难的事情,需要考虑几个边缘情况。

一般来说,策略是:

  1. 以二进制模式打开文件,以便查看每个字节。
  2. 寻找(结束 - N),其中N是任意缓冲区的大小。大约1K应该这样做。
  3. 将N个字节读入缓冲区。向后扫描寻找LF字符(' \ n)。如果有的话,请在最后省略一个。
  4. 每一行都在LF之后开始,所以向后计算行数,直到达到6。
  5. 如果您没有找到6,那么向后搜索另外N个字节,读取另一个缓冲区并继续扫描。
  6. 如果您到达文件的开头,请停止。
  7. 我将代码留作练习。

答案 3 :(得分:0)

最简单的方法可能只是mmap()文件。这将其内容放入您的虚拟地址空间,因此您可以轻松地从最后六行结束时扫描它。

由于mmapping文件会让你觉得整个文件存在于一个大缓冲区的内存中而没有实际加载你不需要的部分,它既避免了不必要的I / O又减轻了你管理不断增长的缓冲区的负担当你向后搜索行结尾时。