2009-12-18 72 views
1

所以我有一個GUI,使用QT,C++設計。我在文本文件中有大量數據,我想以這種方式閱讀:從文件中讀取某些行在C/C++

加載前50行,當用戶向下滾動時加載下50行等等。當用戶滾動加載之前的50行時。

謝謝。

回答

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); 
} 
+0

會索引影響性能? – infinitloop 2009-12-18 17:15:01

+0

以什麼方式影響性能? – 2009-12-18 17:29:25

+0

可以說用戶滾動得非常快,會造成某種抖動或滯後? – infinitloop 2009-12-18 17:37:13

0

我在猜測這個文件可能是巨大的(比如在技嘉範圍內)。

假設可移植性不是問題,您可能需要使用內存映射io。在很多unix系統上,您有mmap command

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

如果您需要爲Windows系統執行此操作可以找到一個Windows等效示例here

mmap有效地做的是將文件映射到當前進程的內存空間。當需要讀取文件的一部分時,操作系統會將所查看文件的各個位拷貝到RAM中供用戶訪問。這是通過使用相同的機制完成的,該機制允許操作系統將內存從空閒進程移動到磁盤上,直到再次需要它爲止。

唯一棘手的問題是將文件塊分成幾行。

+0

我在使用xcode的mac上,我應該提到這一點。 – infinitloop 2009-12-18 17:38:39