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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2012, 23:59   #1
Karmadon
Пользователь
 
Аватар для Karmadon
 
Регистрация: 28.02.2012
Сообщений: 46
Лампочка Чтение русских имен файлов

Есть вот такой код
Код:
StringCchCopy(szDir, MAX_PATH, (STRSAFE_LPWSTR)pWCBuffer);
StringCchCat(szDir, MAX_PATH, TEXT("\\*"));
   
hFind = FindFirstFile(szDir, &ffd);
........

wcstombs(buf, ffd.cFileName, sizeof(buf));
fputs (buf,fout);

........
но не видит русскоязычных имен файлов
Как обучить, может кто знает?
Спасибо
"THE ONLY WAY TO GET SMARTER IS BY PLAYING A SMARTER OPPONENT." -- Fundamentals of Chess 1883
Karmadon вне форума Ответить с цитированием
Старый 20.03.2012, 00:02   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

он все видит, это консоль не отображает русский.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.03.2012, 00:04   #3
Karmadon
Пользователь
 
Аватар для Karmadon
 
Регистрация: 28.02.2012
Сообщений: 46
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
он все видит, это консоль не отображает русский.
Я не вывожу, а сразу в файл пишу
это функция fputs режет?
"THE ONLY WAY TO GET SMARTER IS BY PLAYING A SMARTER OPPONENT." -- Fundamentals of Chess 1883
Karmadon вне форума Ответить с цитированием
Старый 20.03.2012, 00:31   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

это wcstombs не работает с русскими символами.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.03.2012, 01:01   #5
Karmadon
Пользователь
 
Аватар для Karmadon
 
Регистрация: 28.02.2012
Сообщений: 46
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
это wcstombs не работает с русскими символами.
Переписал без нее и с функцией fputws
эффект нулевой
"THE ONLY WAY TO GET SMARTER IS BY PLAYING A SMARTER OPPONENT." -- Fundamentals of Chess 1883
Karmadon вне форума Ответить с цитированием
Старый 21.03.2012, 02:36   #6
Karmadon
Пользователь
 
Аватар для Karmadon
 
Регистрация: 28.02.2012
Сообщений: 46
По умолчанию

что никто с русскими именами файлов не работал?
"THE ONLY WAY TO GET SMARTER IS BY PLAYING A SMARTER OPPONENT." -- Fundamentals of Chess 1883
Karmadon вне форума Ответить с цитированием
Старый 21.03.2012, 04:39   #7
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Сообщение от Karmadon Посмотреть сообщение
Переписал без нее и с функцией fputws
эффект нулевой
если заглянуть в нутро wcstombs, то видно, что при установках локали по дефолту она просто в цикле копирует младший байт из двубайтового символа. При этом если старший байт не ноль, что и бывает с русскими символами, то сразу идет выход из цикла и функция возвращает -1.
А если установлена локаль типа setlocale(LC_ALL,"RUS"), то идет вызов WideCharToMultiByte и все корректно.
EUGY вне форума Ответить с цитированием
Старый 21.03.2012, 04:51   #8
Karmadon
Пользователь
 
Аватар для Karmadon
 
Регистрация: 28.02.2012
Сообщений: 46
По умолчанию

На данный момент код примерно такой - но русских нет((
Код:
int _tmain(int argc,  wchar_t *argv[ ])
{
    if(argc < 2) return (-1);

TCHAR szPath[MAX_PATH];
TCHAR szDir[MAX_PATH];

SHGetFolderPath(NULL, CSIDL_DESKTOPDIRECTORY|CSIDL_FLAG_CREATE, NULL, 0, szPath);
PathAppend(szPath, TEXT("Filelist.txt"));

char buf[256];
wchar_t* tempbuff;
WIN32_FIND_DATA ffd;
HANDLE hFind = INVALID_HANDLE_VALUE;
DWORD dwError=0;
FILE *fout;
vector<wchar_t*> names;

fout = _wfopen(szPath,L"wt+,ccs=UNICODE");

for (int i=1; i<argc; i++)
    {
    tempbuff = argv[i];

    StringCchCopy(szDir, MAX_PATH, (STRSAFE_LPWSTR)tempbuff);
    StringCchCat(szDir, MAX_PATH, TEXT("\\*"));
   
    hFind = FindFirstFile(szDir, &ffd);
		
	fputws (tempbuff,fout);
    
	fputws (L"\n-- Папки --\n",fout);

    do
        {

        if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {
            wcstombs(buf, ffd.cFileName, sizeof(buf));
            if (buf[0] != '.')
                {
					fputws (L"Папка - ",fout);
					fputws (ffd.cFileName,fout);
					fputws (L"\n",fout);
                }
            }
"THE ONLY WAY TO GET SMARTER IS BY PLAYING A SMARTER OPPONENT." -- Fundamentals of Chess 1883
Karmadon вне форума Ответить с цитированием
Старый 21.03.2012, 05:24   #9
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Сообщение от Karmadon Посмотреть сообщение
На данный момент код примерно такой - но русских нет((
Код:
.........
wcstombs(buf, ffd.cFileName, sizeof(buf));
if (buf[0] != '.')
{
	fputws (L"Папка - ",fout);
	fputws (ffd.cFileName,fout);
	fputws (L"\n",fout);
}
Так накой Вам тогда wcstombs? Точку проверить?
if (ffd.cFileName[0] != '.')

Код:
setlocale(LC_ALL,"RUS");
//....

wcstombs(buf, ffd.cFileName, sizeof(buf));
if (ffd.cFileName[0] != '.') 
{
    fputws (L"Папка - ",fout);
    //fputws (ffd.cFileName,fout);
    fputs(buf,fout);
    fputws (L"\n",fout);
}

Последний раз редактировалось EUGY; 21.03.2012 в 05:28.
EUGY вне форума Ответить с цитированием
Старый 21.03.2012, 05:31   #10
Karmadon
Пользователь
 
Аватар для Karmadon
 
Регистрация: 28.02.2012
Сообщений: 46
Восклицание

Цитата:
Сообщение от EUGY Посмотреть сообщение
Так накой Вам тогда wcstombs? Точку проверить?
if (ffd.cFileName[0] != '.')

Код:
setlocale(LC_ALL,"RUS");
//....

wcstombs(buf, ffd.cFileName, sizeof(buf));
if (ffd.cFileName[0] != '.') 
{
    fputws (L"Папка - ",fout);
    //fputws (ffd.cFileName,fout);
    fputs(buf,fout);
    fputws (L"\n",fout);
}
Огромное спасибо!!!!
Оказывается нехватало только setlocale(LC_ALL,"RUS");
wcstombs там случайно затесался))
Очень помогли
"THE ONLY WAY TO GET SMARTER IS BY PLAYING A SMARTER OPPONENT." -- Fundamentals of Chess 1883
Karmadon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление имен файлов в ListBox и их открытие P@radise Общие вопросы Delphi 18 07.06.2011 15:12
количество имен открытых файлов Пользователь1 Microsoft Office Excel 1 24.04.2011 08:53
Использование русских имен столбцов в FireBird Lokos БД в Delphi 29 27.04.2010 03:30
Получить список имен файлов на сайте syserg Работа с сетью в Delphi 8 28.03.2010 14:01
IdFTP and CharSet (кодировка имен файлов) X11 Работа с сетью в Delphi 2 26.01.2010 12:21