Консультация № 198658
20.05.2020, 18:32
0.00 руб.
0 2 0
Здравствуйте! У меня возникли сложности с таким вопросом:
Операционная система windows x86 7
компилятор g++ (i686-win32-dwarf-rev0, Built by MinGW-W64 project) 8.1.0
набираю g++ main.cpp -std=c++17

идея такая некий код читает из файла строку (файл в кодировке utf-8 без дом), далее читает один символ и передает на проверку на определенные символы в функцию(isCharacterAndNumber), она в свою очередь после проверки возращает булевское значение

Код:
wifstream ifile("file.txt", wios::in);
if(ifile.is_open()){
wstring w_str;
while(!ifile.eof()){
getline(ifile, w_str);
for(const wchar_t &ch : w_str)
cout << ((isCharacterAndNumber(ch))? "true\n" : "false\n");

и функция проверки символа в диапазоне А-Я,а-я,0-9 и _
Код:
bool isCharacterAndNumber(const wchar_t &ch){
const wchar_t *arr_ch{L"абвгдеёжзийклмнопрстуфхцчшщъьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЭЮЯ0123456789_"};
bool result = false;
for(int i = 0, n = wcslen(arr_ch); i < n; i++){
if(arr_ch[i] == ch){
result = true;
break;
}
}
return result;
};

но ничего не получается, что не так?

Обсуждение

давно
Посетитель
401281
56
20.05.2020, 18:36
общий
Адресаты:
ничего не получается, в смысле всегда возвращает false кроме когда в файле есть цифры
давно
Академик
20764
1861
21.05.2020, 14:41
общий
Проблема в том, что wchar — это вовсе не UTF в любой его инкарнации. Вводимый текст надо декодировать вручную.
К сожалению, у меня не Windows, и на моём Linux getline на русских буквах или BOM вообще выставляет fail(), так что ничего более конкретного сказать не могу.
От wiostream толку вообще не слишком много :(
Форма ответа