diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..425f372 --- /dev/null +++ b/main.cpp @@ -0,0 +1,97 @@ +#include +#include +#include +#include + +const int MAX_FILENAME_LENGTH = 256; +const int MAX_INPUT_STRING_LENGTH = 256; + +bool isValidFilename(const char* filename) { + // + const char* forbiddenChars = "*\"<>?|"; + if (strpbrk(filename, forbiddenChars) != nullptr) { + return false; + } + + // + const char* colonPosition = strchr(filename, ':'); + if (colonPosition != nullptr) { + if (colonPosition == filename + 1 && isalpha(filename[0])) { + // + const char* backslashPosition = strchr(colonPosition + 1, '\\'); + if (backslashPosition == nullptr) { + return false; + } + } else { + return false; + } + } + + // + const char* extension = strrchr(filename, '.'); + if (extension != nullptr) { + if (strcmp(extension, ".txt") != 0 && strcmp(extension, ".TXT") != 0) { + return false; + } + } + + return true; +} + +int main() { + // + char filename[MAX_FILENAME_LENGTH]; + std::cout << " : "; + std::cin.getline(filename, MAX_FILENAME_LENGTH); + + // + if (!isValidFilename(filename)) { + std::cerr << " .\n"; + return 1; + } + + // .txt, + if (strrchr(filename, '.') == nullptr) { + strcat(filename, ".txt"); + } + + // + std::ifstream file(filename, std::ios::binary); + if (!file.is_open()) { + std::cerr << " .\n"; + return 1; + } + + // + file.seekg(0, std::ios::end); + std::streampos fileSize = file.tellg(); + file.seekg(0, std::ios::beg); + + // + char* fileContent = new char[fileSize]; + + // + file.read(fileContent, fileSize); + file.close(); + + // + char inputString[MAX_INPUT_STRING_LENGTH]; + std::cout << " : "; + std::cin.getline(inputString, MAX_INPUT_STRING_LENGTH); + + // + int occurrences = 0; + char* position = fileContent; + while ((position = strstr(position, inputString)) != nullptr) { + occurrences++; + position += strlen(inputString); + } + + // + std::cout << " : " << occurrences << std::endl; + + // + delete[] fileContent; + + return 0; +} diff --git a/readme_lr4.4.md b/readme_lr4.4.md new file mode 100644 index 0000000..ef6500b --- /dev/null +++ b/readme_lr4.4.md @@ -0,0 +1,102 @@ +#### 4. Работа со строками C + +``` +#include +#include +#include +#include + +const int MAX_FILENAME_LENGTH = 256; +const int MAX_INPUT_STRING_LENGTH = 256; + +bool isValidFilename(const char* filename) { + // Проверка наличия запрещенных символов + const char* forbiddenChars = "*\"<>?|"; + if (strpbrk(filename, forbiddenChars) != nullptr) { + return false; + } + + // Проверка наличия двоеточия + const char* colonPosition = strchr(filename, ':'); + if (colonPosition != nullptr) { + if (colonPosition == filename + 1 && isalpha(filename[0])) { + // Проверка двоеточия только вторым символом + const char* backslashPosition = strchr(colonPosition + 1, '\\'); + if (backslashPosition == nullptr) { + return false; + } + } else { + return false; + } + } + + // Проверка расширения файла + const char* extension = strrchr(filename, '.'); + if (extension != nullptr) { + if (strcmp(extension, ".txt") != 0 && strcmp(extension, ".TXT") != 0) { + return false; + } + } + + return true; +} + +int main() { + // Запрос имени файла + char filename[MAX_FILENAME_LENGTH]; + std::cout << "Введите имя файла: "; + std::cin.getline(filename, MAX_FILENAME_LENGTH); + + // Проверка корректности имени файла + if (!isValidFilename(filename)) { + std::cerr << "Некорректное имя файла.\n"; + return 1; + } + + // Добавление расширения .txt, если его нет + if (strrchr(filename, '.') == nullptr) { + strcat(filename, ".txt"); + } + + // Открытие файла + std::ifstream file(filename, std::ios::binary); + if (!file.is_open()) { + std::cerr << "Ошибка открытия файла.\n"; + return 1; + } + + // Определение размера файла + file.seekg(0, std::ios::end); + std::streampos fileSize = file.tellg(); + file.seekg(0, std::ios::beg); + + // Выделение памяти под содержимое файла + char* fileContent = new char[fileSize]; + + // Чтение содержимого файла в память + file.read(fileContent, fileSize); + file.close(); + + // Запрос строки от пользователя + char inputString[MAX_INPUT_STRING_LENGTH]; + std::cout << "Введите строку для поиска: "; + std::cin.getline(inputString, MAX_INPUT_STRING_LENGTH); + + // Подсчет вхождений строки в файл + int occurrences = 0; + char* position = fileContent; + while ((position = strstr(position, inputString)) != nullptr) { + occurrences++; + position += strlen(inputString); + } + + // Вывод результата + std::cout << "Число вхождений строки в файл: " << occurrences << std::endl; + + // Освобождение выделенной памяти + delete[] fileContent; + + return 0; +} +``` +Данный код выполняет все шаги, описанные в задании: запрос имени файла, проверка корректности имени, добавление расширения .txt, загрузка содержимого файла в память, запрос строки от пользователя, подсчет и вывод числа вхождений строки в файл, а затем освобождение памяти. \ No newline at end of file