所以我有一个使用QT,c ++设计的gui。我在文本文件中有大量数据,我想以这种方式阅读:
首先加载50行,当用户向下滚动时,下载50行,然后加载一行。当用户向上滚动时加载前50行。
谢谢。
答案 0 :(得分:1)
将您的应用与sliderMoved的sliderReleased或QSlider
信号相关联,然后阅读您要显示的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中供用户访问。这是使用相同的机制完成的,该机制允许操作系统将内存从空闲进程移动到磁盘上,直到再次需要它为止。
唯一棘手的问题是将文件块分成几行。