Я хочу прочитать содержимое формата _O_U16TEXT из stdin. Но fgetwc и fgetws, похоже, плохо работают с этим режимом. fgetws Вернуть строку с {\n. Однако это не потребляет, что \n. В результате я позвонил fgetws, он просто вернет \ \ n '. Это также происходит с fgetwc. Я хочу знать, почему fgetws не употребляет {{x10}}, но возвращает строку с {{x11}} и как читать {{x12}} правильно?

#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <string.h>
#include <io.h>
#include <fcntl.h>

int main()
{   
    _setmode(_fileno(stdin), _O_U16TEXT);
    _setmode(_fileno(stdout), _O_U16TEXT);
    wchar_t ws[100];
    fgetws(ws, 100, stdin);
    wprintf(L"read: %s\n", ws);
    wchar_t r[100];
    fgetws(r, 100, stdin);
    wprintf(L"read: %s\n", r);
    return 0;
}

Я ожидаю, что я вводят две строки и сохраняете их в ws и r. Но после ввода одной строки программа остановлена, а r \n.

Моя ОС - Win10, компилятор GCC 8.1.0.

c
1
luoheng 30 Сен 2019 в 09:48

1 ответ

Лучший ответ

Это ошибка в компиляторе Mingw. В режиме _O_U16TEXT его функция fgetws считывает символ Newline дважды, даже если вы вводите его один раз. Вы можете пропустить каждую другую строку (убедитесь, что линия, которую вы пропускаете, пуста, на всякий случай).

0
n. 'pronouns' m. 30 Сен 2019 в 11:19