Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
 Аватар для ijonhson
47 / 47 / 15
Регистрация: 09.03.2011
Сообщений: 584

Функция разбиения строки в массив строк по разделителю (аналог implode php)

08.02.2014, 22:26. Показов 2289. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую, необходимо осуществить запись массивов AnsiString в файл, записываю так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int baseio::Ansi_to_file(AnsiString filepath,AnsiString text)
{
  int indicator=0;
  char* filepath1=new char[filepath.Length()+1];
    strcpy(filepath1,filepath.c_str());
    char *first=new char[text.Length()+1];
    strcpy(first,text.c_str());
    ofstream file;
    file.open(filepath1,std::ios::out);
    if(file.write(first,text.Length()+1))
    indicator=1;
    file.close();
    delete first;
    delete filepath1;
    return indicator;
}
открываю :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
AnsiString baseio::FileToAnsi(AnsiString path)
{
  AnsiString b="";
  char* filepath1=new char[path.Length()+1];
    strcpy(filepath1,path.c_str());
  ifstream file(filepath1,ios::in);
  char temp;
  while(!file.eof())
  {
    file>>temp;
    AnsiString a=temp;
    b.Insert(a,b.Length());
  }
  return b;
}
тут всё работает(вроде как нормально)
проблемка в функции преобразования строки в массив
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
vector <AnsiString> baseio::implodeAnsi(AnsiString mains,AnsiString separator)
{
    vector <AnsiString> temp;
    int lastcounter=1;
    bool indicator=true;
    for(int i=1;i<=mains.Length()-separator.Length();i++)
    {
      if(mains[i]==separator[1])
      {
        for(int i1=1;i1<separator.Length()+1;i1++)
        {
          if(mains[i+i1-1]==separator[i1])
          {
            indicator=true;
          }else
          {
            indicator=false;
          }
        }
        if(indicator==true)
        {
 
          AnsiString temp1;
          for(int i3=lastcounter,i4=1;i3<=i-1;i3++,i4++)
          {
            AnsiString l=mains[i3];
            temp1.Insert(l,temp1.Length());
          }
          temp.push_back(temp1);
          lastcounter=i-1+separator.Length();
        }
      }
    }
    return temp;
}
Проблема 1: строки в вектор попадают без пробелов
Проблема 2: первые 2 символа обрезаны(их просто нет)
И вроде перебрал всё по шурупчику, нужно взглянуть свежим взглядом)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.02.2014, 22:26
Ответы с готовыми решениями:

Создать массив строк, созданных из разделения исходной строки по разделителю (Segmentation fault)
Помогите пожалуйста найти ошибку. Выдает ошибку сегментации, не могу понять, из-зач его она появляется Задание: дается строка и...

Функция разбиения строки в части [C++]
Всем доброго времени суток. Нужно написать условие, который разделит (через точки) строку line на lname, fname, mname Например: ...

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

4
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
09.02.2014, 03:17
Цитата Сообщение от ijonhson Посмотреть сообщение
Проблема 2: первые 2 символа обрезаны(их просто нет)
дело в кодировке... как бы объяснить

Дело в том, что AnsiString это не тоже что UnicodeString или тому подобное
т.е., да все строка записывается, но в оригинальном варианте есть еще служебные символы

strcpy(filepath1,filepath.c_str()); // тут символы
char *first=new char[text.Length()+1]; // тут количество символов


vector <AnsiString> // а тут уже Ansi как класс, уже со служебной инфой, и поэтому 2 символа пропадают (2 байта)
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.02.2014, 16:53
Может boost ?

Или через TStringList на худой конец.
1
 Аватар для ijonhson
47 / 47 / 15
Регистрация: 09.03.2011
Сообщений: 584
09.02.2014, 20:41  [ТС]
Согласен изобретать велосипед неблагодарное занятие))), с
C++
1
2
TStringList *nuevo=new TStringList;
nuevo->LoadFromFile(OpenDialog1->FileName);
всё красиво, но функцию implode не могу допилить
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
vector <AnsiString> baseio::implodeAnsi(AnsiString mains,AnsiString separator)
{
 
    vector <AnsiString> temp;
    int lastcounter=1;
    bool indicator=true;
    for(int i=1;i<=mains.Length()-separator.Length();i++)
    {
      if(mains[i]==separator[1])
      {
        for(int i1=1;i1<separator.Length()+1;i1++)
        {
          if(mains[i+i1-1]==separator[i1])
          {
            indicator=true;
          }else
          {
            indicator=false;
          }
        }
        if(indicator==true)
        { ShowMessage(IntToStr(i));
 
          AnsiString temp1;
          for(int i3=lastcounter;i3<=i-1;i3++)
          {
            AnsiString l=mains[i3];
            temp1.Insert(l,temp1.Length());
          }
          temp.push_back(temp1);
          lastcounter=i-1+separator.Length();
        }
      }
    }
    return temp;
}
функция работает(немного неправильно но я подправлю), меня больше смущает то что
при закрытии программки вылетает EInvalidPointer.Причём до закрытия никаких косяков не происходит
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.02.2014, 21:01
А зачем тебе вектор стринг, если у тебя есть стринг лист ?

Добавлено через 9 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//---------------------------------------------------------------------------
void Split(const String Text,TStringList* Lines,const Char Delimiter)
{
    Lines->Delimiter= Delimiter;
    Lines->DelimitedText= Text;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TStringList* SL= new TStringList;
 
 Split(Edit1->Text,SL,L';');
 
 Memo1->Lines->Assign(SL);
 delete SL;
}
//---------------------------------------------------------------------------
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.02.2014, 21:01
Помогаю со студенческими работами здесь

Не работает функция проверки и разбиения строки
Привет! Имеется макрос, заполняющий шаблон Word документа значениями из ячеек Excel. В данном макросе есть функция проверки значения в...

Алгоритм разбиения строки по словам в массив
Есть строка, в которой слова разделены заранее известным символом (запятая, например). Как можно вынести каждое из этих слов в массив? ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru