#define _CRT_SECURE_NO_WARNINGS #include #include #include #include using namespace std; bool is_valid_filename(const char* filename) { // 1) Проверка на запрещенные символы const char* forbidden = "*\"<>?|"; if (strpbrk(filename, forbidden) != nullptr) return false; // 2) Проверка двоеточия const char* colon = strchr(filename, ':'); if (colon != nullptr) { // Проверяем, что двоеточие только вторым символом if (colon - filename != 1) return false; // Перед двоеточием должна быть буква if (!isalpha(filename[0])) return false; // После двоеточия должна быть обратная косая черта if (filename[2] != '\\') return false; } // 3) Проверка расширения const char* dot = strrchr(filename, '.'); if (dot != nullptr) { // Проверяем расширение .txt (без учета регистра) if (strlen(dot) != 4) return false; char ext_lower[5]; for (int i = 0; i < 4; ++i) ext_lower[i] = tolower(dot[i]); ext_lower[4] = '\0'; if (strcmp(ext_lower, ".txt") != 0) return false; } return true; } void add_txt_extension(char* filename, size_t max_len) { if (strchr(filename, '.') == nullptr) { size_t len = strlen(filename); if (len + 4 < max_len) strcat(filename, ".txt"); } } int count_occurrences(const char* text, const char* pattern) { int count = 0; const char* pos = text; while ((pos = strstr(pos, pattern)) != nullptr) { count++; pos += strlen(pattern); } return count; } void process_file() { char filename[256]; // 4.1 Запрос имени файла cout << "Введите имя файла: "; cin.getline(filename, sizeof(filename)); // 4.2 Проверка имени файла if (!is_valid_filename(filename)) { cout << "Некорректное имя файла!" << endl; return; } // 4.3 Добавление расширения .txt при необходимости add_txt_extension(filename, sizeof(filename)); // 4.4 Загрузка файла ifstream file(filename, ios::binary | ios::ate); if (!file) { cout << "Ошибка открытия файла!" << endl; return; } streamsize size = file.tellg(); file.seekg(0, ios::beg); char* content = new char[size + 1]; if (!file.read(content, size)) { cout << "Ошибка чтения файла!" << endl; delete[] content; return; } content[size] = '\0'; file.close(); // 4.5 Запрос строки для поиска char search_string[256]; cout << "Введите строку для поиска: "; cin.getline(search_string, sizeof(search_string)); // 4.6 Подсчет вхождений int occurrences = count_occurrences(content, search_string); cout << "Число вхождений строки: " << occurrences << endl; // 4.7 Освобождение памяти delete[] content; } int main() { setlocale(LC_ALL, "Russian"); process_file(); return 0; }