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

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

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

Author24 — интернет-сервис помощи студентам
Приветствую, необходимо осуществить запись массивов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.02.2014, 22:26
Ответы с готовыми решениями:

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

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

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

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

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

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

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


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

Или через TStringList на худой конец.
1
47 / 47 / 15
Регистрация: 09.03.2011
Сообщений: 584
09.02.2014, 20:41  [ТС] 4
Согласен изобретать велосипед неблагодарное занятие))), с
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
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.02.2014, 21:01 5
А зачем тебе вектор стринг, если у тебя есть стринг лист ?

Добавлено через 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
09.02.2014, 21:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.02.2014, 21:01
Помогаю со студенческими работами здесь

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


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

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