13.1 Write a method to print the last K lines of an input file using C++.
這道題讓我們用C++來列印一個輸入文字的最後K行,最直接的方法是先讀入所有的資料,統計文字的總行數,然後再遍歷一遍列印出最後K行。這個方法需要讀兩遍檔案,我們想使用一種更簡便的方法,只需要讀取一遍文字就可以列印出最後K行,這裡我們使用一個迴圈陣列Circular Array,原理是我們維護一個大小為K的字串陣列,當陣列存滿後,新進來的資料從開頭開始存,覆蓋原有的資料。這樣當我們讀完整個文字,最後K行就儲存在了這個大小為K的字串陣列,只不過順序不相同,我們始終要有個變數來記錄最後一個進來的資料的位置,這樣我們就可以按原文字的順序列印出最後K行了,參見程式碼如下:
class Solution { public: void printLast5Lines(char *fileName) { const int K = 5; ifstream file(fileName); string L[K]; int size = 0; while (file.good()) { getline(file, L[size % K]); ++size; } int start = size > K ? (size % K) : 0; int cnt = min(K, size); for (int i = 0; i < cnt; ++i) { cout << L[(start + i) % K] << endl; } } };