Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366

Split CString

03.04.2013, 09:08. Показов 3571. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В Qt был метод split, а как рассплитить строки в библиотеке MFC?
Пробегаюсь в цикле по CStringList, получаю строку СString, как ее рассплитить?
for( int i =0; i<strlist.GetSize(i); i++)
{
string = strlist.GetAt(i);
// string = ??
}
Спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.04.2013, 09:08
Ответы с готовыми решениями:

CString::Format() и преобразование double в CString
Вот фрагмент программы: void CMy6_1Dlg::OnRadio3() { CString s; int i=m_list1.GetCount(); int a; int k=0; float...

Cstring
Помагите!!! нужно написать программу которая переводит вещественное число в строку!!!

CString(MFC)
Здравствуйте! пишу программу, появляются проблемы со строкой типа CString.... Вообще, есть ли ли функция, позволяющая узнать длину строки...

19
2 / 2 / 0
Регистрация: 05.04.2010
Сообщений: 66
03.04.2013, 09:31
"рассплитить" строку. Это как?
0
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366
03.04.2013, 09:36  [ТС]
"рассплитить" строку. Это как?
Это означает, что есть строка CString, слова в строке разделены пробелами, как из этой строки получить каждое слово, т.е. разделить ее на составляющие?
0
2 / 2 / 0
Регистрация: 05.04.2010
Сообщений: 66
03.04.2013, 09:58
Если как-то так?
C
1
2
3
4
5
6
7
for( int i =0; i<strlist.GetSize(i); i++)
{
  string = strlist.GetAt(i);
  string = string.SpanExcluding(_T(" "));
  // спасти посдстроку-слово
  // string = string.trimLeft(?) // убрать едущи[йе] пробел[ы]
}
0
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366
03.04.2013, 10:22  [ТС]
Что за i<strlist.GetSize(i);? Наверное просто i<strlist.GetSize();?
У меня почему-то ругается на string = strlist.GetAt(i);
Error 1 error C2664: 'CString &CStringList::GetAt(POSITION)' : cannot convert parameter 1 from 'int' to 'POSITION'
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
03.04.2013, 10:26
CStringT::Tokenize
0
2 / 2 / 0
Регистрация: 05.04.2010
Сообщений: 66
03.04.2013, 10:36
тип переменной i должен быть не "int", а "POSITION"
POSITION i;
0
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366
03.04.2013, 11:07  [ТС]
тип переменной i должен быть не "int", а "POSITION"
POSITION i;
т.е.
C++
1
2
3
for(POSITION i =0; i<strlist.GetSize(); i++)
{
}
Так что ли?
0
2 / 2 / 0
Регистрация: 05.04.2010
Сообщений: 66
03.04.2013, 11:25
Не скажу, не юзал. Попробуй сам?
0
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366
03.04.2013, 11:45  [ТС]
Я так понимаю по CStringList нужно идти так:
C++
1
2
3
4
5
6
Position pos = 0; 
for(pos = strlist.GetHeadPosition(); pos!=NULL;)  //CStringList strlist;
   {
       string = strlist.GetNext(pos);     //CString string;
        ....
    }
Да?
А как быстро проверить значения которые попадают в string, да и другие, например int переменные? (Такую же тему я поднимал ниже (про QDebug), но ответа не получил).
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
03.04.2013, 12:35
Xantrax, как ты формировал свой StringArray?
Если ты сделал так
C++
1
2
CString str = "Я считаю что пробел будет считаться как новая строка";
CStringArray pArr;pArr.Add(str);
То ты ошибаешся что получишь массив из 9-ти слов : pArr.Get(0) вернёт
"Я считаю что пробел будет считаться как новая строка"
Надо добавлять по каждому слову
C++
1
2
3
4
pArr.Add("slovo1");
pArr.Add("slovo2");
....
pArr.Add("slovoN");
Вот тогда Get будет возвращать отдельное слово
0
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366
03.04.2013, 13:28  [ТС]
Я сформировал свой CStringList таким образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
 CStdioFile file;
   file.Open("D:\\My_QT\\Work\\Realization\\Data.txt",CFile::modeRead|CFile::shareExclusive|CFile::typeText);
 
   CString string;
   CStringList strlist;
   do{
       file.ReadString(string);
       strlist.AddTail(string);
   }while(!string.IsEmpty());
 
   file.Close();
   string.Empty();
В файле три строки по три значения, первое значение в каждой строке char.
Далее, я разбиваю строки находящиеся в strlist до "слов".
C++
1
2
3
4
5
6
7
8
   POSITION pos;
   int curPos = 0;
   strlist.m_nCount();
   for(pos = strlist.GetHeadPosition(); pos!=NULL;)
   {
       string = strlist.GetNext(pos);
       listsmall.AddTail(string.Tokenize(" ",curPos));
   }
Следующим шагом, нужно поместить в CComboBox, первые значения в каждой строке.

Мне не понятно два вопроса...
1) как оперативно посмотреть значени которое находится в интересующей меня переменной (int, double, CString и т.д.);
2) Как пройтись в цикле по получившемуся листу (listsmall) и InsertString первые значения в каждой строке в CCombobox.


