Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2012- СИСПРОГ на МАСМ.doc
Скачиваний:
21
Добавлен:
09.11.2019
Размер:
553.47 Кб
Скачать

4.2.2Потоки вывода и ввода

В ОС Windows, как и во многих других, в отношении ввода-вывода применяется абстракция «файл». В информатике в самой общей трактовке используют следующее определение: файл — это поименованная последовательность байтов.

Имеют подобные файлам имена и обрабатываются логически похожим образом:

  • области данных (необязательно на диске);

  • устройства (порты - как физические, так и виртуальные);

  • потоки данных («именованный канал»);

  • сетевые ресурсы, сокеты;

  • объекты операционной системы.

В ОС Windows c открытым файлом (и не только с файлами) связывается дескриптор (описатель, хэндлер), который по смыслу есть индекс в некоей таблице указателей на объекты, с которыми работает ОС. При закрытии файла хэндлер теряет смысл.

Если на абстрактный объект «последовательный файл» накладывается еще дополнительное ограничение - запрет на обратное перемещение относительно текущей позиции в файле, то получается еще одна часто используемая информационная абстракция – «поток». Получается, что из входного потока можно только читать всё новые и новые порции данных, но повторно перечитать ранее прочитанное нельзя. Аналогично, в выводной поток можно передавать все новые и новые данные, но «перемотать поток назад» и переписать часть его содержимого по-другому нельзя. Как мы видим, всё это очень похоже на события, которые в реальном мире связаны со временем их совершения (во времени обратно двигаться нельзя по физике нашего мира, а в потоке – по договоренности, но аналогия есть). Абстракция «поток» и придумана для моделирования «событий во времени».

В Unix-системах со всякой программой по умолчанию связываются три стандартных логических потока – вводной stdin (номер 0), выводной stdout (номер 1) и поток вывода сообщений об ошибках stderr (номер 2). В ОС Windows этого обязательного условия нет, но в этом курсе эти имена нам встретятся в качестве имен процедур вывода и ввода и полезно понимать состояние вопроса.

4.2.3Вывод и ввод в консольных приложениях

Консольный режим работы приложения характеризуется несколькими особенностями. Во-первых, вывод и ввод имеют исключительно символьный характер (это означает, что нельзя, к примеру, ввести в программу число 94, это будет воспринято как строка «94»). Во-вторых, вывод производится в текущую позицию экрана текстового экрана консоли, с которым в памяти связан экранный буфер консоли. В-третьих, ввод связывается с клавиатурой или, в случае перенаправления, с текстовым файлом.

При консольном выводе прямо или косвенно используется функция WinAPI WriteFile,

BOOL WriteFile(

HANDLE hFile, // дескриптор файла

LPCVOID lpBuffer, // буфер данных

DWORD nNumberOfBytesToWrite, // число байтов для записи

LPDWORD lpNumberOfBytesWritten, // число записанных байтов

LPOVERLAPPED lpOverlapped // асинхронный буфер

);

описание которой находится по адресу http://msdn.microsoft.com/en-us/library/ms892380.aspx.

При консольном вводе прямо или косвенно используется функция WinAPI ReadFile

BOOL WINAPI ReadFile(

__in         HANDLE hFile,

__out        LPVOID lpBuffer,

__in         DWORD nNumberOfBytesToRead,

__out_opt    LPDWORD lpNumberOfBytesRead,

__inout_opt  LPOVERLAPPED lpOverlapped

);

описание которой находится по адресу http://msdn.microsoft.com/en-us/library/windows/desktop/aa365467%28v=vs.85%29.aspx/