From 9ecda02fabc7c67f673f96e7e6d3838195fb460e Mon Sep 17 00:00:00 2001 From: s13bby Date: Fri, 18 Sep 2026 10:03:49 +0600 Subject: [PATCH] =?UTF-8?q?=D0=BB=D0=B0=D0=B11=20=D1=81=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B0=D0=BD=D0=B0=20=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20linux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab1/in | 3 + lab1/lab_1_linux.cpp | 124 +++++++++++++++++++++++++++++++++++++++++ lab1/lab_1_windows.cpp | 0 lab1/test | 1 + 4 files changed, 128 insertions(+) create mode 100644 lab1/in create mode 100644 lab1/lab_1_linux.cpp create mode 100644 lab1/lab_1_windows.cpp create mode 100644 lab1/test diff --git a/lab1/in b/lab1/in new file mode 100644 index 0000000..e3f5439 --- /dev/null +++ b/lab1/in @@ -0,0 +1,3 @@ +test +amongus +amongus??????? diff --git a/lab1/lab_1_linux.cpp b/lab1/lab_1_linux.cpp new file mode 100644 index 0000000..4724bdd --- /dev/null +++ b/lab1/lab_1_linux.cpp @@ -0,0 +1,124 @@ +/* +Задание 1. Windows + +Цель: +Изучить работу со стандартным вводом и выводом с использованием системных функций WinAPI. + +Задачи: + +✔1. Получить хэндлы стандартного ввода и вывода. +✔2. Вывести числовые значения полученных хэндлов с пояснениями. +✔3. Вывести приглашение для ввода с помощью системной функции вывода. +✔4. Считать произвольный текст со стандартного ввода с помощью ReadFile. +✔5. Вывести поясняющий текст отдельным вызовом системной функции вывода. +✔6. Вывести введённый текст с помощью WriteFile. +✔7. Продемонстрировать работу программы при обычном запуске. +✔8. Продемонстрировать работу программы с перенаправлением стандартного ввода из файла. +✔9. Продемонстрировать работу программы с перенаправлением стандартного вывода в файл. + +Задание 2. Linux + +Цель: +Изучить работу со стандартным вводом и выводом в Linux и обработку перенаправления потоков. + +Задачи: + +1. Разработать программу, выполняющую ввод текста со стандартного ввода и вывод результата. +2. Определять, является ли стандартный ввод терминалом или перенаправлен из файла. +3. Выводить приглашение для ввода только при вводе с консоли. +4. Не выводить приглашение при перенаправлении стандартного ввода из файла. +5. При перенаправлении стандартного вывода в файл выводить приглашение на экран, если ввод выполняется с консоли. +6. Вывести введённый текст с предварительным поясняющим сообщением. +7. Продемонстрировать работу программы при обычном запуске. +8. Продемонстрировать работу с перенаправлением ввода из файла. +9. Продемонстрировать работу с перенаправлением вывода в файл. +*/ + +#include +#include +#include + +ssize_t readline(int fd, char* buffer, size_t len){ + size_t b_rcv = 0; + char ch; + + while (b_rcv < len - 1){ + ssize_t n = read(fd, &ch, 1); + + if (n < 0){ + return -1; + } + + if (n == 0){ + break; + } + + if (ch == '\n'){ + break; + } + + buffer[b_rcv++] = ch; + } + + buffer[b_rcv] = '\0'; + return b_rcv; +} + +int main() { + int stdin_handle = STDIN_FILENO; + int stdout_handle = STDOUT_FILENO; + + char buffer[512]; + + ssize_t buffer_recive; + + int is_tty = isatty(stdin_handle); + if (is_tty){ + write(stdout_handle, "ввод из терминала...\n", sizeof("ввод из терминала...\n") - 1); + } + else{ + write(stdout_handle, "ввод из НЕ терминала...\n", sizeof("ввод из НЕ терминала...\n") - 1); + stdout_handle = open("log", O_WRONLY | O_CREAT | O_TRUNC, 0644); + } + + write(stdout_handle, "введите название файла... \n", sizeof("введите название файла... \n") - 1); + + buffer_recive = readline(stdin_handle, buffer, sizeof(buffer)); + + write(stdout_handle, "введено: \n", sizeof("введено: \n") - 1); + write(stdout_handle, buffer, buffer_recive); + write(stdout_handle, "\n", 1); + + write(stdout_handle, "открывается файл: \n", sizeof("открывается файл: \n") - 1); + write(stdout_handle, buffer, buffer_recive); + write(stdout_handle, "\n", 1); + + int file = open(buffer, O_RDONLY); + + buffer_recive = read(file, buffer, sizeof(buffer)); + close(file); + + write(stdout_handle, "содержимое файла: \n", sizeof("содержимое файла: \n") - 1); + write(stdout_handle, buffer, buffer_recive); + write(stdout_handle, "\n", 1); + + write(stdout_handle, "введите название файла для записи... \n", sizeof("введите название файла для записи... \n") - 1); + + buffer_recive = readline(stdin_handle, buffer, sizeof(buffer)); + + int file_w = open(buffer, O_WRONLY | O_CREAT | O_TRUNC, 0644); + + write(stdout_handle, "введите текст для записи в файл: \n", sizeof("введите текст для записи в файл: \n") - 1); + + buffer_recive = readline(stdin_handle, buffer, sizeof(buffer)); + + write(file_w, buffer, buffer_recive); + + close(file_w); + + if (!is_tty){ + close(stdout_handle); + } + + return 0; +} diff --git a/lab1/lab_1_windows.cpp b/lab1/lab_1_windows.cpp new file mode 100644 index 0000000..e69de29 diff --git a/lab1/test b/lab1/test new file mode 100644 index 0000000..2a2e793 --- /dev/null +++ b/lab1/test @@ -0,0 +1 @@ +asdasdasdasdasdasdasdasdas