|
ПРИМЕЧАНИЕ | Помните, что перенаправление потоков stdin и stdout – это возможность операционной системы, а не самого языка Си. Тем не менее, это еще одно свидетельство гибкости и удобства потоков ввода-вывода. Более подробную информацию о перенаправлении можно найти в документации операционной системы. |
Пример:
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
main ()
{
int e;
e=open (“file.out”, O_CREAT | O_WRONLY);
dup2 (e, 1); // переназначит стандартный вывод с дескриптором 1 (stdin) в «file.out»
printf (“Пример\n”);
}
Результат: слово “Пример” в файле «file.out»без вывода на экран
13.8. функции чтения и записи данных |
К функциям чтения и записи данных относятся две функции read() и write() из библиотеки «io.h».
Формат:
int read (int дескриптор, void * имя_указателя, unsigned колич );
Данная функция выполняет чтение колич -байт из открытого файла с дескриптором дескриптор и размещенного по адресу, на который ссылается указатель * имя_указателя. В случае успеха функция возвращает прочитанное число байтов, а при ошибке – «-1».
Формат:
int write (int дескриптор, void * имя_указателя, unsigned колич );
Данная функция выполняет запись колич -байт в открытый файл с дескриптором дескриптор и размещенного по адресу, на который ссылается указатель * имя_указателя. В случае успеха функция возвращает записанное число байтов, а при ошибке – «-1».
Функция lseek() позволяет установить текущий указатель чтения/записи. Функция tell() позволяет определить текущую позицию указателя.
ВНИМАНИЕ | Функции lseek() и tell() нельзя применять к устройствам. |
Пример:
char string[512]=”Тестовая строка”;
...
handle=creat (“DATA”, S_IREAD | S_IWRITE); // S_IREAD и S_IWRITE находятся в «sys\stat.h »
write (handle, string, sizeof (string));
read (handle, string, 512);
...
close (handle);
13.9. Ввод-вывод для консоли и портов |
С помощью функций, прототипы которых находятся в библиотеке «stdio.h», нельзя выполнить неотображенный на экран ввод символов, определить нажатие специальной клавиши и т.д. Для выполнения таких действий используются функции ввода-вывода для консоли ипортов, прототипы которых находятся в библиотеке «conio.h».
Функции для работы с консолью:
· cgets () – вводит строку с консоли
· cputs () – выводит строку в консоль
· cscanf () – вводит форматированные данные с консоли
· cprintf () – выводит форматированные данные в консоль
· getch () – вводит символ с консоль
· getc () – выводит символ с консоли и отображает его на экране
· ungetch () – «возвращает» прочитанный символ на консоль (записывает непосредственно в буфер клавиатуры символ, который будет прочитан при выполнении следующей операции чтения)
· putch () – выводит символ на консоль
· kbhit () – проверяет, была ли нажата клавиша на клавиатуре
Функции для работы с портами:
· inp () – читает один байт из порта
· inpw () – читает два байта из порта
· outp () – записывает один байт в порт
· outpw () – записывает два байта в порт
ВНИМАНИЕ | Для консоли и порта нет функций открывающих или закрывающих, т.к. консоль и порты не закрываются и не открываются во время ввода-вывода. |
Для организации интерфейса с пользователем, при котором нажатие клавиши вызывает мгновенную реакцию программы без отображения введенного символа на экране, полезна функция getch().
Формат:
int getch (void);
Данная функция выполняет ввод с клавиатуры одного символа и не выполняет эхо ввода на экран. В случае успеха функция возвращает введенный символ.
ПРИМЕЧАНИЕ | Для чтения функциональных клавиш функция должна вызываться дважды; в этом случае первый вызов возвращает ноль, а второй – код нажатой клавиши. |
Пример:
#include <stdio.h>
#include <conio.h>
main ()
{
int ch;
do
{
puts (“Нажмите клавишу\n”);
if (!(ch=getch()))
{
ch=getch();
printf (“Специальная клавиша (Код %u)\n”, ch);
}
else printf (“Символьная клавиша %c (Код %u)\n”, ch, ch);
puts (“Продолжить? (y/n)”);
}
while ((ch=getch())==’y’ || ch==’n’);
return 0;
}
Результат:
Нажмите клавишу
// нажат 0
Символьная клавиша 0 (Код 48)
Продолжить? (y/n)
Нажмите клавишу
// нажат F1
Символьная клавиша (Код 59)
Продолжить? (y/n)
Дата добавления: 2015-08-29; просмотров: 18 | Нарушение авторских прав
<== предыдущая лекция | | | следующая лекция ==> |