Данная часть лабораторной работы выполняется отдельно от предыдущей части, в новом проекте lab04.4cbp.
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
Артем Рогозин be8c9f960d
Update 'readme.md'
1 год назад
lab04.4.cbp Work with cctype 1 год назад
main.cpp README add 1 год назад
readme.md Update 'readme.md' 1 год назад

readme.md

4. Работа со строками C

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

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, загрузка содержимого файла в память, запрос строки от пользователя, подсчет и вывод числа вхождений строки в файл, а затем освобождение памяти.