|
|
@ -1,17 +1,20 @@
|
|
|
|
#include
|
|
|
|
#include <iostream>
|
|
|
|
#include
|
|
|
|
#include <cstdio>
|
|
|
|
#include
|
|
|
|
#include <cstring>
|
|
|
|
#include
|
|
|
|
#include <cctype>
|
|
|
|
|
|
|
|
#include <cstdlib>
|
|
|
|
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
|
|
|
|
const size_t MAX_FILENAME_LENGTH = 260;
|
|
|
|
const size_t MAX_FILENAME_LENGTH = 260; // Максимальная длина имени файла
|
|
|
|
|
|
|
|
const size_t MAX_SEARCH_STRING_LENGTH = 256; // Максимальная длина строки для поиска
|
|
|
|
|
|
|
|
const char* forbidden_chars = "*<>\?|"; // Запрещенные символы в имени файла
|
|
|
|
|
|
|
|
|
|
|
|
const size_t MAX_SEARCH_STRING_LENGTH = 256;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const char* forbidden_chars = "*"<>?|";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool isValidFilename(const char* filename) {
|
|
|
|
bool isValidFilename(const char* filename) {
|
|
|
|
|
|
|
|
if (filename == nullptr || strlen(filename) == 0) {
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
for (size_t i = 0; i < strlen(forbidden_chars); ++i) {
|
|
|
|
for (size_t i = 0; i < strlen(forbidden_chars); ++i) {
|
|
|
|
if (strchr(filename, forbidden_chars[i]) != nullptr) {
|
|
|
|
if (strchr(filename, forbidden_chars[i]) != nullptr) {
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
@ -25,12 +28,13 @@ if (colon != nullptr) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!isalpha(filename[0])) {
|
|
|
|
if (!isalpha(filename[0])) {
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (*(colon + 1) != '\\' )
|
|
|
|
if (*(colon + 1) != '\\') {
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Проверка наличия .txt
|
|
|
|
const char* dot = strrchr(filename, '.');
|
|
|
|
const char* dot = strrchr(filename, '.');
|
|
|
|
if (dot != nullptr) {
|
|
|
|
if (dot != nullptr) {
|
|
|
|
if (strlen(dot) != 4) {
|
|
|
|
if (strlen(dot) != 4) {
|
|
|
@ -46,8 +50,11 @@ if (dot != nullptr) {
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Функция для добавления расширения .txt к имени файла, если его нет
|
|
|
|
void addTxtExtension(char* filename) {
|
|
|
|
void addTxtExtension(char* filename) {
|
|
|
|
if (strrchr(filename, '.') == nullptr) {
|
|
|
|
if (strrchr(filename, '.') == nullptr) {
|
|
|
|
strcat(filename, ".txt");
|
|
|
|
strcat(filename, ".txt");
|
|
|
@ -55,32 +62,25 @@ strcat(filename, ".txt");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
int main() {
|
|
|
|
|
|
|
|
|
|
|
|
char filename[MAX_FILENAME_LENGTH];
|
|
|
|
char filename[MAX_FILENAME_LENGTH];
|
|
|
|
cout << "Введите имя файла: ";
|
|
|
|
cout << "Введите имя файла: ";
|
|
|
|
cin.getline(filename, MAX_FILENAME_LENGTH);
|
|
|
|
cin.getline(filename, MAX_FILENAME_LENGTH);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
addTxtExtension(filename);
|
|
|
|
|
|
|
|
|
|
|
|
if (!isValidFilename(filename)) {
|
|
|
|
if (!isValidFilename(filename)) {
|
|
|
|
cout << "Некорректное имя файла." << endl;
|
|
|
|
cout << "Некорректное имя файла." << endl;
|
|
|
|
return 1;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!isValidFilename(filename)) {
|
|
|
|
|
|
|
|
cout << "Некорректное имя файла после добавления расширения." << endl;
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FILE* file = fopen(filename, "rb");
|
|
|
|
FILE* file = fopen(filename, "rb");
|
|
|
|
if (file == nullptr) {
|
|
|
|
if (file == nullptr) {
|
|
|
|
cout << "Не удалось открыть файл: " << filename << endl;
|
|
|
|
cout << "Не удалось открыть файл: " << filename << endl;
|
|
|
|
return 1;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fseek(file, 0, SEEK_END);
|
|
|
|
long file_size = ftell(file);
|
|
|
|
long file_size = ftell(file);
|
|
|
|
if (file_size == -1L) {
|
|
|
|
|
|
|
|
cout << "Не удалось определить размер файла." << endl;
|
|
|
|
|
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
rewind(file);
|
|
|
|
|
|
|
|
char* file_content = (char*)malloc(file_size + 1);
|
|
|
|
char* file_content = (char*)malloc(file_size + 1);
|
|
|
|
if (file_content == nullptr) {
|
|
|
|
if (file_content == nullptr) {
|
|
|
|
cout << "Не удалось выделить память для содержимого файла." << endl;
|
|
|
|
cout << "Не удалось выделить память для содержимого файла." << endl;
|
|
|
@ -95,7 +95,6 @@ if (read_size != (size_t)file_size) {
|
|
|
|
fclose(file);
|
|
|
|
fclose(file);
|
|
|
|
return 1;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
file_content[file_size] = '\0';
|
|
|
|
file_content[file_size] = '\0';
|
|
|
|
|
|
|
|
|
|
|
|
fclose(file);
|
|
|
|
fclose(file);
|
|
|
@ -120,7 +119,6 @@ while ((pos = strstr(pos, search_string)) != nullptr) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
cout << "Число вхождений строки \"" << search_string << "\": " << count << endl;
|
|
|
|
cout << "Число вхождений строки \"" << search_string << "\": " << count << endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
free(file_content);
|
|
|
|
free(file_content);
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|