Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

134 строки
3.6 KiB
C++

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
#include <cstring>
#include <cctype>
using namespace std;
bool is_valid_filename(const char* filename)
{
// 1) Проверка на запрещенные символы
const char* forbidden = "*\"<>?|";
if (strpbrk(filename, forbidden) != nullptr)
return false;
// 2) Проверка двоеточия
const char* colon = strchr(filename, ':');
if (colon != nullptr)
{
// Проверяем, что двоеточие только вторым символом
if (colon - filename != 1)
return false;
// Перед двоеточием должна быть буква
if (!isalpha(filename[0]))
return false;
// После двоеточия должна быть обратная косая черта
if (filename[2] != '\\')
return false;
}
// 3) Проверка расширения
const char* dot = strrchr(filename, '.');
if (dot != nullptr)
{
// Проверяем расширение .txt (без учета регистра)
if (strlen(dot) != 4) return false;
char ext_lower[5];
for (int i = 0; i < 4; ++i)
ext_lower[i] = tolower(dot[i]);
ext_lower[4] = '\0';
if (strcmp(ext_lower, ".txt") != 0)
return false;
}
return true;
}
void add_txt_extension(char* filename, size_t max_len)
{
if (strchr(filename, '.') == nullptr)
{
size_t len = strlen(filename);
if (len + 4 < max_len)
strcat(filename, ".txt");
}
}
int count_occurrences(const char* text, const char* pattern)
{
int count = 0;
const char* pos = text;
while ((pos = strstr(pos, pattern)) != nullptr)
{
count++;
pos += strlen(pattern);
}
return count;
}
void process_file()
{
char filename[256];
// 4.1 Запрос имени файла
cout << "Введите имя файла: ";
cin.getline(filename, sizeof(filename));
// 4.2 Проверка имени файла
if (!is_valid_filename(filename))
{
cout << "Некорректное имя файла!" << endl;
return;
}
// 4.3 Добавление расширения .txt при необходимости
add_txt_extension(filename, sizeof(filename));
// 4.4 Загрузка файла
ifstream file(filename, ios::binary | ios::ate);
if (!file)
{
cout << "Ошибка открытия файла!" << endl;
return;
}
streamsize size = file.tellg();
file.seekg(0, ios::beg);
char* content = new char[size + 1];
if (!file.read(content, size))
{
cout << "Ошибка чтения файла!" << endl;
delete[] content;
return;
}
content[size] = '\0';
file.close();
// 4.5 Запрос строки для поиска
char search_string[256];
cout << "Введите строку для поиска: ";
cin.getline(search_string, sizeof(search_string));
// 4.6 Подсчет вхождений
int occurrences = count_occurrences(content, search_string);
cout << "Число вхождений строки: " << occurrences << endl;
// 4.7 Освобождение памяти
delete[] content;
}
int main()
{
setlocale(LC_ALL, "Russian");
process_file();
return 0;
}