在c / c ++中一次从文件中读取某些行

时间:2009-12-18 16:06:02

标签: c++ user-interface qt file scroll

所以我有一个使用QT,c ++设计的gui。我在文本文件中有大量数据,我想以这种方式阅读:

首先加载50行,当用户向下滚动时,下载50行,然后加载一行。当用户向上滚动时加载前50行。

谢谢。

3 个答案:

答案 0 :(得分:1)

将您的应用与sliderMovedsliderReleasedQSlider信号相关联,然后阅读您要显示的50行。或使用valueChange事件。

答案 1 :(得分:1)

最简单的解决方案是将文件加载到内存中并从那里进行操作:

std::vector<std::string>    lines;

std::string  line;
while(std::getline(file,line)
{
    lines.push_back(line);
}

如果文件很大。
然后,您需要构建一个文件索引,告诉您每行开始的确切位置。

std::vector<std::streampos>    index;
index.push_back(file.tellg());

std::string  line;
while(std::getline(file,line)
{
    index.push_back(file.tellg());
}
file.setg(0);
file.clear();  // Resets the EOF flag.

获得索引后。您可以跳转文件并阅读任何特定的行。

int jumpTo = 50;
file.seekg(index[jumpTo]); // Jump to line 50.
//
// Read 50 lines. Do not read past the end
// This will set the EOF flag and future reads will fail.
for(int loop=0;loop < 50 && ((jumpTo + loop) < index.size());++loop)
{
    std::string line;
    std::getline(file,line);
}

答案 2 :(得分:0)

我猜这个文件可能很大(比如在Gigabyte范围内)。

假设可移植性不是问题,您可能需要使用内存映射io。在许多unix系统上,您拥有mmap command

可以找到一个很好的教程here

如果您需要为Windows系统执行此操作,可以找到Windows等效示例here

mmap有效地将文件映射到当前进程内存空间。当想要读取该文件的一些内容时,操作系统会将正在查看的文件的位复制到RAM中供用户访问。这是使用相同的机制完成的,该机制允许操作系统将内存从空闲进程移动到磁盘上,直到再次需要它为止。

唯一棘手的问题是将文件块分成几行。