2013-03-05 36 views
5

它是一個微軟面試問題。用C文件如何從文件中讀取最後n行C

閱讀最後N行(精確)

那麼可能有這麼多的方式來實現這一目標,他們幾個人可能是:

- >的最簡單所有,在第一遍中,計數文件中的行數,第二遍顯示最後n行。

- >或者可以爲每一行維護一個雙向鏈表,並通過反向遍歷鏈表直到第n個最後一個節點顯示最後n行。

- >實施排序尾-n FNAME的東西

- >爲了更加優化它我們可具有長度n和動態存儲在循環方式,直到我們達到結束每一行雙指針的文件。

例如,如果文件中有10行並且想要讀取最後3行。那麼我們可以創建一個buf [3] []緩衝區數組,並且在運行時將繼續使用mallocing並以循環方式釋放緩衝區,直到到達最後一行並保留一個計數器以知道當前數組的索引。

任何人都可以請幫助我更優化的解決方案或至少指導我,如果任何上述方法可以幫助我得到正確的答案或任何其他流行的方法/方法這種類型的問題。

+0

最後一個似乎更優化。 – 2013-03-05 05:07:39

+0

看看尾部實施? HTTP://計算器。com/questions/10164597/how-will-you-implement-tail-effective – StarPinkER 2013-03-05 05:47:50

+1

對於額外的點,如果文件少於n行,則返回錯誤。 – 2013-03-05 10:35:45

回答

8

您可以使用隊列並存儲在此隊列中看到的最後n行。當你看到eof只是打印隊列時。

另一種方法是從文件末尾讀取1024個字節的塊。停止當您發現n\n字符並打印出最後n行。

+0

+1優雅的解決方案:) – 2013-03-05 05:08:58

+2

如果每條線都是500字節,那麼管理緩衝區加入將會很痛苦。 – Anshul 2013-03-05 05:13:53

+1

@ansh,在這種情況下,向後啓動可能仍然有意義,但由於您可能會丟棄數千兆字節的數據直到最後n行,並且您可能不想緩衝數據,但只需找到偏移量 – perreal 2013-03-05 05:16:37

4

您可以有兩個文件指針最初指向文件的開始。

繼續增加第一個指針,直到找到'\ n'字符時,它還會在找到'\ n'時存儲文件指針的實例。

一旦找到第(n + 1)個'\ n',將我們先前保存的文件指針的第一個存儲實例分配給第二個文件指針。一直執行到EOF。

因此,當第一個文件指針在EOF上時,第二個將在n'\ n'後面。然後將第二個文件指針中的所有字符打印到EOF。

所以這是一次性打印最後n行文件的解決方案。

1

如何使用內存映射文件並從後向掃描文件?這消除了每次更新緩衝區窗口的時間比緩衝區空間更長的困難工作。然後,當您發現\n時,將該位置推入堆棧。這適用於O(L),其中L是要輸出的字符數。所以沒有比這更好的了嗎?