#include #include // Для работы с файлами и C-строками #include // Для обработки строк #include // Для проверки символов #include // Для управления памятью using namespace std; const size_t MAX_FILENAME_LENGTH = 260; // Максимальная длина имени файла const size_t MAX_SEARCH_STRING_LENGTH = 256; // Максимальная длина строки поиска const char* invalid_chars = "*\"<>?|"; bool isValidFilename(const char* filename) { for (size_t i = 0; i < strlen(invalid_chars); ++i) { if (strchr(filename, invalid_chars[i]) != nullptr) { return false; } } const char* colon = strchr(filename, ':'); if (colon != nullptr) { if (colon - filename != 1 || !isalpha(filename[0]) || *(colon + 1) != '\\') { return false; } } const char* extension = strrchr(filename, '.'); if (extension != nullptr) { if (strlen(extension) != 4) return false; char ext[5]; strncpy(ext, extension, 4); ext[4] = '\0'; for (int i = 0; i < 4; ++i) ext[i] = tolower(ext[i]); return strcmp(ext, ".txt") == 0; } return true; } void ensureTxtExtension(char* filename) { if (strrchr(filename, '.') == nullptr) { strcat(filename, ".txt"); } } int main() { char filename[MAX_FILENAME_LENGTH]; cout << "Введите имя файла: "; cin.getline(filename, MAX_FILENAME_LENGTH); if (!isValidFilename(filename)) { cout << "Неверное имя файла." << endl; return 1; } ensureTxtExtension(filename); if (!isValidFilename(filename)) { cout << "Ошибка в имени после добавления расширения." << endl; return 1; } FILE* file = fopen(filename, "rb"); if (file == nullptr) { cout << "Ошибка открытия файла: " << filename << endl; return 1; } if (fseek(file, 0, SEEK_END) != 0) { cout << "Ошибка перехода в конец файла." << endl; fclose(file); return 1; } long file_size = ftell(file); if (file_size == -1L) { cout << "Не удалось узнать размер файла." << endl; fclose(file); return 1; } rewind(file); char* content = (char*)malloc(file_size + 1); if (content == nullptr) { cout << "Ошибка выделения памяти." << endl; fclose(file); return 1; } size_t read_size = fread(content, sizeof(char), file_size, file); if (read_size != (size_t)file_size) { cout << "Ошибка чтения файла." << endl; free(content); fclose(file); return 1; } content[file_size] = '\0'; fclose(file); char search_str[MAX_SEARCH_STRING_LENGTH]; cout << "Введите строку для поиска: "; cin.getline(search_str, MAX_SEARCH_STRING_LENGTH); int count = 0; char* pos = content; size_t search_len = strlen(search_str); if (search_len == 0) { cout << "Пустая строка для поиска." << endl; free(content); return 1; } while ((pos = strstr(pos, search_str)) != nullptr) { count++; pos += search_len; } cout << "Частота появления строки \"" << search_str << "\": " << count << endl; free(content); return 0; }