diff --git a/lab04/main.cpp b/lab04/main.cpp index dca8eff..ee21f08 100644 --- a/lab04/main.cpp +++ b/lab04/main.cpp @@ -3,6 +3,9 @@ #include #include #include +#include +#include +#include using namespace std; @@ -104,6 +107,29 @@ struct Student { Student* monitor; // 8 байт (для 64-битной системы) }; + +bool is_valid_filename(const char* name) { + const char* forbidden = "*\"<>?|"; + for (size_t i = 0; i < strlen(name); i++) { + if (strchr(forbidden, name[i])) return false; + } + + // Проверка двоеточия + const char* colon = strchr(name, ':'); + if (colon) { + if (colon - name != 1 || !isalpha(name[0]) || *(colon + 1) != '\\') + return false; + } + + // Проверка расширения + const char* dot = strrchr(name, '.'); + if (dot) { + if (strncasecmp(dot, ".txt", 4) != 0) return false; + } + + return true; +} + int main() { // Тестирование чисел из лекционного слайда uint16_t a = 0x4d2; // 1234 в десятичной @@ -185,6 +211,52 @@ int main() { cout << endl; + + char filename[256]; + cout << "Enter file name: "; + cin.getline(filename, 256); + + if (!is_valid_filename(filename)) { + cerr << "Incorrect file name!"; + return 1; + } + + // Добавление .txt при отсутствии расширения + if (!strrchr(filename, '.')) { + strcat(filename, ".txt"); + } + + // Загрузка файла + ifstream file(filename, ios::binary | ios::ate); + if (!file) { + cerr << "Error open file!"; + return 1; + } + + streamsize size = file.tellg(); + file.seekg(0, ios::beg); + char* buffer = new char[size + 1]; + file.read(buffer, size); + buffer[size] = '\0'; + + // Поиск подстроки + char query[256]; + cout << "Enter line for find: "; + cin.getline(query, 256); + + int count = 0; + const char* ptr = buffer; + while ((ptr = strstr(ptr, query)) != nullptr) { + count++; + ptr += strlen(query); + } + + cout << "number of occurrences: " << count << endl; + + delete[] buffer; + + cout << endl; + char op; cout << "Enter first operand (hex): "; @@ -204,6 +276,7 @@ int main() { return 1; } + // Вывод в hex cout << "\nResult (hex): "; print_in_hex(a);