|
|
|
@ -0,0 +1,99 @@
|
|
|
|
|
#include <iostream>
|
|
|
|
|
#include <fstream>
|
|
|
|
|
#include <cstring>
|
|
|
|
|
#include <cctype>
|
|
|
|
|
#include <cstdlib>
|
|
|
|
|
#include <clocale> // для setlocale
|
|
|
|
|
|
|
|
|
|
const size_t MAX_SIZE = 256;
|
|
|
|
|
|
|
|
|
|
// Проверка имени файла на корректность
|
|
|
|
|
bool isValidFileName(const char* fileName) {
|
|
|
|
|
// Проверка на запрещенные символы
|
|
|
|
|
const char* forbiddenChars = "*\"<>?|";
|
|
|
|
|
if (strpbrk(fileName, forbiddenChars)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Проверка на двоеточие
|
|
|
|
|
const char* colon = strchr(fileName, ':');
|
|
|
|
|
if (colon) {
|
|
|
|
|
if (colon != fileName + 1 || !isalpha(fileName[0])) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (*(colon + 1) != '\\') {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Проверка расширения
|
|
|
|
|
const char* ext = strrchr(fileName, '.');
|
|
|
|
|
if (ext && _stricmp(ext, ".txt") != 0) { // Используем _stricmp
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Функция для подсчета вхождений искомой строки в тексте
|
|
|
|
|
int countOccurrences(const char* text, const char* searchStr) {
|
|
|
|
|
int count = 0;
|
|
|
|
|
const char* p = text;
|
|
|
|
|
while ((p = strstr(p, searchStr)) != nullptr) {
|
|
|
|
|
count++;
|
|
|
|
|
p += strlen(searchStr); // Перемещаем указатель на следующий символ после найденного
|
|
|
|
|
}
|
|
|
|
|
return count;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
|
// Установка локали для корректного отображения русского текста
|
|
|
|
|
setlocale(LC_ALL, "Russian");
|
|
|
|
|
|
|
|
|
|
// 4.1 Запрос имени файла
|
|
|
|
|
char fileName[MAX_SIZE];
|
|
|
|
|
std::cout << "Введите имя файла: ";
|
|
|
|
|
std::cin.getline(fileName, MAX_SIZE);
|
|
|
|
|
|
|
|
|
|
// 4.2 Проверка корректности имени файла
|
|
|
|
|
while (!isValidFileName(fileName)) {
|
|
|
|
|
std::cout << "Некорректное имя файла. Введите заново: ";
|
|
|
|
|
std::cin.getline(fileName, MAX_SIZE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 4.3 Добавление расширения ".txt", если его нет
|
|
|
|
|
if (!strrchr(fileName, '.')) {
|
|
|
|
|
strcat_s(fileName, MAX_SIZE, ".txt"); // Используем strcat_s
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 4.4 Загрузка содержимого файла
|
|
|
|
|
std::ifstream file(fileName, std::ios::in | std::ios::binary);
|
|
|
|
|
if (!file) {
|
|
|
|
|
std::cerr << "Не удалось открыть файл!" << std::endl;
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Определение размера файла
|
|
|
|
|
file.seekg(0, std::ios::end);
|
|
|
|
|
size_t fileSize = file.tellg();
|
|
|
|
|
file.seekg(0, std::ios::beg);
|
|
|
|
|
|
|
|
|
|
// Выделение памяти для содержимого файла
|
|
|
|
|
char* content = new char[fileSize + 1];
|
|
|
|
|
file.read(content, fileSize);
|
|
|
|
|
content[fileSize] = '\0'; // Завершающий нуль
|
|
|
|
|
|
|
|
|
|
file.close(); // Закрытие файла
|
|
|
|
|
|
|
|
|
|
// 4.5 Запрос строки для поиска
|
|
|
|
|
char searchStr[MAX_SIZE];
|
|
|
|
|
std::cout << "Введите строку для поиска: ";
|
|
|
|
|
std::cin.getline(searchStr, MAX_SIZE);
|
|
|
|
|
|
|
|
|
|
// 4.6 Подсчет вхождений строки
|
|
|
|
|
int occurrences = countOccurrences(content, searchStr);
|
|
|
|
|
std::cout << "Строка '" << searchStr << "' встречается " << occurrences << " раз(а) в файле." << std::endl;
|
|
|
|
|
|
|
|
|
|
delete[] content; // 4.7 Освобождение памяти
|
|
|
|
|
return 0;
|
|
|
|
|
}
|