所以我有一個GUI,使用QT,C++設計。我在文本文件中有大量數據,我想以這種方式閱讀:從文件中讀取某些行在C/C++
加載前50行,當用戶向下滾動時加載下50行等等。當用戶滾動加載之前的50行時。
謝謝。
所以我有一個GUI,使用QT,C++設計。我在文本文件中有大量數據,我想以這種方式閱讀:從文件中讀取某些行在C/C++
加載前50行,當用戶向下滾動時加載下50行等等。當用戶滾動加載之前的50行時。
謝謝。
最簡單的解決辦法是將文件從加載到內存中,並對其進行操作:
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);
}
將您的應用程序連接到QSlider
的sliderMoved或sliderReleased信號並讀取您想要顯示的50行。或使用valueChange事件。
我在猜測這個文件可能是巨大的(比如在技嘉範圍內)。
假設可移植性不是問題,您可能需要使用內存映射io。在很多unix系統上,您有mmap command。
一個很好的教程可以找到here。
如果您需要爲Windows系統執行此操作可以找到一個Windows等效示例here。
mmap有效地做的是將文件映射到當前進程的內存空間。當需要讀取文件的一部分時,操作系統會將所查看文件的各個位拷貝到RAM中供用戶訪問。這是通過使用相同的機制完成的,該機制允許操作系統將內存從空閒進程移動到磁盤上,直到再次需要它爲止。
唯一棘手的問題是將文件塊分成幾行。
我在使用xcode的mac上,我應該提到這一點。 – infinitloop 2009-12-18 17:38:39
會索引影響性能? – infinitloop 2009-12-18 17:15:01
以什麼方式影響性能? – 2009-12-18 17:29:25
可以說用戶滾動得非常快,會造成某種抖動或滯後? – infinitloop 2009-12-18 17:37:13