Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.09.2021, 11:16   #1
KoTTBarsik
Пользователь
 
Регистрация: 03.09.2021
Сообщений: 11
Восклицание Проблемы с _setmode

Доброго времени суток!

При написании программы(допустим выводит все файлы в каталоге в консоль) возникла проблема связанная с использованием юникода(если путь в ascii то норм, когда попадаетсмя юникод строка по типу "APEX休息,如何正确地关闭刀" поиск в директории прерывается), а именно utf-8 как единственный выход нашел такой способ:

_setmode(_fileno(stdout), _O_U8TEXT);

И вроде бы все хорошо, проверил на 7 компах, а вот на 8 он доходя до этой строки просто выходит из программы.

Самое интересное что даже GetLastError не проверить т.к. как я понял завершение происходит где то в глубинах _setmode и уже не возвращается из нее.

Как понять почему _setmode завершает программу?
KoTTBarsik вне форума Ответить с цитированием
Старый 04.09.2021, 09:07   #2
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 947
По умолчанию

KoTTBarsik, привет. Я так понял, это винда, WinAPI (почему это нигде не указано?)

Никакого кода также не приведено. Поэтому предлагаю:

попробуй использовать юникодные версии функций WinAPI (заканчиваются на "W"). И никаких _setmode не понадобится
Алексей1153 вне форума Ответить с цитированием
Старый 06.09.2021, 12:40   #3
KoTTBarsik
Пользователь
 
Регистрация: 03.09.2021
Сообщений: 11
По умолчанию

Алексей1153, да все верно это винда.

В программе все функции с постфиксом w
например: FindFirstFileW, lstrcmpW, wcout и подобные
массив объявлен как wchar_t LocalPath[MAX_PATH] = {L"c:\\*.*"};
Без _setmode программа увидев символы юникода прекращает поиск и завершается,
с _setmode же все отрабатывает нормально как и должно быть.

Я подозреваю что проблема возможно связана с setlocale.

Вот минимальный код:
Код:
using namespace std;

int main(){

    _wsetlocale(LC_ALL, L"");

    //SetConsoleOutputCP(65001);
	//SetConsoleCP(65001);
    //setlocale(LC_ALL, ".65001");

    WIN32_FIND_DATAW WFD = {0};
    wchar_t LocalPath[MAX_PATH] = {L"c:\\*.*"};
    HANDLE hFind = 0;

    hFind = FindFirstFileW(LocalPath, &WFD);

        if(WFD.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY){
            wcout << L"Папка: " << WFD.cFileName << endl;
        }
        wcout << L"Файл: " << WFD.cFileName << endl;

        do{
            if(WFD.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY){
                wcout << L"Папка: " << WFD.cFileName << endl;
            }
            wcout << L"Файл: " << WFD.cFileName << endl;
        } while(FindNextFileW(hFind, &WFD) != 0);

    FindClose(hFind);

    return 0;
}
Создайте папку с именем где присутствует юникод, и программа дойдя до нее завершится.
Даже GetLastError не поймать, т.к. выкидывает раньше.
KoTTBarsik вне форума Ответить с цитированием
Старый 08.09.2021, 09:14   #4
KoTTBarsik
Пользователь
 
Регистрация: 03.09.2021
Сообщений: 11
По умолчанию

bump
KoTTBarsik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с IE brownb Windows 3 01.06.2017 21:16
Проблемы с vba (проблемы создания макросов) Leojse Microsoft Office Excel 4 26.12.2013 20:09
C++. проблемы с gets() Skull_psyhothik Помощь студентам 1 03.10.2012 01:10
проблемы с Qt CodeNOT Qt и кроссплатформенное программирование С/С++ 3 27.03.2012 12:17
проблемы с IE xakzona Помощь студентам 1 16.12.2008 21:53