Родитель
a4ce009dc1
Сommit
079d25ea5b
@ -0,0 +1,97 @@
|
|||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <cstring>
|
||||||
|
#include <cctype>
|
||||||
|
|
||||||
|
const int MAX_FILENAME_LENGTH = 256;
|
||||||
|
const int MAX_INPUT_STRING_LENGTH = 256;
|
||||||
|
|
||||||
|
bool isValidFilename(const char* filename) {
|
||||||
|
// Ïðîâåðêà íàëè÷èÿ çàïðåùåííûõ ñèìâîëîâ
|
||||||
|
const char* forbiddenChars = "*\"<>?|";
|
||||||
|
if (strpbrk(filename, forbiddenChars) != nullptr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ïðîâåðêà íàëè÷èÿ äâîåòî÷èÿ
|
||||||
|
const char* colonPosition = strchr(filename, ':');
|
||||||
|
if (colonPosition != nullptr) {
|
||||||
|
if (colonPosition == filename + 1 && isalpha(filename[0])) {
|
||||||
|
// Ïðîâåðêà äâîåòî÷èÿ òîëüêî âòîðûì ñèìâîëîì
|
||||||
|
const char* backslashPosition = strchr(colonPosition + 1, '\\');
|
||||||
|
if (backslashPosition == nullptr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ïðîâåðêà ðàñøèðåíèÿ ôàéëà
|
||||||
|
const char* extension = strrchr(filename, '.');
|
||||||
|
if (extension != nullptr) {
|
||||||
|
if (strcmp(extension, ".txt") != 0 && strcmp(extension, ".TXT") != 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
// Çàïðîñ èìåíè ôàéëà
|
||||||
|
char filename[MAX_FILENAME_LENGTH];
|
||||||
|
std::cout << "Ââåäèòå èìÿ ôàéëà: ";
|
||||||
|
std::cin.getline(filename, MAX_FILENAME_LENGTH);
|
||||||
|
|
||||||
|
// Ïðîâåðêà êîððåêòíîñòè èìåíè ôàéëà
|
||||||
|
if (!isValidFilename(filename)) {
|
||||||
|
std::cerr << "Íåêîððåêòíîå èìÿ ôàéëà.\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Äîáàâëåíèå ðàñøèðåíèÿ .txt, åñëè åãî íåò
|
||||||
|
if (strrchr(filename, '.') == nullptr) {
|
||||||
|
strcat(filename, ".txt");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Îòêðûòèå ôàéëà
|
||||||
|
std::ifstream file(filename, std::ios::binary);
|
||||||
|
if (!file.is_open()) {
|
||||||
|
std::cerr << "Îøèáêà îòêðûòèÿ ôàéëà.\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Îïðåäåëåíèå ðàçìåðà ôàéëà
|
||||||
|
file.seekg(0, std::ios::end);
|
||||||
|
std::streampos fileSize = file.tellg();
|
||||||
|
file.seekg(0, std::ios::beg);
|
||||||
|
|
||||||
|
// Âûäåëåíèå ïàìÿòè ïîä ñîäåðæèìîå ôàéëà
|
||||||
|
char* fileContent = new char[fileSize];
|
||||||
|
|
||||||
|
// ×òåíèå ñîäåðæèìîãî ôàéëà â ïàìÿòü
|
||||||
|
file.read(fileContent, fileSize);
|
||||||
|
file.close();
|
||||||
|
|
||||||
|
// Çàïðîñ ñòðîêè îò ïîëüçîâàòåëÿ
|
||||||
|
char inputString[MAX_INPUT_STRING_LENGTH];
|
||||||
|
std::cout << "Ââåäèòå ñòðîêó äëÿ ïîèñêà: ";
|
||||||
|
std::cin.getline(inputString, MAX_INPUT_STRING_LENGTH);
|
||||||
|
|
||||||
|
// Ïîäñ÷åò âõîæäåíèé ñòðîêè â ôàéë
|
||||||
|
int occurrences = 0;
|
||||||
|
char* position = fileContent;
|
||||||
|
while ((position = strstr(position, inputString)) != nullptr) {
|
||||||
|
occurrences++;
|
||||||
|
position += strlen(inputString);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Âûâîä ðåçóëüòàòà
|
||||||
|
std::cout << "×èñëî âõîæäåíèé ñòðîêè â ôàéë: " << occurrences << std::endl;
|
||||||
|
|
||||||
|
// Îñâîáîæäåíèå âûäåëåííîé ïàìÿòè
|
||||||
|
delete[] fileContent;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@ -0,0 +1,102 @@
|
|||||||
|
#### 4. Работа со строками C
|
||||||
|
|
||||||
|
```
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <cstring>
|
||||||
|
#include <cctype>
|
||||||
|
|
||||||
|
const int MAX_FILENAME_LENGTH = 256;
|
||||||
|
const int MAX_INPUT_STRING_LENGTH = 256;
|
||||||
|
|
||||||
|
bool isValidFilename(const char* filename) {
|
||||||
|
// Проверка наличия запрещенных символов
|
||||||
|
const char* forbiddenChars = "*\"<>?|";
|
||||||
|
if (strpbrk(filename, forbiddenChars) != nullptr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверка наличия двоеточия
|
||||||
|
const char* colonPosition = strchr(filename, ':');
|
||||||
|
if (colonPosition != nullptr) {
|
||||||
|
if (colonPosition == filename + 1 && isalpha(filename[0])) {
|
||||||
|
// Проверка двоеточия только вторым символом
|
||||||
|
const char* backslashPosition = strchr(colonPosition + 1, '\\');
|
||||||
|
if (backslashPosition == nullptr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверка расширения файла
|
||||||
|
const char* extension = strrchr(filename, '.');
|
||||||
|
if (extension != nullptr) {
|
||||||
|
if (strcmp(extension, ".txt") != 0 && strcmp(extension, ".TXT") != 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
// Запрос имени файла
|
||||||
|
char filename[MAX_FILENAME_LENGTH];
|
||||||
|
std::cout << "Введите имя файла: ";
|
||||||
|
std::cin.getline(filename, MAX_FILENAME_LENGTH);
|
||||||
|
|
||||||
|
// Проверка корректности имени файла
|
||||||
|
if (!isValidFilename(filename)) {
|
||||||
|
std::cerr << "Некорректное имя файла.\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Добавление расширения .txt, если его нет
|
||||||
|
if (strrchr(filename, '.') == nullptr) {
|
||||||
|
strcat(filename, ".txt");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Открытие файла
|
||||||
|
std::ifstream file(filename, std::ios::binary);
|
||||||
|
if (!file.is_open()) {
|
||||||
|
std::cerr << "Ошибка открытия файла.\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Определение размера файла
|
||||||
|
file.seekg(0, std::ios::end);
|
||||||
|
std::streampos fileSize = file.tellg();
|
||||||
|
file.seekg(0, std::ios::beg);
|
||||||
|
|
||||||
|
// Выделение памяти под содержимое файла
|
||||||
|
char* fileContent = new char[fileSize];
|
||||||
|
|
||||||
|
// Чтение содержимого файла в память
|
||||||
|
file.read(fileContent, fileSize);
|
||||||
|
file.close();
|
||||||
|
|
||||||
|
// Запрос строки от пользователя
|
||||||
|
char inputString[MAX_INPUT_STRING_LENGTH];
|
||||||
|
std::cout << "Введите строку для поиска: ";
|
||||||
|
std::cin.getline(inputString, MAX_INPUT_STRING_LENGTH);
|
||||||
|
|
||||||
|
// Подсчет вхождений строки в файл
|
||||||
|
int occurrences = 0;
|
||||||
|
char* position = fileContent;
|
||||||
|
while ((position = strstr(position, inputString)) != nullptr) {
|
||||||
|
occurrences++;
|
||||||
|
position += strlen(inputString);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Вывод результата
|
||||||
|
std::cout << "Число вхождений строки в файл: " << occurrences << std::endl;
|
||||||
|
|
||||||
|
// Освобождение выделенной памяти
|
||||||
|
delete[] fileContent;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Данный код выполняет все шаги, описанные в задании: запрос имени файла, проверка корректности имени, добавление расширения .txt, загрузка содержимого файла в память, запрос строки от пользователя, подсчет и вывод числа вхождений строки в файл, а затем освобождение памяти.
|
Загрузка…
Ссылка в новой задаче