#pragma warning(disable:4800)
#include <locale>
#include <iostream>
#include <fstream>
#include <algorithm>
#include <functional>
using namespace std;
// Имя файла
const wchar_t* const FILE_NAME=L"input.txt";
// Синонимы для используемых типов
typedef void (*parser_t)(const wstring&);
// Ф-я для нахождения непрерывной последовательности чисел
void digit_parser(const wstring& str);
// Ф-я для нахождения непрерывной последовательности букв
void alpha_parser(const wstring& str);
// Ф-я для поиска подстроки "34"
void thirty_four_parser(const wstring& str);
// Ф-я для поиска подстроки "5"
void five_parser(const wstring& str);
// Ф-я для фыполнения с файлом требуемых действий
void parse_file(const wchar_t* const file_name,parser_t checker);
int main()
{
locale::global(locale(""));
// Вариант А
parse_file(FILE_NAME,digit_parser);
// Вариант Б
parse_file(FILE_NAME,alpha_parser);
// Вариант Г
parse_file(FILE_NAME,thirty_four_parser);
// Вариант Д
parse_file(FILE_NAME,five_parser);
_getwch();
return 0;
};
void parse_file(const wchar_t* const file_name,parser_t parser)
{
// Открываем файл
wifstream in(file_name);
if(!in)
{
wcout<<L"Не могу открыть файл"<<endl;
}
wstring str;
// Читаем по строкам
getline(in,str);
while(in)
{
// Разбираем каждую строку
parser(str);
getline(in,str);
}
}
typedef bool (*predicate_t)(wchar_t);
// Поиск группы элементов удовлетворяющих предикату
void find_group(const wstring& str,predicate_t predicate)
{
wstring::const_iterator begin_word,end_word=str.begin(),end_str=str.end();
while((begin_word=find_if(end_word,end_str,predicate))!=end_str)
{
end_word=find_if(begin_word,end_str,not1(pointer_to_unary_function<wchar_t,bool>(predicate)));
wcout<<wstring(begin_word,end_word)<<L' ';
}
wcout<<endl;
}
// Поиск последовательности str2 в str1
void find_sequence(const wstring& str1,const wstring& str2)
{
wstring::const_iterator begin=str1.begin(),end_str1=str1.end(),begin_str2=str2.begin(),end_str2=str2.end();
wstring::size_type str2_len=str2.length();
while((begin=search(begin,end_str1,begin_str2,end_str2))!=end_str1)
{
wcout<<str2<<L' ';
begin+=str2_len;
}
wcout<<endl;
}
// Предикат для чисел
inline bool digit_pred(wchar_t arg)
{
return iswdigit(arg);
}
// Предикат для букв
inline bool alpha_pred(wchar_t arg)
{
return iswalpha(arg);
}
// Ф-я для нахождения непрерывной последовательности чисел
inline void digit_parser(const wstring& str)
{
find_group(str,digit_pred);
}
// Ф-я для нахождения непрерывной последовательности букв
inline void alpha_parser(const wstring& str)
{
find_group(str,alpha_pred);
}
// Ф-я для поиска подстроки "34"
inline void thirty_four_parser(const wstring& str)
{
find_sequence(str,L"34");
}
// Ф-я для поиска подстроки "5"
inline void five_parser(const wstring& str)
{
find_sequence(str,L"5");
}
12 34 567
ab Gercules small Big
34
5
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.