Форум программистов, компьютерный форум CyberForum.ru

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

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

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

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

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

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

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

Wchar_t to char - C++
я тут обнаружил любопытнейшую вещь, оказывается можно просто присваивать char = wchar_t и наоборот ! просто хочу убедиться это как бы без...

wchar_t в string - C++
Собственно, как можно преобразовать wchar_t* в string?

Чтение wchar_t - C++
читаю из файла строку wchar_t символов, почему читается какая то хрень?

String to wchar_t - C++
День всем добрый. Уже пролазил весь интернет, и ничего не понял. Вся надежда на вас. У меня есть программа. И она не дружит с...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nonedark2008
889 / 628 / 126
Регистрация: 28.07.2012
Сообщений: 1,697
14.04.2013, 11:33     Непонятки с wchar_t #2
Цитата Сообщение от Afflicted Посмотреть сообщение
fstream
->
C++
1
wfstream
Цитата Сообщение от Afflicted Посмотреть сообщение
ostringstream
->
C++
1
wostringstream
Цитата Сообщение от Afflicted Посмотреть сообщение
string
->
C++
1
wstring
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 543
14.04.2013, 11:52  [ТС]     Непонятки с wchar_t #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"; ");
    }
nonedark2008
889 / 628 / 126
Регистрация: 28.07.2012
Сообщений: 1,697
14.04.2013, 12:04     Непонятки с wchar_t #4
Выложи код полностью.
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 543
14.04.2013, 12:08  [ТС]     Непонятки с wchar_t #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");
}

До разделения по токенам все печатается на экран нормально. После - не печатается вовсе: никаких символов.
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
14.04.2013, 12:22     Непонятки с wchar_t #6
Консоль Windows не умеет нормально выводить ни UTF-8, ни UTF-16. После первого вывода поток "ломается" и символы более не выводятся.
nonedark2008
889 / 628 / 126
Регистрация: 28.07.2012
Сообщений: 1,697
14.04.2013, 12:29     Непонятки с wchar_t #7
Цитата Сообщение от Afflicted Посмотреть сообщение
const_cast<wchar_t*>(ostr.str().c_str())
Так делать нельзя.
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 543
14.04.2013, 12:32  [ТС]     Непонятки с wchar_t #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?
nonedark2008
889 / 628 / 126
Регистрация: 28.07.2012
Сообщений: 1,697
14.04.2013, 12:46     Непонятки с wchar_t #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, и вырезаешь из строки. И идешь заново.
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
14.04.2013, 16:16     Непонятки с wchar_t #10
Герц, нет, не думаю.
А ты попробуй сделать больше одного вывода wchar_t строки в wcout.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2013, 16:23     Непонятки с wchar_t
Еще ссылки по теме:

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

String в wchar_t* - C++
Всем доброго времени суток! Вопрос уже изъезжен давно, но я уже 2 недели &quot;курю&quot; этот форум, но так и не смог выполнить довольно простую...

Конвертация в wchar_t - C++
Прочитал что если перед строковым литералом написать L то он будет приведён к типу wchar_t, но почему-то на выходе у меня получается адрес,...

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

Преобразовать LPARAM в wchar_t* - C++
Что не так со строчкой: if (Msg == WM_SETTEXT &amp;&amp; wcsstr((LPCTSTR)lParam, L&quot;/ бла бла бла&quot;) != NULL) Вывод: readme.cpp(8): error...


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

Или воспользуйтесь поиском по форуму:
nonedark2008
889 / 628 / 126
Регистрация: 28.07.2012
Сообщений: 1,697
14.04.2013, 16:23     Непонятки с wchar_t #11
Герц,
[IMG]http://i46.***********/thumb/2013/0414/86/28781c03baac7a5bd8ff86c3860adf86.jpeg[/IMG]
Yandex
Объявления
14.04.2013, 16:23     Непонятки с wchar_t
Ответ Создать тему
Опции темы

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