2011-07-19 37 views
2

我想從最後一行逐行讀一個文件。我看着像fgets這樣的C++函數,但是文件正在被反向讀取。從頭讀文件

+0

如果將整個文件加載到內存對您來說是合理的 - 您可以簡單地逐行讀取文件到某個std容器,然後反轉此容器。 – triclosan

回答

7

除非該文件是真的,只是將整個文件讀入std::vector<std::string>,然後用reverse_iteratorstd::vector<>::rbegin()

+1

文件位於GB中,必須從文件末尾進行搜索。 – CrazyC

+0

@ Saurabh01:啊,這個分類「真的」很大。最好補充一點。在添加其他答案之前,您需要對這些方面做些什麼?你打算如何處理它們?很明顯,你不會以交互方式向用戶展示全部文本。 – MSalters

+0

然後讀取最後的GB(或左右)到內存並處理它,然後讀取第二個但最後一個段,依此類推。 –

0

獲取如果文件大小爲小使用MSalters回答。

如果文件大小很大,則必須使用iostream::seekg函數手動執行文件指針記錄。該算法會是這樣的:

  1. 找到文件大小
  2. 尋求補償所需
  3. 閱讀
  4. 尋求下一個偏移
+0

'seekg'得到這種情況。 – user786653

+0

確實,答案已更新。 – nathan

+1

閱讀當然是前進的,而不是倒退(但最初從接近結束的某個點開始)。 @ Saurabh01:磁盤驅動器是單向的街道;驅動程序本身只能讀取一個方向。你必須在軟件中反向模擬閱讀。 –

1

不幸的是,我不知道的任何內置函數都會反向讀取。一個辦法是實現自己的算法如下圖所示使用fseek, fread and ftell

  1. 尋求到最後一個字符
  2. 開始從當前字符
  3. 搜索換行符如果不換行,添加字符的字符串
  4. 如果是換行符,則反轉字符串以獲得該行
  5. 尋找前一個字符
  6. 重複步驟2,3,4,5,直至到達文件開始位置。

您可以使用ftell, fseek函數來達到最後一個字符,然後到達前一個字符。

+0

感謝您的建議。我已經實現了這些選項,但正在尋找一個構建選項。 – CrazyC