Прошу прощения за вопросы, до этого написал пару небольших программок (3000+ строк) в Qt, а теперь пришлось пересесть в MFC со средой Visual Studio 2005.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
03.04.2013, 14:12
Цитата Сообщение от Xantrax Посмотреть сообщение
strlist.AddTail(string);
- просто strlist.Add не надо тэйлов мэйлов токенайзов и прочей лабуды, я же написал чётко и ясно как сделать, зачем мудрить?А данные в твоём какие?

Цитата Сообщение от Xantrax Посмотреть сообщение
D:\\My_QT\\Work\\Realization\\Data.txt
- мне надо посомтреть структуру файла, быть может там нет '\n' и весь файл одна большая стринга

Добавлено через 3 минуты

Не по теме:

Цитата Сообщение от Xantrax Посмотреть сообщение
В файле три строки по три значения, первое значение в каждой строке char.
- покажи данные файла конкретно, 2-3 строки мне хватит и этого

0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
03.04.2013, 14:36
Цитата Сообщение от Xantrax Посмотреть сообщение
Мне не понятно два вопроса...
1) как оперативно посмотреть значени которое находится в интересующей меня переменной (int, double, CString и т.д.);
2) Как пройтись в цикле по получившемуся листу (listsmall) и InsertString первые значения в каждой строке в CCombobox.
-
1 - Ну вот показал бы свой файл я бы показал на пальцах как это сделать
2 - Какой инсерт, неужели не научили снимать галочку Sort с комбобокса?
Короче вот простой код для заполнения комбобокса 1-мы словами из строк
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
void CStrWordDlg::OnOK() 
{
    // TODO: Add extra validation here
    DWORD dwPos;
    CString sLine;
    CStdioFile pFile;
    if(pFile.Open("data.txt", CFile::modeReadWrite|CFile::typeBinary))
    {
        for
        (
            dwPos = pFile.GetPosition(); 
            dwPos < pFile.GetLength();
            dwPos = pFile.GetPosition()
        )
        {
            pFile.ReadString(sLine);
            sLine.Replace('\t', ' ');
            dwPos = sLine.Find(" ", 0);
            if(dwPos != -1)
                sLine = sLine.Left(dwPos);
            m_Combo.AddString(sLine);
            
        }
    }
    else
        m_Combo.AddString("Error open data.txt");
    m_Combo.SetCurSel(0);
    //CDialog::OnOK();
}
В аттаче экзешник и проект
Миниатюры
Split CString  
Вложения
Тип файла: rar StrWord.rar (23.3 Кб, 7 просмотров)
Тип файла: rar StrWord.exe.rar (3.8 Кб, 4 просмотров)
1
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366
03.04.2013, 16:27  [ТС]
просто strlist.Add
У CStringList нет метода add().
Файл прикладываю(обычный файл, ничего в нем нет такого).
Какой инсерт, неужели не научили снимать галочку Sort с комбобокса?
Все элементы созданы динамически(так надо).
DWORD dwPos;
Ммм, что за новые типы данных, где про них прочитать?

Смотреть переменные можно с помощью дебага...

Код посмотрю....
Вложения
Тип файла: txt Копия.txt (32 байт, 11 просмотров)
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
03.04.2013, 16:43

Не по теме:

Цитата Сообщение от Xantrax Посмотреть сообщение
CStringList
- поюазй CStringArray, щас смотрю документ



Добавлено через 54 секунды
Xantrax, итак сформулируй задачу - что где хотим видеть?
Также вопрос - структура файла именно такая и нет полей с иным числов столбцов?
1
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366
03.04.2013, 16:58  [ТС]
Задача:
1)Выгрузить данные из файла.
2)Последнее значение в каждой строке(то,что состоит из букв и цифр) поместить в CComboBox.
Локально задача пока такая.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
03.04.2013, 17:37
Цитата Сообщение от Xantrax Посмотреть сообщение
Задача:
1)Выгрузить данные из файла.
2)Последнее значение в каждой строке(то,что состоит из букв и цифр) поместить в CComboBox.
Локально задача пока такая.
- собственно проект тот же всё тоже, в коде необходимы лишь совсем небольшие изменения
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
void CStrWordDlg::OnOK() 
{
    // TODO: Add extra validation here
    DWORD dwPos;
    CString sLine;
    CStdioFile pFile;
    if(pFile.Open("data.txt", CFile::modeReadWrite|CFile::typeBinary))
    {
        for
        (
            dwPos = pFile.GetPosition(); 
            dwPos < pFile.GetLength();
            dwPos = pFile.GetPosition()
        )
        {
            pFile.ReadString(sLine);
            sLine.Replace('\t', ' ');
            sLine.Remove ('\r');
            sLine.Remove ('\n');
            sLine.MakeReverse();
            dwPos = sLine.Find(" ", 0);
            sLine.MakeReverse();
            if(dwPos != -1)
                sLine = sLine.Right(dwPos);
            m_Combo.AddString(sLine);
        }
    }
    else
        m_Combo.AddString("Error open data.txt");
    m_Combo.SetCurSel(0);
    //CDialog::OnOK();
}
Тот же проект аттачить 2-й раз не хочу, потому ниже скрин и экзешник
Миниатюры
Split CString  
Вложения
Тип файла: rar StrWord2.exe.rar (3.9 Кб, 5 просмотров)
1
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366
04.04.2013, 01:12  [ТС]
Для начала спасибо!
Далее разбираем:
У меня был несколько другой алгоритм:
- в цикле, пока файл не пуст, считать строку из файла в CString;
- поместить ее в контейнер, изначально предполагал поместить в CStringList, но вы порекомендовали использовать CStringArray;
- далее следующую строку, как следует из цикла и опять добавить в контейнер;
- все цикл завершился, имеем массив строк;

