По работаем с консолью

Апрель 5th, 2011 § 0 comments

Это классика жанра, работа с консолью все с этого начинали, ну а кто-то начнет. В продолжая темы той же классики, работали с консолью это делалось с помощью стандартной 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;

}

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Смотреть фильмы онлайн