Это классика жанра, работа с консолью все с этого начинали, ну а кто-то начнет. В продолжая темы той же классики, работали с консолью это делалось с помощью стандартной ANSI библиотеки. Давайте посмотрим как это делается с помощью WinAPI. Не много общей информации, в Win есть несколько стандартных потоков а именно 3:
- Поток вывода (STD_OUTPUT_HANDLE)
- Поток ввода (STD_INPUT_HANDLE)
- Поток вывода сообщений об ошибках (STD_ERROR_HANDLE)
В качестве стандартных потоков назначается консоль. Стандартные потоки могу быть перенаправлены на другие устройства. Для примера мы можем перенаправить стандартный поток в файл, для этого нам нужно последовательно вызвать функции SetStdHandle и GetStdHandle. для чтения или записи используются две функции ReadConsole и WriteConsole. Любому процессу может быть назначена только одна консоль. Пример всегда лучше сухого описания, давайте сделаем простой пример того как можно вывести данные на консоль и считать их средствами WinAPI.
HANDLE hOutConsole,hInConsole; char msg[]="Our msg to write!!! \n"; char buffer[128]; DWORD nIn,nOut; hOutConsole = GetStdHandle (STD_OUTPUT_HANDLE); hInConsole = GetStdHandle(STD_INPUT_HANDLE); WriteConsole(hOutConsole,msg,strlen(msg),&nOut,NULL); ReadConsole(hInConsole,buffer,sizeof(buffer),&nIn,NULL); buffer[nIn]='\0'; WriteConsole(hOutConsole,buffer,strlen(buffer),&nOut,NULL); Sleep(1000);
Здесь все просто, выводим заранее сформированною строку, считываем введенную и выводим её опять же на экран. Один момент если введенная строка будет больше нашего буфера то функция считает только те символы что вмещаются в него имейте это ввиду, плюс конечно в том что не нужно следить за переполнением буфера, хотя если ты параноик, то тебе никто не запрещает. Пару интересных заметок о консоли.
Была необходимость вывести в консоли русские символы, вот пару стандартных рецептом. Использовать функцию OemToChar, либо изменить коидровку в консоли SetConsoleCP(1251), либо тот метод который помог мне использовать функцию MultiByteToWideChar. Ниже приведу пример с её использованием.
while(ReadFile(hFile,buffer,255,&nIn,NULL) && nIn >0) { buffer [nIn] = '\0'; res_len = MultiByteToWideChar(CP_UTF8, 0, buffer, -1, 0, 0); pRes = new wchar_t[res_len]; MultiByteToWideChar(CP_UTF8, 0, buffer, -1, pRes, res_len); DWORD dw = GetLastError (); WriteConsole (hConsole, pRes + 1, res_len - 1, &written, NULL); delete [] pRes; }
Оставить комментарий