Расскажите о данном способе вывода в консоль
Столкнулся вот с таким способом вывода в консоль (его использовали вместо обычного cout<<, аргументируя это тем, что он быстрее):
wchar_t *screen = new wchar_t[nScreenWidth*nScreenHeight + 1]; // Массив для записи в буфер
HANDLE hConsole = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL); // Буфер экрана
SetConsoleActiveScreenBuffer(hConsole); // Настройка консоли
DWORD dwBytesWritten = 0; // Для дебага
screen[nScreenWidth * nScreenHeight] = '\0'; // Последний символ - окончание строки
WriteConsoleOutputCharacter(hConsole, screen, nScreenWidth * nScreenHeight, { 0, 0 }, &dwBytesWritten); // Запись в буфер
Я с ним не знаком и хотелось бы увидеть подробный разбор, буду очень благодарен :) Пытался погуглить, вышло не очень.
Если что, код вот из этой статьи (для контекста): http://ilinblog.ru/article.php?id_article=49
Ответы (1 шт):
Рассказываю, (я вам в этой теме не до конца прошарен но отвечу) всё на самом деле довольно просто!
- 1 строка и вправду создаёт массив для записи в буфер, но отсюда вытекает вопрос
что за буфер?
Буфер экрана - это своего рода тоже массив (или точнее вектор зависящий от размеров окна). На 2 строке создаётся обращение к массиву буфера, то есть к тексту, что потом будет на экране! Это легко доказать просто выдели пустые места в консоли. На 3 строке через
SetConsoleActiveScreenBuffer
идёт разрешение на доступ к массиву (как-то так, но это не точно. НО без этого работать не будет) Дебаг на 4 строке есть дебаг тут всё понятно!
screen[nScreenWidth * nScreenHeight] = '\0';
здесь мы указываем последний символ для того чтоб был перенос символов и текст не улетал за экран! А последняя это запись в наш массив буфера и автоматическое обновление! => Мы имеем мгновенное изменение элементов текста в консоли и запись из 1 массива с информацией в другой буферный с авто обновлением! (это не 100% инфа это только как я сам понял этот код)