Вы не можете выбрать более 25 тем
Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
134 строки
3.6 KiB
C++
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;
|
|
} |