Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.88
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 543
#1

Непонятки с wchar_t - C++

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

Прошу помощи: что-то не так с 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");
    }
// ...
Но имена файлов выводит так:
0
Миниатюры
Непонятки с wchar_t  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.04.2013, 11:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Непонятки с wchar_t (C++):

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

Cannot convert from 'wchar_t' to 'const wchar_t *' - C++
такой код, порылся в инете не помогло. ломать голову надоело может кто подскажет, буду благодарен. wchar_t * english = L&quot;abvgdee...

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

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

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

Error: cannot bind 'std::basic_ostream<wchar_t>' lvalue to 'std::basic_ostream<wchar_t>&&'| - C++
Ругается на строку Log&lt;&lt;StripXML(__PRETTY_FUNCTION__)&lt;&lt;std::endl;. Функция такая: std::string StripXML ...

10
nonedark2008
931 / 670 / 147
Регистрация: 28.07.2012
Сообщений: 1,827
14.04.2013, 11:33 #2
Цитата Сообщение от Afflicted Посмотреть сообщение
fstream
->
C++
1
wfstream
Цитата Сообщение от Afflicted Посмотреть сообщение
ostringstream
->
C++
1
wostringstream
Цитата Сообщение от Afflicted Посмотреть сообщение
string
->
C++
1
wstring
1
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 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
nonedark2008
931 / 670 / 147
Регистрация: 28.07.2012
Сообщений: 1,827
14.04.2013, 12:04 #4
Выложи код полностью.
0
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 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
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
14.04.2013, 12:22 #6
Консоль Windows не умеет нормально выводить ни UTF-8, ни UTF-16. После первого вывода поток "ломается" и символы более не выводятся.
0
nonedark2008
931 / 670 / 147
Регистрация: 28.07.2012
Сообщений: 1,827
14.04.2013, 12:29 #7
Цитата Сообщение от Afflicted Посмотреть сообщение
const_cast<wchar_t*>(ostr.str().c_str())
Так делать нельзя.
0
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 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
nonedark2008
931 / 670 / 147
Регистрация: 28.07.2012
Сообщений: 1,827
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
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
14.04.2013, 16:16 #10
Герц, нет, не думаю.
А ты попробуй сделать больше одного вывода wchar_t строки в wcout.
0
nonedark2008
931 / 670 / 147
Регистрация: 28.07.2012
Сообщений: 1,827
14.04.2013, 16:23 #11
Герц,
0
14.04.2013, 16:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2013, 16:23
Привет! Вот еще темы с ответами:

wchar_t - C++
что ето за тип данних: wchar_t скок у нему байт??

Wchar_t - C++
подключаюсь к серверу. Присваиваю переменной типа string имя, const char* charName = _Name.c_str(); затем в цикле передаю серверу имя...

wchar_t to LPCWSTR - C++
Ругается, что text является неинициализированной локальной переменной #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;Windows.h&gt;...

Тип wchar_t - C++
#include &lt;iostream&gt; using namespace std; int main(){ wchar_t uo = L'a'; cout &lt;&lt; uo; return 0; } Почему выводится не...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru