diff --git a/Задание №4 b/Задание №4 new file mode 100644 index 0000000..cef87a7 --- /dev/null +++ b/Задание №4 @@ -0,0 +1,121 @@ +#define _CRT_SECURE_NO_WARNINGS +#include +#include +#include +#include +#include + +using namespace std; + +const size_t MAX_SIZE = 256; +const char not_allowed[] = "*\"<>?|"; +const char separators[] = " \r\n,.!?:;()-"; + +// Функция для получения строки с пользовательским вводом +void getstring(char* s, size_t n) { + fgets(s, n, stdin); + if (s[strlen(s) - 1] == '\n') + s[strlen(s) - 1] = '\0'; +} + +// Функция для перевода строки в нижний регистр +void lower(char* s) { + for (; *s; s++) + *s = tolower(*s); +} + +// Функция для проверки корректности имени файла +bool iscorrectname(char* name) { + char lext[8]; + + // Проверка на наличие запрещенных символов + for (int i = 0; name[i]; i++) { + if (strchr(not_allowed, name[i]) != 0) + return false; + } + + // Проверка корректности двоеточия и пути + char* colon = strchr(name, ':'); + if (colon != NULL) { + if (colon - name != 1) + return false; + if (colon[1] != '\\') + return false; + if (strrchr(name, ':') != colon) + return false; + } + + // Проверка и добавление расширения .txt + char* fname = strrchr(name, '\\'); + fname = fname ? fname + 1 : name; + char* ext = strchr(fname, '.'); + if (ext == NULL) + strcat(name, ".txt"); + else { + strcpy(lext, ext); + lower(lext); + if (strcmp(lext, ".txt")) + return false; + } + return true; +} + +int main() { + setlocale(LC_ALL, "rus"); + + char filename[MAX_SIZE]; + char str[MAX_SIZE]; + + cout << "Название файла: "; + getstring(filename, MAX_SIZE); + + // Проверка имени файла + if (!iscorrectname(filename)) { + cout << "Некорректное название файла\n"; + return -1; + } + + // Открытие файла + FILE* fin = fopen(filename, "rb"); + if (fin == NULL) { + cout << "Файл не найден\n"; + return -1; + } + + // Определение размера файла + fseek(fin, 0, SEEK_END); + size_t length = ftell(fin); + fseek(fin, 0, SEEK_SET); + + // Чтение содержимого файла в память + char* text = new char[length + 1]; + memset(text, 0, length + 1); + fread(text, 1, length, fin); + + cout << "Введите символы для подсчёта: "; + getstring(str, MAX_SIZE); + + // Подсчет вхождений строки + const char* start = text; + size_t count = 0; + while (true) { + const size_t separator_count = strspn(start, separators); + start += separator_count; + if (start[0] == '\0') { + break; + } + const size_t word_length = strcspn(start, separators); + if (word_length == strlen(str) && strncmp(str, start, word_length) == 0) { + count++; + } + start += word_length; + } + + cout << "Результат: " << count << "\n"; + + // Освобождение памяти и закрытие файла + fclose(fin); + delete[] text; + + return 0; +}