Открытие файлов в С++, с русским именем.
#include<string>
#include<windows.h>
#include<fstream>
using namespace std;
void main()
{
ofstream Out(L"Миша");
Out.close();
}
В результате выполнения программы будет создан файл с именем "Миша".
Как нужно изменить код программы, если имя или путь к файлу хранятся в переменной. Пытался так, не получилось:
#include<string>
#include<windows.h>
#include<fstream>
using namespace std;
void main()
{
char c1[50]="Михаил.txt",c2[50];
CharToOemA(c1,c2);
ofstream Out(c2); //создается файл Œ¨å ¨«.txt
Out.close();
}
При выводе русских символов на экран функция CharToOemA помогает.
Подскажите решение этой задачи.
У консоли кодировка cp866, у графической оболочки винды - cp1251 или Unicode.
Функкия CharToOemA переводит строку к консольную кодировку. По этому под виндой имя файла в кракозябрах, а под консолью нормальными русскими буквами.
Самый простой выход - не применять для создания файла функцию CharToOemA, а сразу писать
#include<string>
#include<windows.h>
#include<fstream>
using namespace std;
void main()
{
char c1[50]="Михаил.txt",c2[50];
//CharToOemA(c1,c2);
ofstream Out(c1); //создается файл Михаил.txt
Out.close();
}
Когдато был такой фильм - "Самые быстрые люди в мире" - по мотивам грузинских анекдотов. Мужик на дерево залез, а слезть не может. Тут подбегает односельчанин - бросает ему веревку. Мужик радостно хватается за нее, и односельчане дергают его со всей дури. Мужик естественно сторчма с дерева летит и убивается. Все собрались в круг, репу почесали - "Странно, вчера дедушку из колодца так вытягивали, и ничего, живой..."
Это к тому что не вовсех случаях функции одинаково полезны.
#include<string>
#include<windows.h>
#include<fstream>
using namespace std;
void main()
{
char c1[50]="Михаил.txt",c2[50],c3[50];
//CharToOemA(c1,c2);
ofstream Out(c1);//создался файл Ìèõàèë.txt
Out.close();
}
#include<string>
#include<windows.h>
#include<fstream>
using namespace std;
void main()
{
wchar_t c[50]=L"Михаил.txt";
ofstream Out(c);
Out.close();
}
Подскажите как char в wchar_t можно конвертировать?
Самый простой выход - не применять для создания файла функцию CharToOemA, а сразу писать
Далеко не факт. Зависит от настроек проекта.
Используйте TCHAR, LPWSTR.
Подскажите как char в wchar_t можно конвертировать?
Покурить мсдн.. Там много чего полезного есть.
Например, MultiByteToWideChar - замечательнейшая функция..
char text[] = "Hello, World!";
// буфер для получения результата
WCHAR buffer[256];
// преобразование строки в Unicode
MultiByteToWideChar(CP_ACP, 0, text, strlen(text) + 1,
buffer, sizeof(buffer)/sizeof(WCHAR));
Подскажите как делать обратное преобразование, с помощью CharToOem?
Смотрел мсдн, но не нашел функций для работы с TCHAR и LPWSTR. Функции для работы c char и wchar_t мне известны.
Подскажите как делать обратное преобразование, с помощью CharToOem?
Смотрел мсдн, но не нашел функций для работы с TCHAR и LPWSTR. Функции для работы c char и wchar_t мне известны.
Не понял проблемы. В мсдн описаны ф-ии char->unicode и unicode->char. В чём проблема с TCHAR и LPWSTR? TCHAR - это char или unicode-символ в зависимости от настроек проекта. LPWSTR - указатель на юникод строку.
Используйте функции с префиксом t. Они как раз для TCHAR и преобразуются в strcpy и wcscpy в зависимости от наличия дефайна _UNICODE. tcscpy (если не ошибаюсь в написании) - одна из них.
0.
1.
#include<string>
#include<windows.h>
#include<TChar.h>
#define _UNICODE [COLOR="SeaGreen"]//что меняется если убрать эту строку(на первый взгляд программа работает одинаково)?[/COLOR]
using namespace std;
void main()
{
TCHAR s1[50],s2[50]=_T("Михаил");
_tcscpy(s1,s2);
}
2. В зависимости от наличия _UNICODE, char и TCHAR становятся эквивалентыми?
#include<string>
#include<windows.h>
#include<fstream>
#include<TChar.h>
#define _UNICODE [COLOR="SeaGreen"]//?[/COLOR]
using namespace std;
void main()
{
char s[50]="Михаил";
TCHAR s1[50],s2[50]=_T("Михаил");
_tcscpy(s1,s);[COLOR="SeaGreen"]//эта строка будет работать если TCHAR это ANSI[/COLOR]
}
3. Если TCHAR может быть ANSI строкой обязательно нужно использовать макрос _T?
4. Вывод на консоль типа TCHAR.
#include<string>
#include<windows.h>
#include<fstream>
#include<TChar.h>
#define _UNICODE//?
using namespace std;
void main()
{
TCHAR s1[50],s2[50]=_T("Михаил");
_tcscpy(s1,s2);
cout << s1 << endl; [COLOR="SeaGreen"]//выводит 0012FEFC[/COLOR]
cout << s2 << endl; [COLOR="SeaGreen"]//выводит 0012FE90[/COLOR]
}
Почему выводит разные значения, это адреса? Как с помощью потоков работать с TCHAR, не только консольный вывод а также консольный ввод и файловый ввод-вывод.
Подскажите как char в wchar_t можно конвертировать?
Например, MultiByteToWideChar - замечательнейшая функция..
MultiByteToWideChar и MultiByteToWideChar - хорошие API, но она всеже внешняя к языку как и iconv и для конвертации из wchar куда угодно и обратно. Лишь бы кодовая страница была. Что несколько больше чем требуется здесь.
Если нужно сконвертить средствами языка - тогда стандартные функции: wcstomb и mbtowcs. Конвертирует wchar_t строку в char строку в соотвествии с текущей локалью и обратно. Потому как в винде то еще все просто там кодировок немного. А вот за пределами винды локаль какой угодно может быть, хоть utf-8 (с переменным числом char-ов на один символ). И в функции открытия файла надо именно строку в utf-8 передовать.
Локаль выставляется с помощью стандартной же функции setlocale.
При пустом имени локали - подгрузит текущую системную из окружения.