From 7633aef3c4a5f0a3efc0e32ea2d6e405acf46f6a Mon Sep 17 00:00:00 2001 From: NazarovKO Date: Sun, 29 Dec 2024 15:45:15 +0000 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=204.?= =?UTF-8?q?=20=D0=9D=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D1=82=D1=8C=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D1=83=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B8?= =?UTF-8?q?=20=D1=82=D0=B5=D0=BA=D1=81=D1=82=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab04_4.cpp | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 lab04_4.cpp diff --git a/lab04_4.cpp b/lab04_4.cpp new file mode 100644 index 0000000..6c36924 --- /dev/null +++ b/lab04_4.cpp @@ -0,0 +1,93 @@ +#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; +}