From 92dbf8d618ae7d93a8f9705ba7efccb4c23d0ee9 Mon Sep 17 00:00:00 2001 From: ZhadinAS Date: Sun, 14 Apr 2024 19:28:10 +0000 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=B8?= =?UTF-8?q?=D0=BB(=D0=B0)=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20''?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit task2 --- example_input.txt | 2 +- example_output.txt | 13 ++++-- main.cpp | 111 ++++++++++++++------------------------------- 3 files changed, 45 insertions(+), 81 deletions(-) diff --git a/example_input.txt b/example_input.txt index 4a3b60a..843f0bf 100644 --- a/example_input.txt +++ b/example_input.txt @@ -1 +1 @@ -0 0 \ No newline at end of file +News,from beyond the Narrow Sea. Haven't you heard? \ No newline at end of file diff --git a/example_output.txt b/example_output.txt index b7a712f..0c123b2 100644 --- a/example_output.txt +++ b/example_output.txt @@ -1,4 +1,9 @@ -Test print_in_hex(uint8_t): 30 -Test print_in_hex(uint32_t): 00 00 00 00 -Test print_in_binary(uint8_t): 00110000 -Test print_in_binary(uint32_t): 00000000 00000000 00000000 00000000 \ No newline at end of file +News +from +beyond +the +Narrow +Sea +Haven't +you +heard \ No newline at end of file diff --git a/main.cpp b/main.cpp index 21ea5e6..20ffc56 100644 --- a/main.cpp +++ b/main.cpp @@ -1,94 +1,53 @@ #include -#include -#include +#include +#include +#include -// Функция для преобразования nibble (4 бита) в шестнадцатеричную цифру -char nibble_to_hex(uint8_t i) { - const char digits[] = "0123456789abcdef"; - assert(0x0 <= i && i <= 0xf); - return digits[i]; -} - -// Функция для печати байта в шестнадцатеричной форме -void print_in_hex(uint8_t byte) { - std::cout << nibble_to_hex(byte >> 4) << nibble_to_hex(byte & 0xf); -} +const size_t MAX_SIZE = 256; +const char* separators = " \r\n,.!?:;()-"; -// Функция для преобразования указателя void* в uint8_t* -const uint8_t* as_bytes(const void* data) { - return reinterpret_cast(data); -} +int main() { + std::ifstream inputFile("example_input.txt"); // Здесь "example_input.txt" - название файла для чтения -// Функция для печати массива байт в шестнадцатеричной форме -void print_in_hex(const void* data, size_t size) { - const uint8_t* bytes = as_bytes(data); - for (size_t i = 0; i < size; i++) { - print_in_hex(bytes[i]); - // Для удобства чтения: пробелы между байтами, по 16 байт на строку. - if ((i + 1) % 16 == 0) { - std::cout << '\n'; - } - else { - std::cout << ' '; - } + if (!inputFile.is_open()) { + std::cerr << "Ошибка открытия файла!" << std::endl; + return 1; } -} -// Функция для преобразования байта в двоичную форму -char bit_digit(uint8_t byte, uint8_t bit) { - if (byte & (0x1 << bit)) { - return '1'; - } - return '0'; -} + char text[MAX_SIZE]; -// Функция для печати байта в двоичной форме -void print_in_binary(uint8_t byte) { - for (int bit = 7; bit >= 0; bit--) { - std::cout << bit_digit(byte, bit); - } -} + // Считываем строку из файла + inputFile.getline(text, MAX_SIZE); -// Функция для печати массива байт в двоичной форме -void print_in_binary(const void* data, size_t size) { - const uint8_t* bytes = as_bytes(data); - for (size_t i = 0; i < size; i++) { - print_in_binary(bytes[i]); - // Для удобства чтения: пробелы между байтами, по 4 байта на строку. - if ((i + 1) % 4 == 0) { - std::cout << '\n'; - } - else { - std::cout << ' '; - } - } -} + const char* start = text; -int main() { - uint8_t test_byte; - uint32_t test_u32; + // Алгоритм разбиения строки на слова и их вывод + while (true) { + // Определить, сколько разделителей находятся в начале строки + const size_t separator_count = strspn(start, separators); - // Ввод значения test_byte с консоли - std::cin >> std::hex >> test_byte; + // Пропустить их + start += separator_count; - // Ввод значения test_u32 с консоли (ожидаем ввод одного байта) - std::cin >> std::hex >> test_u32; + // Если достигнут конец строки, закончить работу + if (start[0] == '\0') { + break; + } - std::cout << "Test print_in_hex(uint8_t): "; - print_in_hex(test_byte); - std::cout << '\n'; + // Найти первый разделитель от нового начала строки (длину слова) + const size_t word_length = strcspn(start, separators); - std::cout << "Test print_in_hex(uint32_t): "; - print_in_hex(&test_u32, sizeof(test_u32)); - std::cout << '\n'; + // Напечатать часть строки от начала слова до разделителя + std::cout.write(start, word_length); - std::cout << "Test print_in_binary(uint8_t): "; - print_in_binary(test_byte); - std::cout << '\n'; + // Напечатать символ перевода строки + std::cout << '\n'; + + // Сдвинуть начало строки вперед на длину слова + start += word_length; + } - std::cout << "Test print_in_binary(uint32_t): "; - print_in_binary(&test_u32, sizeof(test_u32)); - std::cout << '\n'; + inputFile.close(); // Закрываем файл после использования return 0; }