Виммельбух, 3, перетяжка
Виммельбух, 3, перетяжка
Виммельбух, 3, перетяжка

Вывод последних K строк входного файла на C++

Аватар Типичный программист
Отредактировано

10К открытий10К показов

Можно действовать прямо — подсчитать количество строк (N) и вывести строки с N-K до N. Для этого понадобится дважды прочитать файл, что очень неэффективно. Давайте найдем решение, которое потребует прочитать файл только один раз и выведет последние K строк.

Можно создать массив для K строк и прочитать последние K строк. В нашем массиве там будут храниться строки от 1 до K, затем от 2 до K+1, затем от 3 до K+2 и т.д. Каждый раз, считывая новую строку, мы будем удалять самую старую строку из массива.

Вы можете удивиться: разве может быть эффективным решение, требующее постоянного сдвига элементов в массиве? Это решение станет эффективным, если мы правильно реализуем сдвиг. Вместо того чтобы каждый раз выполнять сдвиг массива, можно «закольцевать» массив.

Используя такой массив, читая новую строку, мы всегда будем заменять самый старый элемент. Самый старый элемент будет храниться в отдельной переменной, которая будет меняться при добавлении новых элементов.

Пример использования закольцованного массива:

			шаг 1 (исходное состояние):	массив = {a, b, с, d, е, f}. р = 0
шаг 2 (вставка g):			массив = {g, b, с, d, е, f}. р = 1
шаг 3 (вставка h):			массив = {g, h, с, d, е, f}. р = 2
шаг 4 (вставка i):			массив = {g, h, i, d, e, f}. p = 3
		

Приведенный далее код реализует этот алгоритм:

			void printLast10Lines(char* fileName) {
	
	const int K = 10;
	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 count = min(K, size);
	
	/* выводим элементы в порядке чтения */
	for (int i = 0; i < count; i++) {
		cout << L[(start + i) % K] << endl;
	}
}
		

Мы считываем весь файл, но в памяти хранится только 10 строк.

Разбор взят из перевода книги Г. Лакман Макдауэлл и предназначен исключительно для ознакомления.Если он вам понравился, то рекомендуем купить книгу «Карьера программиста. Как устроиться на работу в Google, Microsoft или другую ведущую IT-компанию».

Следите за новыми постами
Следите за новыми постами по любимым темам
10К открытий10К показов