2011-02-07 50 views
2

訪問文本文件時,我想從特定行中讀取。假設我的文件有1000行,我想讀第330行。每行都有不同數量的字符,可能會很長(假設每行大約有100,000,000個字符)。我在想fseek()在這裏不能有效使用。訪問「.txt」文件中的信息並轉到確定的行

我在想一個循環來跟蹤換行符,但我不知道究竟如何實現它,我不知道這是否是最好的解決方案。

你能提供任何幫助嗎?

+0

我認爲你的意思是「確定」。 :) – Maxpm 2011-02-07 15:50:37

+1

偏離主題,但「我有疑問」是英語錯誤。你的意思是,「我有一個問題」或「我有一個問題,我正在努力解決」。 「懷疑」是對一個斷言持懷疑態度。例如,「他說它重10公斤,但我懷疑它。」或者「我毫不懷疑你可以舉起它。」 – tenfour 2011-02-07 15:54:35

+0

@tenfour:對不起,這不是一個錯誤。這只是標準用法,與您習慣的英語版本不同。 – btilly 2011-02-07 16:00:29

回答

1

我認爲你需要掃描的文件和計數\ n個出現的,因爲你找到所需的行。如果這是一個頻繁的操作,並且你是唯一一個你編寫文件的人,你可能會將包含這些信息的索引文件與包含數據的索引文件並排排列,這是一種「窮人索引」,但可以節省很多時間。

2

沒有辦法知道在哪裏行330點開始在任意的文本文件,而無需掃描整個文件,找到換行符,然後計數。

如果您只需要操作一次,然後掃描。如果您需要多次執行此操作,那麼您可以掃描一次,然後建立一個數據結構列表,其中所有行都將啓動。現在你可以找出在哪裏尋求閱讀這條線。如果你還在想如何組織數據,我會建議使用其他類型的數據結構進行隨機訪問。如果不知道您正在嘗試解決的實際問題,我無法推薦哪一個。

3

除非你有某種指數的話說,文件中的「行M開始在位置N」,則必須從文件中讀取字符和計數換行符,直到找到所需的行。

,如果你想,如果你想,直到你找到所需的線路可以放棄讀行的內容,以節省每一行的內容,或std::istream::ignore您可以輕鬆地閱讀使用std::getline線。

0

嘗試在一個循環

/* fgets example */ 
#include <stdio.h> 

int main() 
{ 
    FILE * pFile; 
    char mystring [100]; 

    pFile = fopen ("myfile.txt" , "r"); 
    if (pFile == NULL) perror ("Error opening file"); 
    else { 
    fgets (mystring , 100 , pFile); 
    puts (mystring); 
    fclose (pFile); 
    } 
    return 0; 
} 
1

運行fgets創建該文件的索引。你可以「懶惰地」這樣做,但是當你讀完一個緩衝區時,你可以爲每個字符掃描它。

如果是使用2個字節的Windows上的文本文件「\ n」,那麼在新行出現你讀點的字符數不會偏移。所以你應該做的是每次調用getline()之後的「尋找」。

類似:

std::vector<off_t> lineNumbers; 
std::string line; 
lineNumbers.push_back(0); // first line begins at 0 
while(std::getline(ifs, line)) 
{ 
    lineNumbers.push_back(ifs.tellg()); 
} 

最後的值會告訴你在哪裏EOF是。