Files
study_oc/lab1/lab_1_linux.cpp
T

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;
}