2016-12-30 61 views
1

我想從C++文件中讀取一行(但不是第一行)。 有沒有一個聰明的方法來完成這個?現在我正在考慮使用getline()並繼續循環,但它似乎不是最優化的方式?有任何想法嗎? 問候C++設置光標在文件中的確切行

+0

你可以使用fseek(),你可以從這裏獲得幫助http://www.cplusplus.com/reference/cstdio/fseek/ – IAmBlake

+0

如果行的長度是可變的,那麼就沒有其他方法可以讀取直到你到達你想要的線路。如果它們的長度是固定的,那麼你可以尋求'行數*行長',考慮'行長'必須包括換行。 – Unimportant

+0

對不起,你必須隨時進行調整。沒有系統級的方法來一次掃描一行。如果必要且可行,您可以爲文件編寫索引,並將已知新行的位置記錄爲字節位置。當然,如果不知道你真的想做什麼,我們就不能給出正確的答案。 –

回答

1

文本行被稱爲可變長度記錄由於它們的長度可變,因此無法輕鬆定位到文件中給定的行。

一種方法是維護文件位置的std::vector。通過文件訪問,讀取每一行,並記錄它的位置:

std::vector<std::streampos> text_line_positions; 
// The first line starts at position 0: 
text_line_positions.push_back(0); 

std::string text; 
while (std::getline(my_text_file, text)) 
{ 
    const std::streampos position = my_text_file.tellg(); 
    text_line_positions.push_back(position); 
} 

你可從矢量文件位置:

const std::streampos line_start = text_line_positions[line_number]; 

編輯1:矢量文字
更加理想的方法可以讀取每個文本行成std::vector

std::vector<std::string> file_text; 
std::string text; 
while (std::getline(my_file, text)) 
{ 
    file_text.push_back(text); 
} 

上述方法的缺點之一是您需要足夠的內存來包含文件。
但是,訪問時間很快,因爲您不需要再次讀取文件。

與所有優化一樣,涉及到折衷。