лаб1 сделана только для linux
This commit is contained in:
@@ -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 <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;
|
||||
}
|
||||
Reference in New Issue
Block a user