Создал(а) 'Задание №4'

master
SergeevArS 5 месяцев назад
Родитель fdbf740908
Сommit eb30fae49d

@ -0,0 +1,121 @@
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <locale>
using namespace std;
const size_t MAX_SIZE = 256;
const char not_allowed[] = "*\"<>?|";
const char separators[] = " \r\n,.!?:;()-";
// Функция для получения строки с пользовательским вводом
void getstring(char* s, size_t n) {
fgets(s, n, stdin);
if (s[strlen(s) - 1] == '\n')
s[strlen(s) - 1] = '\0';
}
// Функция для перевода строки в нижний регистр
void lower(char* s) {
for (; *s; s++)
*s = tolower(*s);
}
// Функция для проверки корректности имени файла
bool iscorrectname(char* name) {
char lext[8];
// Проверка на наличие запрещенных символов
for (int i = 0; name[i]; i++) {
if (strchr(not_allowed, name[i]) != 0)
return false;
}
// Проверка корректности двоеточия и пути
char* colon = strchr(name, ':');
if (colon != NULL) {
if (colon - name != 1)
return false;
if (colon[1] != '\\')
return false;
if (strrchr(name, ':') != colon)
return false;
}
// Проверка и добавление расширения .txt
char* fname = strrchr(name, '\\');
fname = fname ? fname + 1 : name;
char* ext = strchr(fname, '.');
if (ext == NULL)
strcat(name, ".txt");
else {
strcpy(lext, ext);
lower(lext);
if (strcmp(lext, ".txt"))
return false;
}
return true;
}
int main() {
setlocale(LC_ALL, "rus");
char filename[MAX_SIZE];
char str[MAX_SIZE];
cout << "Название файла: ";
getstring(filename, MAX_SIZE);
// Проверка имени файла
if (!iscorrectname(filename)) {
cout << "Некорректное название файла\n";
return -1;
}
// Открытие файла
FILE* fin = fopen(filename, "rb");
if (fin == NULL) {
cout << "Файл не найден\n";
return -1;
}
// Определение размера файла
fseek(fin, 0, SEEK_END);
size_t length = ftell(fin);
fseek(fin, 0, SEEK_SET);
// Чтение содержимого файла в память
char* text = new char[length + 1];
memset(text, 0, length + 1);
fread(text, 1, length, fin);
cout << "Введите символы для подсчёта: ";
getstring(str, MAX_SIZE);
// Подсчет вхождений строки
const char* start = text;
size_t count = 0;
while (true) {
const size_t separator_count = strspn(start, separators);
start += separator_count;
if (start[0] == '\0') {
break;
}
const size_t word_length = strcspn(start, separators);
if (word_length == strlen(str) && strncmp(str, start, word_length) == 0) {
count++;
}
start += word_length;
}
cout << "Результат: " << count << "\n";
// Освобождение памяти и закрытие файла
fclose(fin);
delete[] text;
return 0;
}
Загрузка…
Отмена
Сохранить