Реализуйте свой собственный хвост (прочтите последние n строк огромного файла)
Учитывая огромный файл с динамическими данными, напишите программу для чтения последних n строк из файла в любой момент без чтения всего файла. Проблема аналогична команде tail в Linux, которая отображает последние несколько строк файла. Он в основном используется для просмотра обновлений файла журнала, поскольку эти обновления добавляются к файлам журнала.
Источник: Интервью Microsoft.
Мы настоятельно рекомендуем вам свернуть браузер и сначала попробовать это самостоятельно.
Проблема в основном сосредоточена на вещах ниже -
1. Программа не должна читать файл целиком.
2. Программа должна обрабатывать входящие динамические данные и возвращать последние n строк в любой точке.
3. Программа не должна закрывать поток ввода до чтения последних n строк.
Ниже представлена его реализация на C ++.
// C++ program to implement your own tail #include <bits/stdc++.h> using namespace std; #define SIZE 100 // Utility function to sleep for n seconds void sleep(unsigned int n) { clock_t goal = n * 1000 + clock (); while (goal > clock ()); } // function to read last n lines from the file // at any point without reading the entire file void tail( FILE * in, int n) { int count = 0; // To count '
' characters // unsigned long long pos (stores upto 2^64 – 1 // chars) assuming that long long int takes 8 // bytes unsigned long long pos; char str[2*SIZE]; // Go to End of file if ( fseek (in, 0, SEEK_END)) perror ( "fseek() failed" ); else { // pos will contain no. of chars in // input file. pos = ftell (in); // search for '
' characters while (pos) { // Move 'pos' away from end of file. if (! fseek (in, --pos, SEEK_SET)) { if ( fgetc (in) == '
' ) // stop reading when n newlines // is found if (count++ == n) break ; } else perror ( "fseek() failed" ); } // print last n lines printf ( "Printing last %d lines -
" , n); while ( fgets (str, sizeof (str), in)) printf ( "%s" , str); } printf ( "
" ); } // Creates a file and prints and calls tail() for // 10 different values of n (from 1 to 10) int main() { FILE * fp; char buffer[SIZE]; // Open file in binary mode // wb+ mode for reading and writing simultaneously fp = fopen ( "input.txt" , "wb+" ); if (fp == NULL) { printf ( "Error while opening file" ); exit (EXIT_FAILURE); } srand ( time (NULL)); // Dynamically add lines to input file // and call tail() each time for ( int index = 1; index <= 10; index++) { /* generate random logs to print in input file*/ for ( int i = 0; i < SIZE - 1; i++) buffer[i] = rand () % 26 + 65; // AZ buffer[SIZE] = ' |