/* Задание 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; }