#include <iostream>
#include <fstream>
#include <cstring>

// Функция для проверки корректности имени файла
bool isValidFileName(const char* filename) {
    // Запрещенные символы в имени файла
    const char* forbiddenChars = "*\"<>?|";
    if (strpbrk(filename, forbiddenChars) != nullptr) {
        return false;
    }

    // Проверка наличия двоеточия
    const char* colon = strchr(filename, ':');
    if (colon != nullptr) {
        if (*(colon - 1) != isalpha(*(colon - 1)) || *(colon + 1) != '\\') {
            return false;
        }
    }

    // Проверка расширения файла (если есть)
    const char* extension = strrchr(filename, '.');
    if (extension != nullptr) {
        if (std::strcmp(extension, ".txt") != 0 && std::strcmp(extension, ".TXT") != 0) {
            return false;
        }
    }

    return true;
}

int main() {
    setlocale(0, "ru-ru");
    char filename[100];
    std::cout << "Введите имя файла: ";
    std::cin >> filename;

    // Проверка корректности имени файла
    if (!isValidFileName(filename)) {
        std::cout << "Некорректное имя файла." << std::endl;
        return 1;
    }

    // Добавление расширения .txt, если оно отсутствует
    char* extension = strrchr(filename, '.');
    if (extension == nullptr) {
        if (strlen(filename) + 4 < sizeof(filename)) { // Проверяем, есть ли достаточно места в буфере
            strcat_s(filename, sizeof(filename), ".txt");
        }
        else {
            std::cout << "Недостаточно места в буфере для добавления расширения." << std::endl;
            return 1;
        }
    }

    // Открытие файла и загрузка его содержимого в память
    std::ifstream file(filename, std::ios::binary | std::ios::ate);
    if (!file.is_open()) {
        std::cout << "Не удалось открыть файл." << std::endl;
        return 1;
    }

    std::streampos fileSize = file.tellg();
    file.seekg(0, std::ios::beg);

    char* fileContents = new char[fileSize];
    file.read(fileContents, fileSize);
    file.close();

    // Запрос строки от пользователя
    char searchString[100];
    std::cout << "Введите строку для поиска: ";
    std::cin >> searchString;

    // Подсчет числа вхождений строки в текст файла
    int count = 0;
    char* position = fileContents;
    while ((position = strstr(position, searchString)) != nullptr) {
        ++count;
        position += strlen(searchString);
    }

    std::cout << "Число вхождений строки в файл: " << count << std::endl;

    // Освобождение памяти
    delete[] fileContents;

    return 0;
}