Курсор консоли Win32 API не перемещается после WriteConsole - PullRequest
0 голосов
/ 04 февраля 2020

Итак, когда я пытаюсь прочитать std :: wstring из консоли с этим кодом

std::wstring string;
wchar_t c;
DWORD u;
do {
    ReadConsole(GetStdHandle(STD_INPUT_HANDLE), &c, 1, &u, NULL);
} while (u && (c == L' ' || c == L'\n'));
do {
    string.append(1, c);
    ReadConsole(GetStdHandle(STD_INPUT_HANDLE), &c, 1, &u, NULL);
} while (u && c != L' ' && c != L'\n');

WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), string.data(), string.length(), &u, NULL);

После записи строки позиция курсора не перемещается, и поэтому, если я снова вызываю WriteConsole (), он будет писать выше только что написанной строки. Есть ли какое-то решение для этого?

1 Ответ

0 голосов
/ 05 февраля 2020

Когда ReadConsole читает stdin, он добавляет \r\n к строке. Вы исключили только \n в условии. "string\r" будет передано WriteConsole, а \r вернет курсор в начало строки. Попробуйте следующий код:

#include <windows.h>
#include <iostream>
#include <string>
int main(int argc, char** argv)
{
    std::wstring string;
    wchar_t c;
    DWORD u;
    do {
        ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE), &c, 1, &u, NULL);
    } while (u && (c == L' ' || c == L'\n'));
    do {
        string.append(1, c);
        ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE), &c, 1, &u, NULL);
    } while (u && c != L' ' && c != L'\n' && c != L'\r');

    WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), string.data(), string.length(), &u, NULL);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...