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

90 строки
3.0 KiB
C++

#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;
}