Вы не можете выбрать более 25 тем
Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
94 строки
2.7 KiB
C++
94 строки
2.7 KiB
C++
#include <iostream>
|
|
#include <fstream>
|
|
#include <cstring>
|
|
#include <cctype>
|
|
|
|
// Êîíñòàíòû
|
|
const size_t MAX_SIZE = 256;
|
|
const char* separators = " \r\n,.!?:;()-";
|
|
const char* forbidden_chars = "*\"<>|?";
|
|
|
|
// Ôóíêöèÿ äëÿ ïðîâåðêè êîððåêòíîñòè èìåíè ôàéëà
|
|
bool is_valid_filename(const char* filename) {
|
|
// Ïðîâåðêà íà çàïðåùåííûå ñèìâîëû
|
|
if (strpbrk(filename, forbidden_chars)) {
|
|
return false;
|
|
}
|
|
|
|
// Ïðîâåðêà íà äâîåòî÷èå
|
|
const char* colon_pos = strchr(filename, ':');
|
|
if (colon_pos && (colon_pos != filename + 1 || !isalpha(colon_pos[-1]) || colon_pos[1] != '\\')) {
|
|
return false;
|
|
}
|
|
|
|
// Ïðîâåðêà ðàñøèðåíèÿ
|
|
const char* dot_pos = strrchr(filename, '.');
|
|
if (dot_pos && strncmp(dot_pos, ".txt", 4) != 0 && strncmp(dot_pos, ".TXT", 4) != 0) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// Ôóíêöèÿ äëÿ äîáàâëåíèÿ ðàñøèðåíèÿ .txt, åñëè åãî íåò
|
|
void add_txt_extension(char* filename) {
|
|
const char* dot_pos = strrchr(filename, '.');
|
|
if (!dot_pos || strncmp(dot_pos, ".txt", 4) != 0) {
|
|
strcat(filename, ".txt");
|
|
}
|
|
}
|
|
|
|
int main() {
|
|
// Øàã 4.1: Çàïðîñèòü ó ïîëüçîâàòåëÿ èìÿ ôàéëà
|
|
char filename[MAX_SIZE];
|
|
std::cout << "Enter the filename: ";
|
|
std::cin.getline(filename, MAX_SIZE);
|
|
|
|
// Øàã 4.2: Ïðîâåðèòü êîððåêòíîñòü èìåíè ôàéëà
|
|
if (!is_valid_filename(filename)) {
|
|
std::cerr << "Invalid filename." << std::endl;
|
|
return 1;
|
|
}
|
|
|
|
// Øàã 4.3: Äîáàâèòü ðàñøèðåíèå .txt, åñëè åãî íåò
|
|
add_txt_extension(filename);
|
|
|
|
// Øàã 4.4: Çàãðóçèòü ñîäåðæèìîå òåêñòîâîãî ôàéëà â ïàìÿòü
|
|
std::ifstream file(filename, std::ios::binary | std::ios::ate);
|
|
if (!file) {
|
|
std::cerr << "Failed to open file." << std::endl;
|
|
return 1;
|
|
}
|
|
|
|
std::streamsize size = file.tellg();
|
|
file.seekg(0, std::ios::beg);
|
|
|
|
char* buffer = new char[size + 1];
|
|
if (!file.read(buffer, size)) {
|
|
std::cerr << "Failed to read file." << std::endl;
|
|
delete[] buffer;
|
|
return 1;
|
|
}
|
|
buffer[size] = '\0';
|
|
file.close();
|
|
|
|
// Øàã 4.5: Çàïðîñèòü ó ïîëüçîâàòåëÿ ñòðîêó
|
|
char search_string[MAX_SIZE];
|
|
std::cout << "Enter the string to search: ";
|
|
std::cin.getline(search_string, MAX_SIZE);
|
|
|
|
// Øàã 4.6: Ïîäñ÷èòàòü è âûâåñòè ÷èñëî âõîæäåíèé ñòðîêè â òåêñò ôàéëà
|
|
int count = 0;
|
|
const char* pos = buffer;
|
|
while ((pos = strstr(pos, search_string)) != nullptr) {
|
|
count++;
|
|
pos++;
|
|
}
|
|
std::cout << "The string \"" << search_string << "\" occurs " << count << " times in the file." << std::endl;
|
|
|
|
// Øàã 4.7: Îñâîáîäèòü âûäåëåííóþ ïàìÿòü
|
|
delete[] buffer;
|
|
|
|
return 0;
|
|
}
|