Вы не можете выбрать более 25 тем
Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
|
1 год назад | |
---|---|---|
lab04.4.cbp | 1 год назад | |
main.cpp | 1 год назад | |
readme.md | 1 год назад |
readme.md
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, загрузка содержимого файла в память, запрос строки от пользователя, подсчет и вывод числа вхождений строки в файл, а затем освобождение памяти.