- Методы ввода и вывода Input and Output Methods
- High-Level консольного ввода-вывода High-Level Console I/O
- Ввод вывод windows консоль
- Консольный ввод
- Стандартные устройства и консольный ввод/вывод
- Читайте также
- 4.4. Ввод и вывод
- Ввод и вывод
- 5.2. Ввод и вывод литер
- Глава 12. Ввод—вывод
- 2.2.9. Перекрытый ввод-вывод
- 10.1.7. Простой ввод/вывод
- 2.1.4. Стандартный ввод-вывод
- Ввод и вывод
- Ввод/вывод
- 5.7. Файловый ввод–вывод
- 11.3. Устройства, для которых есть стандартные драйверы
Методы ввода и вывода Input and Output Methods
Существует два разных подхода к вводу-выводу в консоль, выбор которых зависит от того, насколько гибка и контролируется потребность в приложении. There are two different approaches to console I/O, the choice of which depends on how much flexibility and control an application needs. Высокоуровневый подход обеспечивает простой потоковый ввод-вывод, но ограничивает доступ к входным и экранным буферам консоли. The high-level approach enables simple character stream I/O, but it limits access to a console’s input and screen buffers. Для низкоуровневого подхода требуется, чтобы разработчики записывали больше кода и выбрали более широкий спектр функций, но это также предоставляет приложению большую гибкость. The low-level approach requires that developers write more code and choose among a greater range of functions, but it also gives an application more flexibility.
Подход низкого уровня не рекомендуется для новой и текущей разработки. The low-level approach is not recommended for new and ongoing development. Приложениям, которым требуются функциональные возможности низкоуровневых функций консольного ввода-вывода, рекомендуется использовать Виртуальные последовательности и исследовать документацию по классическим функциям и виртуальному терминалу , а также к стратегии экосистемы. Applications needing functionality from the low-level console I/O functions are encouraged to use virtual terminal sequences and explore our documentation on both classic functions versus virtual terminal and the ecosystem roadmap.
Приложение может использовать функции файлового ввода-вывода, ReadFile и WriteFile, а также консольные функции реадконсоле и вритеконсоледля высокого уровня ввода-вывода, обеспечивающего косвенный доступ к входным и буферам экрана консоли. An application can use the file I/O functions, ReadFile and WriteFile, and the console functions, ReadConsole and WriteConsole, for high-level I/O that provides indirect access to a console’s input and screen buffers. Входные функции высокого уровня фильтруют и обрабатывают данные в входном буфере консоли для возврата входных данных в виде потока символов, отменяя Ввод размера буфера и мыши. The high-level input functions filter and process the data in a console’s input buffer to return input as a stream of characters, discarding mouse and buffer-resizing input. Аналогичным образом, выходные функции верхнего уровня записывают поток символов, отображаемый в текущем положении курсора в буфере экрана. Similarly, the high-level output functions write a stream of characters that are displayed at the current cursor location in a screen buffer. Приложение управляет способом работы этих функций, устанавливая режимы ввода-вывода консоли. An application controls the way these functions work by setting a console’s I/O modes.
Низкоуровневые функции ввода-вывода предоставляют прямой доступ к входным и экранным буферам консоли, позволяя приложению обращаться к событиям ввода и изменения размера буфера мыши, а также расширенной информации для событий клавиатуры. The low-level I/O functions provide direct access to a console’s input and screen buffers, enabling an application to access mouse and buffer-resizing input events and extended information for keyboard events. Низкоуровневые функции вывода позволяют приложению считывать или записывать данные в указанное число последовательных символьных ячеек в буфере экрана, а также читать или записывать в прямоугольные блоки символьных ячеек в указанном месте в буфере экрана. Low-level output functions enable an application to read from or write to a specified number of consecutive character cells in a screen buffer, or to read or write to rectangular blocks of character cells at a specified location in a screen buffer. Входные режимы консоли влияют на вход низкого уровня, позволяя приложению определить, помещаются ли в входной буфер события, связанные с мышью и изменением размера буфера. A console’s input modes affect low-level input by enabling the application to determine whether mouse and buffer-resizing events are placed in the input buffer. Режимы вывода консоли не влияют на выходные данные низкого уровня. A console’s output modes have no effect on low-level output.
Методы ввода-вывода высокого и нижнего уровней не являются взаимоисключающими, и приложение может использовать любое сочетание этих функций. The high-level and low-level I/O methods are not mutually exclusive, and an application can use any combination of these functions. Однако, как правило, приложение использует один и тот же подход, и мы рекомендуем сосредоточиться на одной конкретной парадигме для достижения оптимальных результатов. Typically, however, an application uses one approach or the other exclusively and we recommend focusing on one particular paradigm for optimal results.
Идеальное приложение для прямого просмотра будет сосредоточиться на высокоуровневых методах и дополнять дополнительные потребности с помощью виртуальных последовательностей с помощью методов ввода-вывода высокого уровня, когда это необходимо, избегая использования функций низкоуровневого ввода-вывода полностью. The ideal forward looking application will focus on the high-level methods and augment further needs with virtual terminal sequences through the high-level I/O methods when necessary avoiding the use of low-level I/O functions entirely.
В следующих разделах описываются режимы консоли и функции ввода-вывода высокого уровня и низкого уровня. The following topics describe the console modes and the high-level and low-level I/O functions.
High-Level консольного ввода-вывода High-Level Console I/O
Функции ввода-вывода высокого уровня предоставляют простой способ чтения потока символов из входных данных консоли или для записи потока символов в выходные данные консоли. The high-level I/O functions provide a simple way to read a stream of characters from console input or to write a stream of characters to console output. Операция чтения высокого уровня получает входные символы из входного буфера консоли и сохраняет их в указанном буфере. A high-level read operation gets input characters from a console’s input buffer and stores them in a specified buffer. Операция записи высокого уровня принимает символы из указанного буфера и записывает их в буфер экрана в текущем положении курсора, переместив курсор по мере записи каждого символа. A high-level write operation takes characters from a specified buffer and writes them to a screen buffer at the current cursor location, advancing the cursor as each character is written.
Высокий уровень ввода-вывода позволяет выбрать между функциями ReadFile и WriteFile , а также функциями реадконсоле и вритеконсоле . High-level I/O gives you a choice between the ReadFile and WriteFile functions and the ReadConsole and WriteConsole functions. Они идентичны, за исключением двух важных различий. They are identical, except for two important differences. Функции консоли поддерживают использование либо символов Юникода, либо набора символов ANSI с помощью вариантов A и W каждой функции. функции файлового ввода-вывода не поддерживают Юникод, за исключением кодировки UTF-8 с CP_UTF8 константой в функциях Сетконсолекп и сетконсолеаутпуткп перед использованием. The console functions support the use of either Unicode characters or the ANSI character set through the A and W variants of each function; the file I/O functions do not support Unicode except for UTF-8 set with the CP_UTF8 constant on the SetConsoleCP and SetConsoleOutputCP functions prior to use. Кроме того, функции файлового ввода-вывода можно использовать для доступа к файлам, каналам и устройствам с последовательным обменом данными. функции консоли можно использовать только с дескрипторами консоли. Also, the file I/O functions can be used to access files, pipes, and serial communications devices; the console functions can only be used with console handles. Это различие важно, если приложение использует стандартные дескрипторы, которые могли быть перенаправлены. This distinction is important if an application relies on standard handles that may have been redirected.
При использовании любого набора функций высокого уровня приложение может управлять цветами текста и фона, используемыми для отображения символов, которые затем записываются в буфер экрана с помощью предпочтительного механизма через Виртуальные последовательностей терминалов. When using either set of high-level functions, an application can control the text and background colors used to display characters subsequently written to a screen buffer with the preferred mechanism being via virtual terminal sequences. Приложение также может использовать режимы консоли, влияющие на высокоуровневые операции ввода-вывода консоли, для включения или отключения следующих свойств: An application can also use the console modes that affect high-level console I/O to enable or disable the following properties:
- Вывод ввода с клавиатуры в активный буфер экрана Echoing of keyboard input to the active screen buffer
- Ввод строки, в которой операция чтения не возвращает значение до нажатия клавиши ВВОД Line input, in which a read operation does not return until the ENTER key is pressed
- Автоматическая обработка ввода с клавиатуры для обработки возвратов каретки, CTRL + C и других входных данных Automatic processing of keyboard input to handle carriage returns, CTRL+C, and other input details
- Автоматическая обработка выходных данных для обработки переноса строк, возврата каретки, Backspace и других выходных данных Automatic processing of output to handle line wrapping, carriage returns, backspaces, and other output details
Дополнительные сведения см. в следующих разделах: For more information, see the following topics:
Ввод вывод windows консоль
Для вывода информации на консоль мы уже использовали встроенный метод Console.WriteLine . То есть, если мы хотим вывести некоторую информацию на консоль, то нам надо передать ее в метод Console.WriteLine:
Нередко возникает необходимость вывести на консоль в одной строке значения сразу нескольких переменных. В этом случае мы можем использовать прием, который называется интерполяцией:
Для встраивания отдельных значений в выводимую на консоль строку используются фигурные скобки, в которые заключается встраиваемое значение. Это можем значение переменной (
При выводе на консоль вместо помещенных в фигурные скобки выражений будут выводиться их значения:
Есть другой способ вывода на консоль сразу нескольких значений:
Этот способ подразумевает, что первый параметр в методе Console.WriteLine представляет выводимую строку («Имя: <0>Возраст: <2>Рост: <1>м»). Все последующие параметры представляют значения, которые могут быть встроенны в эту строку (name, height, age). При этом важен порядок подобных параметров. Например, в данном случае вначале идет name, потом height и потом age. Поэтому у name будет представлять параметр с номером 0 (нумерация начинается с нуля), height имеет номер 1, а age — номер 2. Поэтому в строке «Имя: <0>Возраст: <2>Рост: <1>м» на место плейсхолдеров <0>, <2>, <1>будут вставляться значения соответствующих параметров.
Кроме Console.WriteLine() можно также использовать метод Console.Write() , он работает точно так же за тем исключением, что не осуществляет переход на следующую строку.
Консольный ввод
Кроме вывода информации на консоль мы можем получать информацию с консоли. Для этого предназначен метод Console.ReadLine() . Он позволяет получить введенную строку.
В данном случае все, что вводит пользователь, с помощью метода Console.ReadLine передается в переменную name.
Пример работы программы:
Таким образом мы можем вводить информацию через консоль. Однако минусом этого метода является то, что Console.ReadLine считывает информацию именно в виде строки. Поэтому мы можем по умолчанию присвоить ее только переменной типа string. Как нам быть, если, допустим, мы хотим ввести возраст в переменную типа int или другую информацию в переменные типа double или decimal? По умолчанию платформа .NET предоставляет ряд методов, которые позволяют преобразовать различные значения к типам int, double и т.д. Некоторые из этих методов:
Convert.ToInt32() (преобразует к типу int)
Convert.ToDouble() (преобразует к типу double)
Convert.ToDecimal() (преобразует к типу decimal)
Пример ввода значений:
При вводе важно учитывать текущую операционную систему. В одних культурах разделителем между целой и дробной частью является точка (США, Великобритания. ), в других — запятая (Россия, Германия. ). Например, если текущая ОС — русскоязычная, значит, надо вводить дробные числа с разделителем запятой. Если локализация англоязычная, значит, разделителем целой и дробной части при вводе будет точка.
Стандартные устройства и консольный ввод/вывод
Стандартные устройства и консольный ввод/вывод
Как и в UNIX, в Windows предусмотрены три стандартных устройства, предназначенные, соответственно, для ввода данных (input), вывода данных (output) и вывода сообщений об ошибках (error). В UNIX для этих устройств используются известные системе значения дескрипторов файлов (0, 1 и 2), однако в Windows доступ к стандартным устройствам осуществляется с помощью дескрипторов типа HANDLE, для получения которых предоставляется специальная функция.
HANDLE GetStdHandle(DWORD nStdHandle)
Возвращаемое значение: в случае успешного выполнения — действительный дескриптор, иначе — значение INVALID_HANDLE_VALUE.
Параметр nStdHandle должен принимать одно из следующих значений:
В качестве стандартных устройств обычно назначаются консоль и клавиатура. Стандартный ввод/вывод можно перенаправлять на другие устройства.
Вызов функции GetStdHandle не приводит к созданию новых или дублированию существующих дескрипторов стандартных устройств. Последовательные вызовы с указанием в качестве аргумента одного и того же устройства будут возвращать одно и то же значение дескриптора. Закрытие дескриптора стандартного устройства делает это устройство недоступным для дальнейшего использования. По этой причине в примерах ниже мы будем часто открывать дескриптор стандартного устройства, но не закрывать его.
BOOL SetStdHandle(DWORD nStdHandle, HANDLE hHandle)
Возвращаемое значение: в случае успешного выполнения — TRUE, иначе — FALSE.
Допустимые значения параметра nStdHandle функции SetStdHandle являются теми же, что и в случае функции GetStdHandle. Параметр hHandle указывает открытый файл, который назначается в качестве стандартного устройства.
Одним из методов перенаправления стандартного ввода/вывода является последовательный вызов функций SetStdHandle и GetStdHandle. Полученный в результате этого дескриптор используется в последующих операциях ввода/ вывода.
Для указания путей доступа к консольному вводу (клавиатуре) и консольному выводу предусмотрены два зарезервированных имени: «CONIN$» и «CONOUT$». Роль стандартных устройств ввода, вывода и вывода ошибок первоначально отводится консоли. Однако консоль можно использовать даже после того, как операции ввода/вывода, требующие применения стандартных устройств, будут перенаправлены; для этого требуется лишь открыть дескрипторы для файлов «CONIN$» и «CONOUT$», вызвав функцию CreateFile.
В UNIX стандартный ввод/вывод может быть перенаправлен одним из трех способов (см. [40], стр. 61—64).
Первый метод является косвенным и основывается на том, что функция dup возвращает дескриптор файла с наименьшим доступным номером. Предположим, вы хотите переназначить стандартный ввод (файловый дескриптор 0) открытому файлу, описанному как fd_redirect. Тогда можно записать следующий код:
Во втором методе используется функция dup2, а третий метод предполагает вызов замысловатой перегруженной функции fcntl с использованием в качестве параметра значения F_DUPFD.
Операции консольного ввода/вывода могут выполняться с помощью функций ReadFile и WriteFile, но проще использовать предназначенные специально для этого функции консоли ReadConsole и WriteConsole. Основное преимущество этих функций заключается в том, что они манипулируют не байтами, а обобщенными символами (TCHAR), и, кроме того, обрабатывают символы в соответствии с текущими режимами консоли, которые устанавливаются функцией SetConsoleMode.
BOOL SetConsoleMode(HANDLE hConsoleHandle, DWORD fdevMode)
Возвращаемое значение: тогда, и только тогда, когда функция завершается успешно — TRUE, иначе — FALSE.
hConsoleHandle — дескриптор буфера ввода консоли или буфера дисплея, который должен быть создан с правами доступа GENERIC_WRITE, даже если устройство предназначено только для ввода информации.
Параметр fdevMode задает способ обработки символов. В имени каждого из его флагов содержится компонент, указывающий, к чему относится данный флаг— к вводу (input) или выводу (output). Ниже перечислены пять обычно используемых флагов, причем все они устанавливаются по умолчанию.
• ENABLE_LINE_INPUT — возврат из функции чтения (ReadConsole) происходит только после считывания символа возврата каретки.
• ENABLE_ECHO_INPUT — эхо-отображение вводимых символов на экране.
• ENABLE_PROCESSED_INPUT — установка этого флага приводит к обработке системой управляющих символов возврата на одну позицию, возврата каретки и перехода на новую строку.
• ENABLE_PROCESSED_OUTPUT — установка этого флага приводит к обработке системой управляющих символов возврата на одну позицию, табуляции, подачи звукового сигнала, возврата каретки и перехода на новую строку.
• ENABLE_WRAP_AT_EOL_OUTPUT — переход на следующую строку экрана как при обычном выводе символов, так и при их эхо-отображении в процессе ввода.
В случае неудачного завершения функции SetConsoleMode текущий режим остается неизменным, и функция возвращает значение FALSE. Как обычно, для получения номера ошибки следует воспользоваться функцией GetLastError.
Функции ReadConsole и WriteConsole аналогичны функциям ReadFile и WriteFile.
BOOL ReadConsole(HANDLE hConsoleInput, LPVOID lpBuffer, DWORD cchToRead, LPDWORD lpcchRead, LPVOID lpReserved)
Возвращаемое значение: тогда, и только тогда, когда функция завершается успешно — TRUE, иначе — FALSE.
Параметры у этой функции почти те же, что и у функции ReadFile. Значения обоих параметров, связанных с количеством подлежащих считыванию (cchToRead) и фактически считанных (lpcchRead) символов, выражаются в терминах обобщенных символов, а не байтов, а значение параметра lpReserved должно быть равным NULL. Как и во всех остальных подобных случаях, никогда не используйте для собственных нужд зарезервированные поля, аналогичные lpReserved, которые встречаются в некоторых функциях. Параметры функции WriteConsole имеют тот же смысл и не нуждаются в дополнительных пояснениях. В очередном примере будет проиллюстрировано применение функций Read-Console и WriteConsole, и, кроме того, будет показано, как использовать возможности управления режимом консоли.
Любому процессу в каждый момент времени может быть назначена только одна консоль. Приложениям того типа, с которым мы имели дело до сих пор, консоль передается обычно на стадии инициализации. Однако в целом ряде других случаев, например, в случае серверных или GUI-приложений, у вас может возникнуть необходимость в получении отдельной консоли, на которую можно было бы выводить информацию о состоянии программы или отладочную информацию. Для этих целей можно воспользоваться двумя простыми функциями, не имеющими параметров.
Функция FreeConsole отключает процесс от его консоли, тогда как функция AllocConsole создает новую консоль, ассоциированную с дескрипторами стандартного ввода информации, стандартного вывода информации и стандартного вывода сообщений об ошибках, принадлежащими данному процессу. Если консоль у процесса уже имеется, функция AllocConsole завершится с ошибкой; чтобы избежать этого, следует предварительно вызывать функцию FreeConsole.
Примечание
GUI-приложения Windows не имеют консоли по умолчанию и должны получить ее, прежде чем смогут воспользоваться функциями WriteConsole или printf для вывода на консоль. Процессы на стороне сервера также могут не иметь консоли. О том, как создать процесс без консоли, рассказано в главе 6.
Имеется также множество других функций консольного ввода/вывода, предназначенных для установки позиции курсора, а также задания атрибутов выводимых символов (например, цвета) и так далее. Принятый в данной книге подход состоит в том, чтобы использовать лишь те функции, которые необходимы для создания примеров работоспособных программ, поэтому углубляться больше, чем это необходимо, в пользовательские интерфейсы мы не будем. После того как вы разберете примеры, для вас не составит большого труда изучить дополнительные функции, воспользовавшись справочными материалами.
Исторически сложилось так, что ОС Windows ориентирована на использование терминалов или консолей в меньшей степени, чем UNIX, и не полностью воспроизводит функциональные средства UNIX, поддерживающие работу с терминалами. В книге [40] одна из глав посвящена рассмотрению обеспечиваемых UNIX возможностей терминального ввода/вывода (глава 11), а другая — псевдотерминалам (глава 19).
Разумеется, работа в Windows почти всегда ведется с использованием мощных графических интерфейсов, поддерживающих мышь и ввод с клавиатуры. Несмотря на то что рассмотрение GUI выходит за рамки данной книги, все, что мы здесь обсуждаем, будет работать и в GUI-приложениях.
Читайте также
4.4. Ввод и вывод
4.4. Ввод и вывод Все операции Linux по вводу/выводу осуществляются посредством дескрипторов файлов. Данный раздел знакомит с дескрипторами файлов, описывает, как их получать и освобождать, и объясняет, как выполнять с их помощью
Ввод и вывод
Ввод и вывод Также мне кажется очень важным, чтобы мои результаты подпитывались соответствующим «вводом». Написание программного кода – творческая работа. Обычно мои творческие способности в наибольшей степени проявляются тогда, когда я сталкиваюсь с творческим
5.2. Ввод и вывод литер
5.2. Ввод и вывод литер Наименьшей единицей данных, которая может участвовать в операциях ввода-вывода, является литера. Мы уже знаем, что литеры интерпретируются как небольшие целые числа в соответствии с кодом ASCII. В Прологе имеется несколько встроенных предикатов для
Глава 12. Ввод—вывод
Глава 12. Ввод—вывод Почти в каждом приложении приходится читать или записывать файлы или выполнять другие операции ввода—вывода. Qt обеспечивает великолепную поддержку ввода—вывода при помощи QIODevice — мощной абстракции «устройств», способных читать и записывать
2.2.9. Перекрытый ввод-вывод
2.2.9. Перекрытый ввод-вывод Прежде чем переходить к рассмотрению перекрытого ввода-вывода, вспомним, какие модели ввода-вывода нам уже известны. Появление разных моделей связано с тем, что операции ввода-вывода не всегда могут быть выполнены немедленно.Самая простая
10.1.7. Простой ввод/вывод
10.1.7. Простой ввод/вывод Вы уже знакомы с некоторыми методами ввода/вывода из модуля Kernel; мы вызывали их без указания вызывающего объекта. К ним относятся функции gets и puts, а также print, printf и p (последний вызывает метод объекта inspect, чтобы распечатать его в понятном для нас
2.1.4. Стандартный ввод-вывод
2.1.4. Стандартный ввод-вывод В стандартной библиотеке языка С определены готовые потоки ввода и вывода (stdin и stdout соответственно). Они используются функциями scanf(), printf() и целым рядом других библиотечных функций. Согласно идеологии UNIX, стандартные потоки можно
Ввод и вывод
Ввод и вывод Функции ввода и вывода в стандартной библиотеке Си позволяют читать данные из файлов или получать их с устройств ввода (например, с клавиатуры) и записывать данные в файлы, или выводить их на различные устройства (например, на принтер).Функции ввода/вывода
Ввод/вывод
Ввод/вывод Как вы знаете, операторы > выполняют сдвиг числового значения влево и вправо на опеределенное число бит. В программах, приведенных в нашей книге, эти операторы также используются для ввода информации с клавиатуры и вывода на экран.Если с левой стороны
5.7. Файловый ввод–вывод
5.7. Файловый ввод–вывод При вызове команд можно указывать, откуда следует принимать входные данные и куда необходимо направлять выходные данные, а также сообщения об ошибках. По умолчанию, если не указано иное, подразумевается работа с терминалом: данные вводятся с
11.3. Устройства, для которых есть стандартные драйверы
11.3. Устройства, для которых есть стандартные драйверы Драйверы нужны для всех устройств. Но для некоторых устройств есть стандартные (в составе Windows) драйверы, в частности:мониторы — большинство мониторов нормально работает и без поставляемого драйвера (хотя практически