Want it in Russian? Scroll down.
По-русски - скролльте вниз.
Write a class on pure C++ which able to quickly read text logs of enormous size (tens or hundreds MiBs) and output lines which meet simple regexp criteria, at least operators *
and ?
. A wider range of options is welcome.
*
- sequence of any characters of unlimited length;?
- exactly one any symbol.
Following masks must work correctly:
*Some*
,*Some
,Some*
,*****Some***
.
There are no restrictions of *
position in the mask.
The result of the search should be lines that satisfy the mask.
Examples:
- Mask
*abc*
selects all lines containgabc
, which starts and ends of any sequence of any characters. - Mask
abc*
selects all lines beginning withabc
and ending with any sequence of any characters. - Mask
abc?
selects all lines beginning withabc
and ending with any one character. - Mask
abc
selects all lines which equal toabc
exactly.
The class will not be expanded and will not be a base class. The only task is scanning and searching text in ANSI (not Unicode) files.
The class must have following public interface:
class CLogReader
{
public:
CLogReader(...);
~CLogReader(...);
bool Open(...); // open file, false if error
void Close(); // close file
bool SetFilter(const char *filter); // set line filter, false if error
bool GetNextLine(char *buf, // select next found line
const int bufsize); // buf - buffer, bufsize - max buffer size
// false if EOF or error
};
Implementation requirements:
-
Windows XP or later
-
Maximum performance (search results and file contents caching is not required)
-
Low memory costs (within reasonable limits)
-
It is prohibited to use third-party libraries and STL. You can only use CRT and WinAPI
-
It is prohibited to use Windows and C++ exceptions
-
The code should be absolutely dead proof and protected from errors.
-
The code must be as simple as possible.
-
The code must be clean, beautiful and clear.
-
Result should be a ready class (
.cpp
+.h
files) and console example of its usage (open text log file of size of couple of megabytes and selectorder*closed
). File and filter must be passed as command line arguments. -
Result should be an example of
.exe
file and Visual Studio project file (all in one archive).
Необходимо написать на чистом С++ класс, умеющий максимально быстро читать текстовые лог-файлы огромных размеров (десятки и сотни мегабайт) и выдавать строки, удовлетворяющие условиям простейшего regexp: (как минимум операторы * и ?, более широкий набор возможностей приветствуется):
cимвол '*' - последовательность любых символов неограниченной длины; cимвол "?" - один любой символ; должны корректно отрабатываться маски: *Some*, *Some, Some*, *****Some*** - нет никаких ограничений на положение * в маске. Результатом поиска должны быть строки, удовлетворяющие маске.
Например:
- Маска *abc* отбирает все строки содержащие abc и начинающиеся и заканчивающиеся любой последовательностью символов.
- Маска abc* отбирает все строки начинающиеся с abc и заканчивающиеся любой последовательностью символов.
- Маска abc? отбирает все строки начинающиеся с abc и заканчивающиеся любым дополнительным символом.
- Маска abc отбирает все строки которые равны этой маске.
Класс не будет расширяться и не будет базовым классом. Единственная задача: сканирование и поиск текстовых ANSI (не unicode) строк в файлах.
Класс должен иметь следующий публичный интерфейс:
class CLogReader
{
public:
CLogReader(...);
~CLogReader(...);
bool Open(...); // открытие файла, false - ошибка
void Close(); // закрытие файла
bool SetFilter(const char *filter); // установка фильтра строк, false - ошибка
bool GetNextLine(char *buf, // запрос очередной найденной строки,
const int bufsize); // buf - буфер, bufsize - максимальная длина
// false - конец файла или ошибка
};
Требование к реализации:
Платформа: Windows XP и выше; Функциональность: максимальная производительность (кэширование результатов поиска и файла не требуется); Ресурсы: затраты памяти должны быть минимальны (в разумных пределах); Компоненты: запрещено использование сторонних библиотек (в том числе STL) и компонентов. Разрешено использовать только WinAPI и CRT; Исключения: нельзя использовать Windows и С++ исключения; Код должен быть абсолютно «неубиваемый» и защищённым от ошибок.
Требования к оформлению:
Код должен быть максимально простым; Код должен быть максимально чистым, красивым и понятным; Результатом должен быть готовый класс (cpp + h файлы) и консольный пример (открыть текстовый файл в пару мегабайт и сделать выборку "order*closed") его использования. Файл и строка выбора должна указываться в аргументах примера; Результатом должен быть образец работающего exе файла + проект для MS Visual Studio 2005/2008 и т.д. (все в одном архиве).