#include #include #include #include // Константы const size_t MAX_SIZE = 256; const char* separators = " \r\n,.!?:;()-"; const char* forbidden_chars = "*\"<>|?"; // Функция для проверки корректности имени файла bool is_valid_filename(const char* filename) { // Проверка на запрещенные символы if (strpbrk(filename, forbidden_chars)) { return false; } // Проверка на двоеточие const char* colon_pos = strchr(filename, ':'); if (colon_pos && (colon_pos != filename + 1 || !isalpha(colon_pos[-1]) || colon_pos[1] != '\\')) { return false; } // Проверка расширения const char* dot_pos = strrchr(filename, '.'); if (dot_pos && strncmp(dot_pos, ".txt", 4) != 0 && strncmp(dot_pos, ".TXT", 4) != 0) { return false; } return true; } // Функция для добавления расширения .txt, если его нет void add_txt_extension(char* filename) { const char* dot_pos = strrchr(filename, '.'); if (!dot_pos || strncmp(dot_pos, ".txt", 4) != 0) { strcat(filename, ".txt"); } } int main() { // Шаг 4.1: Запросить у пользователя имя файла char filename[MAX_SIZE]; std::cout << "Enter the filename: "; std::cin.getline(filename, MAX_SIZE); // Шаг 4.2: Проверить корректность имени файла if (!is_valid_filename(filename)) { std::cerr << "Invalid filename." << std::endl; return 1; } // Шаг 4.3: Добавить расширение .txt, если его нет add_txt_extension(filename); // Шаг 4.4: Загрузить содержимое текстового файла в память std::ifstream file(filename, std::ios::binary | std::ios::ate); if (!file) { std::cerr << "Failed to open file." << std::endl; return 1; } std::streamsize size = file.tellg(); file.seekg(0, std::ios::beg); char* buffer = new char[size + 1]; if (!file.read(buffer, size)) { std::cerr << "Failed to read file." << std::endl; delete[] buffer; return 1; } buffer[size] = '\0'; file.close(); // Шаг 4.5: Запросить у пользователя строку char search_string[MAX_SIZE]; std::cout << "Enter the string to search: "; std::cin.getline(search_string, MAX_SIZE); // Шаг 4.6: Подсчитать и вывести число вхождений строки в текст файла int count = 0; const char* pos = buffer; while ((pos = strstr(pos, search_string)) != nullptr) { count++; pos++; } std::cout << "The string \"" << search_string << "\" occurs " << count << " times in the file." << std::endl; // Шаг 4.7: Освободить выделенную память delete[] buffer; return 0; }