Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
Обитатель форума
201 / 184 / 54
Регистрация: 28.10.2012
Сообщений: 543
1

Непонятки с wchar_t

14.04.2013, 11:11. Показов 2774. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Прошу помощи: что-то не так с wchar_t. Не копирует имена файлов.

Содержание program_config.txt
Кликните здесь для просмотра всего текста

config.cfg
C:\\Projects\\abx.txt


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
static wchar_t* charToWChar(const char* text)
{
    size_t size = strlen(text);
    wchar_t* wa = new wchar_t[size+1];
    mbstowcs(wa,text,size);
    return wa;
}
 
int main()
{
    wchar_t const program_config[] = L"program_config.txt";
    wchar_t *filename;
    wchar_t *configfile;
 
    fstream conf(program_config);
 
    ostringstream ostr;
    if (conf.is_open())
    {
        string str;
        while (getline(conf, str))
        {
            if (str[0] == '#')
                continue;
            
            ostr << str << "\n";
        }
    }
    else
        Error("file \"%ls\" not open", program_config);
 
    int cnt = 0;
    char* pch = strtok(const_cast<char*>(ostr.str().c_str()), "\n");
    while (pch != NULL)
    {
        switch(cnt)
        {
            case 0:
                configfile = new wchar_t[strlen(pch)+1];
                wcscpy(configfile, charToWChar(pch));
                wcout << configfile << " "; // for debugging
                break;
            case 1:
                filename = new wchar_t[strlen(pch)+1];
                wcscpy(filename, charToWChar(pch));
                wcout << filename << " "; // for debugging
                break;
            default: break;
        }
 
        cnt++;
        pch = strtok(NULL, "\n");
    }
// ...
Но имена файлов выводит так:
Миниатюры
Непонятки с wchar_t  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.04.2013, 11:11
Ответы с готовыми решениями:

Почему const wchar_t* воспринимается как wchar_t* ?
Здравствуйте. Я написал вот так: const wchar_t* dir = directory.c_str(); StartModule(dir);...

Wchar_t и unsigned wchar_t в windows
Печально, но факт: wchar_t - 2 байта, unsigned wchar_t - 4 байта Вопрос1: используется...

Cannot convert from 'wchar_t' to 'const wchar_t *'
такой код, порылся в инете не помогло. ломать голову надоело может кто подскажет, буду благодарен....

Непонятки с wchar_t
#include &lt;iostream&gt; #include &lt;stdio.h&gt; using namespace std; } int main(){ int b...

10
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
14.04.2013, 11:33 2
Цитата Сообщение от Afflicted Посмотреть сообщение
fstream
->
C++
1
wfstream
Цитата Сообщение от Afflicted Посмотреть сообщение
ostringstream
->
C++
1
wostringstream
Цитата Сообщение от Afflicted Посмотреть сообщение
string
->
C++
1
wstring
1
Обитатель форума
201 / 184 / 54
Регистрация: 28.10.2012
Сообщений: 543
14.04.2013, 11:52  [ТС] 3
Теперь возникают какие-то проблемы с токенами.
В строке "wcout << ostr.str() << L"\n";" идет нормальный вывод содержимого.
А после разделения в строке "wcout << pch << L"\n";" ничего не выводится.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    int cnt = 0;
//  wcout << ostr.str() << L"\n"; // for debugging
    wchar_t* pch = wcstok(const_cast<wchar_t*>(ostr.str().c_str()), L"; ");
    while (pch != NULL)
    {
        wcout << pch << L"\n"; // for debugging
        switch(cnt)
        {
            case 0:
                configfile = new wchar_t[wcslen(pch)+1];
                wcscpy(configfile, pch);
                wcout << configfile << L" ";  // for debugging
                break;
            case 1:
                filename = new wchar_t[wcslen(pch)+1];
                wcscpy(filename, pch);
                wcout << filename << L" ";  // for debugging
                break;
            default: break;
        }
 
        cnt++;
        pch = wcstok(NULL, L"; ");
    }
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
14.04.2013, 12:04 4
Выложи код полностью.
0
Обитатель форума
201 / 184 / 54
Регистрация: 28.10.2012
Сообщений: 543
14.04.2013, 12:08  [ТС] 5
program_config.txt

Кликните здесь для просмотра всего текста

# it is the comment, it isn't read
config.cfg
# it is the comment, it isn't read
C:\\Projects\\abx.txt


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <Windows.h>
using namespace std;
 
int main()
{
    wchar_t const program_config[] = L"program_config.txt";
    wchar_t *filename;
    wchar_t *configfile;
 
    wfstream conf(program_config);
 
    wostringstream ostr;
    if (conf.is_open())
    {
        wstring str;
        while (getline(conf, str))
        {
            if (str[0] == '#')
                continue;
            
//          cout << str << "\n"; // for debugging
            ostr << str << L"; ";
        }
    }
    else
        Error("file \"%ls\" not open", program_config);
 
    int cnt = 0;
//  wcout << ostr.str() << L"\n"; // for debugging
 
    wchar_t* pch = wcstok(const_cast<wchar_t*>(ostr.str().c_str()), L"; ");
    while (pch != NULL)
    {
        wcout << pch << L"\n"; // for debugging
        switch(cnt)
        {
            case 0:
                configfile = new wchar_t[wcslen(pch)+1];
                wcscpy(configfile, pch);
                wcout << configfile << L" ";  // for debugging
                break;
            case 1:
                filename = new wchar_t[wcslen(pch)+1];
                wcscpy(filename, pch);
                wcout << filename << L" ";  // for debugging
                break;
            default: break;
        }
 
        cnt++;
        pch = wcstok(NULL, L"; ");
    }
 
/* for debugging
    fstream ifs(configfile, ios::in);
    ofstream ofs (filename);
 
    if (ifs.is_open())
    {
        if (ofs.is_open())
        {
            if (GetFileAttributes(filename) & FILE_ATTRIBUTE_READONLY)
                SetFileAttributes(filename, FILE_ATTRIBUTE_NORMAL);
 
            string str;
            while (getline(ifs, str))
                ofs << str << '\n';
 
            SetFileAttributes(filename, FILE_ATTRIBUTE_READONLY);
        }
        else    Error("file \"%ls\" not open", filename);
    }
    else    Error("file \"%ls\" not open", configfile);
*/
    system("pause >> NULL");
}

До разделения по токенам все печатается на экран нормально. После - не печатается вовсе: никаких символов.
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
14.04.2013, 12:22 6
Консоль Windows не умеет нормально выводить ни UTF-8, ни UTF-16. После первого вывода поток "ломается" и символы более не выводятся.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
14.04.2013, 12:29 7
Цитата Сообщение от Afflicted Посмотреть сообщение
const_cast<wchar_t*>(ostr.str().c_str())
Так делать нельзя.
0
Обитатель форума
201 / 184 / 54
Регистрация: 28.10.2012
Сообщений: 543
14.04.2013, 12:32  [ТС] 8
Герц, нет, не думаю.
Считаю, что проблема именно в связи wostringstream и wcstok
Потому что так не работает:
C++
1
 wchar_t* pch = wcstok(const_cast<wchar_t*>(ostr.str().c_str()), L"; ");
А так работает:

C++
1
2
3
4
5
6
7
8
    wcout << ostr.str() << L"\n"; 
//  wchar_t* pch = wcstok(const_cast<wchar_t*>(ostr.str().c_str()), L"; ");
 
    wchar_t txt[] = L"dsfdsf; daserrr; sdfg";
    wchar_t* pch = wcstok(txt, L"; ");
    while (pch != NULL)
    {
// ...
Добавлено через 2 минуты
nonedark2008, я так и думал :-)
Есть другие варианты, как разбить на токены? Или искать альтернативные решения без wostringstream?
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
14.04.2013, 12:46 9
Можно сделать так:
C++
1
2
wstring a = ostr.str();
wchar_t* pch = wcstok(const_cast<wchar_t *>(a.c_str()), L"; ");
Но опять же. Не советую использовать wcstok. На твоем месте я бы использовал связку find и substr.

Добавлено через 8 минут
Так будет даже лучше
wstring::find(str, pos) - ищет str начиная с позиции pos.
wstring::erase(0, pos) - вырезает из строки первые pos стмволов
Т.е. в начале у тебя pos = 0, ищешь первую str. Делаешь свое черное дело, а затем к pos прибавляешь длину str, и вырезаешь из строки. И идешь заново.
1
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
14.04.2013, 16:16 10
Герц, нет, не думаю.
А ты попробуй сделать больше одного вывода wchar_t строки в wcout.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
14.04.2013, 16:23 11
Герц,
0
14.04.2013, 16:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.04.2013, 16:23
Помогаю со студенческими работами здесь

Не выходит реализовать wchar_t * -> LONG_PTR -> wchar_t *
как сделать чтобы в строку aa скопировать данные? непойму что я дедаю неправильно wchar_t * aa =...

Ошибка при подключении к XE3 библиотеки для VS: "Please use native wchar_t type (/Zc:wchar_t)"
Господа, пытаюсь прикрутить к билдеру библиотеку для работы с автокадом. К сожалению она жестко...

Error C2664: невозможно преобразовать из "wchar_t" в "const wchar_t *"
Вот так работает: wchar_t buf; Edit_GetText(hE, buf, sizeof(buf)); if(buf) { wchar_t b;...

CP886 в Multibyte (wchar_t) и BYTE в Multibyte (wchar_t)
Помогите разобраться с кодировками. Получаю из базы данных значения и при выводи их в EditControl...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru