0

Продолжение вопроса Ошибка при компиляции - error_code (boost::filesystem::directory_iterator), но пробую решить по другому.

Посоветовали всё перевести в wstring.

Изменено 2:

Изменил точку входа, ошибка пропала.

Пробую решить методом: Русский язык в консоли

#include <iostream>
#include <string>
#include <string.h>
#include <windows.h>
#include <filesystem>
#include <io.h>
#include <fcntl.h>

using namespace std;

class Find {

private:

wstring null = L"?";

wstring findFile_ (wstring name, wstring path) { wcout << name << " " << path << endl;

wstring temp;
error_code ec;

wcout << "1" << endl; for (auto& file : filesystem::directory_iterator(name, ec)) { wcout << "2" << endl; temp = file.path().wstring(); wcout << temp << endl; if (filesystem::is_directory(file)) { wstring find = findFile_(name, temp); if (find != null) return find; } if (name == temp.substr(temp.find_last_of(L"\") + 1, wstring::npos)) return file.path().wstring(); } wcout << "3" << endl; return null; }

public: wstring findFile (wstring name) { DWORD drives = GetLogicalDrives(); char diskName; wstring disk; wstring ret; for (unsigned char i = 0; i < 32; i++) {

    if (drives &amp; (1 &lt;&lt; i)) {
        diskName = 'A' + i;
        disk.clear();
        disk.push_back(diskName);
        disk += L&quot;:\\&quot;;
        ret = findFile_(name, disk);
        if (ret != null) return ret;   
    }
}
return null;

}

};

int main () {

_setmode(_fileno(stdout), _O_U16TEXT);
_setmode(_fileno(stdin),  _O_U16TEXT);
_setmode(_fileno(stderr), _O_U16TEXT);

wcout &lt;&lt; L&quot;Unicode -- English -- Русский -- Ελληνικά -- Español -- Українська.&quot; &lt;&lt; endl;


Find f;
wcout &lt;&lt; f.findFile(L&quot;Aboba.txt&quot;) &lt;&lt; endl;
system(&quot;pause&quot;);
return 0;

}

Теперь другая проблема:

Не срабатывает цикл

for (auto& file : filesystem::directory_iterator(name, ec)) {
wcout << "2" << endl;
        temp = file.path().wstring();
        wcout << temp << endl;
        if (filesystem::is_directory(file)) {
            wstring find = findFile_(name, temp);
            if (find != null) return find;
        } 
        if (name == temp.substr(temp.find_last_of(L"\\") + 1, wstring::npos)) return file.path().wstring();
    }

Выводит в консоль:

Unicode -- English -- Русский -- Ελληνικά -- Español -- Українська.
Aboba.txt  C:\
1
3
Aboba.txt  F:\
1
3
?
Для продолжения нажмите любую клавишу . . .

Думаю, причина в name, но не знаю, как можно это проверить и исправить

Niobium
  • 31
  • что вообще в коде не так - зачем-то устанавливается code page 65001 (UTF-8), а вывод идет через wcout (UCS-2). – user7860670 Feb 22 '23 at 07:38
  • зачем-то устанавливается code page 65001 (UTF-8)

    Убрал. Теперь пишет кракозябры:

    1 1 1 ��� �த������� ������ ���� ������� . . .

    – Niobium Feb 22 '23 at 07:47
  • @user7860670 Я не против закрытия вопроса, как дубля — но не как дубля для "русского в консоли", а "Ссылка на неразрешенный внешний символ", потому что ТС задал именно этот вопрос! – Harry Feb 22 '23 at 10:04
  • @Harry А ОП поменял вопрос на совсем другой. Причем он зачем-то поменял в своем коде точку входа, отсюда и проблема вылезла. – user7860670 Feb 22 '23 at 11:06
  • Основная проблема - код не умеет работать с кириллицей. Пытаюсь её решить, но появляются новые проблемы. Не создавать же под каждую проблему (которую, возможно, смогу сам решить) новую тему, ведь суть одна - код не работает с кириллицей. – Niobium Feb 22 '23 at 11:48
  • Нет, для каждой новой проблемы следует создавать новую тему и заново составить [mcve]. Тут не бюро по отладке чужого кода. А прежде, чем бездумно копипастить код из того ответа, вам стоило прочитать его целиком (а заодно и документацию ко всем использованным там функциям) и разобраться, что у вас было не так. – user7860670 Feb 22 '23 at 11:55
  • @user7860670 Все, вопрос снят (и его, и мой :)) — не обратил внимания, что он правлен. Приношу извинения. – Harry Feb 22 '23 at 12:07

0 Answers0