|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Using the High-Level Input and Output Functions
The following example uses the high-level console I/O functions for console I/O. For more information about the high-level console I/O functions, see High-Level Console I/O.
The example assumes that the default I/O modes are in effect initially for the first calls to the ReadFile and WriteFile functions. Then the input mode is changed to turn off line input mode and echo input mode for the second calls to ReadFile and WriteFile. The SetConsoleTextAttribute function is used to set the colors in which subsequently written text will be displayed. Before exiting, the program restores the original console input mode and color attributes.
The example's NewLine function is used when line input mode is disabled. It handles carriage returns by moving the cursor position to the first cell of the next row. If the cursor is already in the last row of the screen buffer, the contents of the screen buffer are scrolled up one line. For an example that illustrates the use of the ScrollConsoleScreenBuffer function to scroll a screen buffer, see Scrolling a Screen Buffer's Contents.
#include VOID NewLine(VOID); VOID ScrollScreenBuffer(HANDLE, INT); HANDLE hStdout, hStdin; CONSOLE_SCREEN_BUFFER_INFO csbiInfo; VOID main(void) { LPSTR lpszPrompt1 = "Type something and press Enter:\n"; LPSTR lpszPrompt2 = "Type any key: "; CHAR chBuffer[256]; DWORD cRead, cWritten, fdwMode, fdwOldMode; WORD wOldColorAttrs; /* Get handles to STDIN and STDOUT. */ hStdin = GetStdHandle(STD_INPUT_HANDLE); hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if (hStdin == INVALID_HANDLE_VALUE || hStdout == INVALID_HANDLE_VALUE) MyErrorExit("GetStdHandle"); /* Save the current text colors. */ if (! GetConsoleScreenBufferInfo(hStdout, &csbiInfo)) MyErrorExit("GetConsoleScreenBufferInfo"); wOldColorAttrs = csbiInfo.wAttributes; /* Set the text attr. to draw red text on black background. */ if (! SetConsoleTextAttribute(hStdout, FOREGROUND_RED)) MyErrorExit("SetConsoleTextAttribute");
/* * Write to STDOUT and read from STDIN by using the default * modes. Input is echoed automatically, and ReadFile * does not return until a carriage return is typed. * * The default input modes are line, processed, and echo. * The default output modes are processed and wrap at EOL. */ while (1) { if (! WriteFile( hStdout, /* output handle */ lpszPrompt1, /* prompt string */ lstrlen(lpszPrompt1), /* string length */
&cWritten, /* bytes written */ NULL) ) /* not overlapped */ break; if (! ReadFile( hStdin, /* input handle */ chBuffer, /* buffer to read into */ 255, /* size of buffer */ &cRead, /* actual bytes read */ NULL) ) /* not overlapped */ break; if (chBuffer[0] == 'q') break; } /* Turn off the line input mode, and echo the input mode. */
if (! GetConsoleMode(hStdin, &fdwOldMode)) MyErrorExit("GetConsoleMode"); fdwMode = fdwOldMode & ~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT); if (! SetConsoleMode(hStdin, fdwMode)) MyErrorExit("SetConsoleMode"); /* Prompt for input. */ if (! WriteFile( hStdout, /* output handle */ lpszPrompt2, /* prompt string */ lstrlen(lpszPrompt2), /* string length */ &cWritten, /* bytes written */
NULL) ) /* not overlapped */ MyErrorExit("WriteFile"); /* * Without line and echo input modes, ReadFile returns * when any input is available. Carriage returns must * be handled, and WriteFile is used to echo input. */ while (1) { if (! ReadFile(hStdin, chBuffer, 1, &cRead, NULL)) break; if (chBuffer[0] == '\r') NewLine(); else if (! WriteFile(hStdout, chBuffer, cRead, &cWritten, NULL))
break; if (chBuffer[0] == 'q') break; } /* Restore the original console mode. */ if (! SetConsoleMode(hStdin, fdwOldMode)) MyErrorExit("SetConsoleMode"); /* Restore the original text colors. */ if (! SetConsoleTextAttribute(hStdout, wOldColorAttrs)) MyErrorExit("SetConsoleTextAttribute"); } /* * The NewLine function handles carriage returns when the processed * input mode is disabled. It gets the current cursor position
* and resets it to the first cell of the next row. */ VOID NewLine(VOID) { if (! GetConsoleScreenBufferInfo(hStdout, &csbiInfo)) MyErrorExit("GetConsoleScreenBufferInfo"); csbiInfo.dwCursorPosition.X = 0; /* * If it is the last line in the screen buffer, scroll * the buffer up. */ if ((csbiInfo.dwSize.Y-1) == csbiInfo.dwCursorPosition.Y) { ScrollScreenBuffer(hStdout, 1); } /* Otherwise, advance the cursor to the next line. */
else csbiInfo.dwCursorPosition.Y += 1; if (! SetConsoleCursorPosition(hStdout, csbiInfo.dwCursorPosition)) MyErrorExit("SetConsoleCursorPosition"); }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Использование High-Level Входные и Выходные Функции
Следующий пример использует высокоуровневые консольные функции В/В для консоли В/В. Более подробно о высокоуровневых консольных функциях В/В, смотри Консоль High-Level В/В.
Пример допускает что встроенные способы В/В будут в силе первоначально для первых вызовов в ReadFile и функциях WriteFile. Затем входной способ измениться, чтобы выключать входной способ и эхо линии входного способа для вторых вызовов на ReadFile и WriteFile. Функция SetConsoleTextAttribute использована, чтобы устанавливать цвета в которых впоследствии написавшее текст будет отображен. Перед выходом, программа восстанавливает оригинальный консольный входной способ и цветные атрибуты.
Функция примера NewLine использована когда входной способ линии выведены из строя. Это оперирует переводы строки перемещая позицию курсора на первую ячейку следующей колонки. Если курсор - уже в последней колонке экранного буфера, содержание экранного буфера перемещено по одной строке. Для примера, который иллюстрирует использование функции ScrollConsoleScreenBuffer, чтобы перемещать экранный буфер, смотри Перемещая Экранное Буферное Содержание.
#include НЕДЕЙСТВИТЕЛЬНАЯ NewLine(ПУСТОТА); АННУЛИРУЙТЕ ScrollScreenBuffer(РУЧКА, INT); ПРООПЕРИРУЙТЕ hStdout, hStdin; CONSOLE_SCREEN_BUFFER_INFO csbiInfo; НЕДЕЙСТВИТЕЛЬНАЯ основа(пустота) { LPSTR lpszPrompt1 = "НАБИРАЕТ что-то и нажимает Ввод:\n"; LPSTR lpszPrompt2 = "НАБИРАЕТ любую клавишу: "; СИМВОЛ chBuffer[256]; DWORD cRead, cWritten, fdwMode, fdwOldMode; СЛОВО wOldColorAttrs; /* Получите ручки на STDIN и STDOUT. */ hStdin = GetStdHandle(STD_INPUT_HANDLE); hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
если (hStdin == INVALID_HANDLE_VALUE || hStdout == INVALID_HANDLE_VALUE) MyErrorExit("GetStdHandle"); /* Сохраните текущий текст colors. */ если (! GetConsoleScreenBufferInfo(hStdout, &csbiInfo)) MyErrorExit("GetConsoleScreenBufferInfo"); wOldColorAttrs = csbiInfo.wAttributes; /* Установите текст attr., чтобы делать красным текстом в черном background. */ если (! SetConsoleTextAttribute(hStdout, FOREGROUND_RED)) MyErrorExit("SetConsoleTextAttribute");
/* * Запись на STDOUT и прочитанная из STDIN используя по умолчанию * режимы. Ввод - echoed автоматически, и ReadFile * не возвращается пока перевод строки не будет набран. * * По умолчанию входные режимы являются строкой, обработанной, и эхо. * По умолчанию выходные режимы обработаны и завернуты в EOL. */ пока (1) { если (! WriteFile( hStdout, /* ВЫХОДНАЯ ручка */ lpszPrompt1, /* быстрая строка */ lstrlen(lpszPrompt1), /* длина строки */
&cWritten, /* Байты записаны */ НЕДЕЙСТВИТЕЛЬНЫЙ) ) /* не перекрытое */ прерывание; если (! ReadFile( hStdin, /* ВХОДНАЯ ручка */ chBuffer, /* буфер, чтобы читать в */ 255, /* размер буфера */ &cRead, /* фактические байты были прочитаны */ НЕДЕЙСТВИТЕЛЬНЫЙ) ) /* не перекрытое */ прерывание; если прерывание (chBuffer[0] == 'q'); } /* Выключите линию входного режима, и эхо ввод mode. */
если (! GetConsoleMode(hStdin, &fdwOldMode)) MyErrorExit("GetConsoleMode"); fdwMode = fdwOldMode & ~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT); если (! SetConsoleMode(hStdin, fdwMode)) MyErrorExit("SetConsoleMode"); /* Приглашение для input. */ если (! WriteFile( hStdout, /* ВЫХОДНАЯ ручка */ lpszPrompt2, /* быстрая строка */ lstrlen(lpszPrompt2), /* длина строки */ &cWritten, /* байты записаны */
НЕДЕЙСТВИТЕЛЬНЫЙ) ) /* не перекрытое */ MyErrorExit("WriteFile"); /* * Без строки и входные режимы эха, возврат ReadFile * когда любой ввод доступен. Переводы строки должны * прооперирован, и WriteFile использован на ввод эха. */ пока (1) { если (! ReadFile ПРЕРЫВАНИЯ(hStdin, chBuffer, 1, &cRead, НЕДЕЙСТВИТЕЛЬНОЕ)); если (chBuffer[0] == '\r') NewLine(); еще если (! WriteFile(hStdout, chBuffer, cRead, &cWritten, НЕДЕЙСТВИТЕЛЬНОЕ))
прерывание; если прерывание (chBuffer[0] == 'q'); } /* Восстановите оригинальную консоль mode. */ если (! SetConsoleMode(hStdin, fdwOldMode)) MyErrorExit("SetConsoleMode"); /* Восстановите оригинальный текст colors. */ если (! SetConsoleTextAttribute(hStdout, wOldColorAttrs)) MyErrorExit("SetConsoleTextAttribute"); } /* * Функция NewLine оперирует переводы строки когда обработанный * входной режим выведен из строя. Это получает текущую позицию курсора
* и сбрасывает это в первую ячейку следующей колонки. */ ПУСТОТА NewLine(ПУСТОТА) { если (! GetConsoleScreenBufferInfo(hStdout, &csbiInfo)) MyErrorExit("GetConsoleScreenBufferInfo"); csbiInfo.dwCursorPosition.X = 0; /* * Если это - последняя строка в экранном буфере, переместитесь * буфер по. */ если ((csbiInfo.dwSize.Y-1) == csbiInfo.dwCursorPosition.Y) { ScrollScreenBuffer(hStdout, 1); } /* В противном случае, предоставлять курсор в следующий line. */
еще csbiInfo.dwCursorPosition.Y += 1; если (! SetConsoleCursorPosition(hStdout, csbiInfo.dwCursorPosition)) MyErrorExit("SetConsoleCursorPosition"); }
|
|
|
|
| |