- далее бежим в цикле по CStringArray, пока массив строк не закончится (переменная не будет больше размера массива);
- помещаем каждую строку в CString;
- далее сплитим эту строку(CStringT::Tokenize) и помещаем в другой CStringArray;
- далее, нам заранее известно, что 2,5 и 8 элементы этого массива строк - это те записи что нам нужны
- получаем эти элементы(GetAt()) и помещаем в CComboBox...

1) DWORD - 32-bit unsigned integer. Зачем городить огород, нельзя сразу, так и написать unsigned int(но это не вам, это разработчикам)?

2) GetPosition() - return the file pointer. получается, что функция возвращает не какой-то point, а беззнаковый int
Да и вообще, что возвращает данная функция, почему при первом прохождении dwPos = 0, а потом он равен 12, далее 22, откуда эти цифры?
3) Удаляем заменяем горизонтальную табуляцию на пробел, удаляем возврат каретки и перенос строки (вот только вопрос, зачем? Разве у одной строки может быть новая строка(\n)?
4) интересная функция у CStringT::MakeReverse, в обычной строке (abc) она переворачивает каждый символ, т.е. (cba), впрочем в строке состоящей из слов происходит ровным счетом тоже самое и используем мы это извращенство, что бы потом добавить в CComboBox строку состоящую из количества символов взятых справа из первоначальной строки.
5) string.Find(" ",0); вот оно это извращенчество....

В общем мне не понятно как заканчивается цикл....
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
04.04.2013, 01:52
Цитата Сообщение от Xantrax Посмотреть сообщение
DWORD - 32-bit unsigned integer. Зачем городить огород, нельзя сразу, так и написать unsigned int(но это не вам, это разработчикам)?
- мне проще написать DWORD и понимать что код имеет windows.h в вершине

Цитата Сообщение от Xantrax Посмотреть сообщение
GetPosition() - return the file pointer. получается, что функция возвращает не какой-то point, а беззнаковый int
Да и вообще, что возвращает данная функция, почему при первом прохождении dwPos = 0, а потом он равен 12, далее 22, откуда эти цифры?
- GetPosition возвращет байты на которых курсор, при открытии файла курсор ставится вначало (почти для всех потоков так/иногда есть нбюансы и надо явно делать СикБэг), во всём соатльном говоришь 12 - ну значит 12 байтов было в строке, а потмом 22 - стало - ну значит строка 22-12 = 10 байт, что тут такого сложного?

Цитата Сообщение от Xantrax Посмотреть сообщение
Разве у одной строки может быть новая строка(\n)?
- вконче строки ReadString при
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
|CFile::typeBinary)
приаттачит в строку \r а \n я на всяк пожарный пробую удалить. Прелисть Remove в том. что если есть символ для удалении - он будет изъят из строки, а если нету символа и удаления не будет.

Цитата Сообщение от Xantrax Посмотреть сообщение
string.Find(" ",0); вот оно это извращенчество....
- что это значит?Найти пробел извращенчество?Парень, ты разберись в алгоритме сначала, а потом говори на конструкции извращенчество.
Я решил твою задачу за 5 минут, верней 2-е + ещё на работе форму забивал, а ты сидел сидел, да настолько как я понял подвис, что на форум написал - ну как бы я тоже могу сказать извращенчество не думать самому. Будь попроще в выражениях адресованых тем кто явно знает MFC получше тебя!

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Xantrax Посмотреть сообщение
В общем мне не понятно как заканчивается цикл....
- жесть:facepalm:

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.04.2013, 01:52
Помогаю со студенческими работами здесь

Class CString в VC++8.0
Как передать переменную типа CString из .exe в dll

mfc CString ^
Добрый день. Создал приложение MFC c++. Есть необходимость считать содержимое поля для ввода текста EGIT CONTROL. Создана переменная-член...

CString, MFC
Здавствуйте! Как из объекта CString из MFC выбрать подстроку? Например, от последнего пробела и до конца строки? и наоборот - от начала -...

CString в double
CEdit *editBoxPtr1 = (CEdit *)(this-&gt;GetDlgItem(IDC_EDIT1)); editBoxPtr1-&gt;GetWindowText(rString); Нужно CString преобразовать в...

Char * to CString
Добрый день, пытаюсь конвертить char* в Cstring у CString имеется собственный конструктор под char* если вызывать так LPCWSTR...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru