Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Открытие файлов в С++, с русским именем.

37K
06 апреля 2009 года
Semich
18 / / 02.12.2008
Добрый день. У меня возник вопрос. Как создать или открыть, в консольном приложении, в С++ файл, путь к которому или имя которого задается русскими буквами. Например, следующий код работает правильно:

Код:
#include<iostream>
#include<string>
#include<windows.h>
#include<fstream>
using namespace std;

void main()
{
    ofstream Out(L"Миша");
    Out.close();
}


В результате выполнения программы будет создан файл с именем "Миша".
Как нужно изменить код программы, если имя или путь к файлу хранятся в переменной. Пытался так, не получилось:

Код:
#include<iostream>
#include<string>
#include<windows.h>
#include<fstream>
using namespace std;

void main()
{
    char c1[50]="Михаил.txt",c2[50];
    CharToOemA(c1,c2);
    ofstream Out(c2);      //создается файл &#140;&#168;&#229; &#168;«.txt
    Out.close();
}

При выводе русских символов на экран функция CharToOemA помогает.
Подскажите решение этой задачи.
590
06 апреля 2009 года
Gigahard
223 / / 03.04.2006
У консоли и у оболочки винды разные кодировки.

У консоли кодировка cp866, у графической оболочки винды - cp1251 или Unicode.

Функкия CharToOemA переводит строку к консольную кодировку. По этому под виндой имя файла в кракозябрах, а под консолью нормальными русскими буквами.

Самый простой выход - не применять для создания файла функцию CharToOemA, а сразу писать
Код:
#include<iostream>
#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();
}
1
06 апреля 2009 года
kot_
7.3K / / 20.01.2000
Цитата: Semich
При выводе русских символов на экран функция CharToOemA помогает.


Когдато был такой фильм - "Самые быстрые люди в мире" - по мотивам грузинских анекдотов. Мужик на дерево залез, а слезть не может. Тут подбегает односельчанин - бросает ему веревку. Мужик радостно хватается за нее, и односельчане дергают его со всей дури. Мужик естественно сторчма с дерева летит и убивается. Все собрались в круг, репу почесали - "Странно, вчера дедушку из колодца так вытягивали, и ничего, живой..."
Это к тому что не вовсех случаях функции одинаково полезны.

37K
06 апреля 2009 года
Semich
18 / / 02.12.2008
Не помогло:

Код:
#include<iostream>
#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);//создался файл &#204;&#232;&#245;&#224;&#232;&#235;.txt
    Out.close();
}
37K
06 апреля 2009 года
Semich
18 / / 02.12.2008
Вот так работает:

Код:
#include<iostream>
#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 можно конвертировать?
1
06 апреля 2009 года
kot_
7.3K / / 20.01.2000
Цитата: Gigahard


Самый простой выход - не применять для создания файла функцию CharToOemA, а сразу писать


Далеко не факт. Зависит от настроек проекта.
Используйте TCHAR, LPWSTR.

255
07 апреля 2009 года
Dart Bobr
1.4K / / 09.04.2004
Цитата: Semich

Подскажите как char в wchar_t можно конвертировать?


Покурить мсдн.. Там много чего полезного есть.
Например, MultiByteToWideChar - замечательнейшая функция..

37K
07 апреля 2009 года
Semich
18 / / 02.12.2008
С помощью этого кода мы из char в "любой другой" конвертируем:

 
Код:
// исходная строка
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 мне известны.
255
07 апреля 2009 года
Dart Bobr
1.4K / / 09.04.2004
Цитата: Semich

Подскажите как делать обратное преобразование, с помощью CharToOem?
Смотрел мсдн, но не нашел функций для работы с TCHAR и LPWSTR. Функции для работы c char и wchar_t мне известны.


Не понял проблемы. В мсдн описаны ф-ии char->unicode и unicode->char. В чём проблема с TCHAR и LPWSTR? TCHAR - это char или unicode-символ в зависимости от настроек проекта. LPWSTR - указатель на юникод строку.

37K
08 апреля 2009 года
Semich
18 / / 02.12.2008
В зависимости от того, что представляет собой в данный момент TCHAR: char или unicode. Мы пользуемся функциями например: strcpy и wcscpy соответственно?
14
09 апреля 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: Semich
В зависимости от того, что представляет собой в данный момент TCHAR: char или unicode. Мы пользуемся функциями например: strcpy и wcscpy соответственно?


Используйте функции с префиксом t. Они как раз для TCHAR и преобразуются в strcpy и wcscpy в зависимости от наличия дефайна _UNICODE. tcscpy (если не ошибаюсь в написании) - одна из них.

37K
09 апреля 2009 года
Semich
18 / / 02.12.2008
Как я понимаю в переменной типа TCHAR могут храниться как и ANSI так и Unicode символы, в зависимости от того определен ли при компиляции дефайн _UNICODE. По этому поводу у меня возникло несколько вопросов:

0.

1.
Код:
#include<iostream>
#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<iostream>
#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<iostream>
#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, не только консольный вывод а также консольный ввод и файловый ввод-вывод.
37K
09 апреля 2009 года
Semich
18 / / 02.12.2008
Пожалуй для решения этих вопросов создам новую тему.
1.6K
09 апреля 2009 года
Vov4ick
476 / / 01.02.2007
Есть функции специально для этого SetFileApisToANSI и SetFileApisToOEM. Ну и мсдн около этих функций. Ибо юникод - это конечно неплохо, но далеко не всегда.
240
10 апреля 2009 года
aks
2.5K / / 14.07.2006
Цитата: Semich

Подскажите как char в wchar_t можно конвертировать?


Цитата: Dart Bobr
Покурить мсдн.. Там много чего полезного есть.
Например, MultiByteToWideChar - замечательнейшая функция..



MultiByteToWideChar и MultiByteToWideChar - хорошие API, но она всеже внешняя к языку как и iconv и для конвертации из wchar куда угодно и обратно. Лишь бы кодовая страница была. Что несколько больше чем требуется здесь.
Если нужно сконвертить средствами языка - тогда стандартные функции: wcstomb и mbtowcs. Конвертирует wchar_t строку в char строку в соотвествии с текущей локалью и обратно. Потому как в винде то еще все просто там кодировок немного. А вот за пределами винды локаль какой угодно может быть, хоть utf-8 (с переменным числом char-ов на один символ). И в функции открытия файла надо именно строку в utf-8 передовать.
Локаль выставляется с помощью стандартной же функции setlocale.
При пустом имени локали - подгрузит текущую системную из окружения.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог