125 lines
5.1 KiB
C++
125 lines
5.1 KiB
C++
|
|
/*
|
||
|
|
Задание 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 <stdio.h>
|
||
|
|
#include <unistd.h>
|
||
|
|
#include <fcntl.h>
|
||
|
|
|
||
|
|
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;
|
||
|
|
}
|