На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Работа со строками
    Есть файл с текстом:
    "Мама мыла раму .....всего текста 300кб.....папа помогал ей"
    Задача: вырезать текст с места "раму" по "папа" и записать в новый файл
    Если функция в С++ которая ищет заданую подстроку и возвращает индекс первого символа заданой подстроки (аналог в php - strpos)
    Можно ли в С++ обращаться к строке как к масиву? и как это реализуется через указатели?
    Обьясните пожалуйста поподробнее с примерами, я новичек и очень хочу разобраться
      Цитата
      GNU, 17.12.03, 16:07
      Если функция в С++ которая ищет заданую подстроку и возвращает индекс первого символа заданой подстроки

      strstr - возвращает указатель на первый элемент найденной подстроки (т.е. на саму подстроку)

      Цитата
      GNU, 17.12.03, 16:07
      Можно ли в С++ обращаться к строке как к масиву

      можно

      Цитата
      GNU, 17.12.03, 16:07
      Обьясните пожалуйста поподробнее с примерами, я новичек и очень хочу разобраться

      char *pString = "Мама мыла раму .....всего текста 300кб.....папа помогал ей";
      char *pRama = strstr(pString, "раму");

      if (pRama) // нашли строку
      {
        char *pPapa = strstr(pString, "папа");

        if (pPapa) // нашли строку
        {
          *pPapa = 0; // обрезаем строчку (аналог pPapa[0] = 0)
          int nLength = pPapa - pRama + 1; // длина новой строки + символ конца строки

          ... пишем строку pRama в файл
        }
      }
      Сообщение отредактировано: Uncle_Bob -
        Если пишешь с использованием MFC то можно использовать методы CString::Find кажется.
        В std::string вроде тоже поиск подстроки (символа) реализован.
        Сообщение отредактировано: Mfcer__ -
          "Мама мыла раму .....всего текста 300кб.....папа помогал ей"
          А как вырезать с "рама" по "папа" и записать в новый текст то что осталось - "Мама мыла помогал ей"
          Я делал так:
          void *buf;
          int handle, bytes;
          FILE *newfile;
          buf = malloc(500000);

          handle = open("file.txt", O_RDONLY | O_BINARY, S_IWRITE | S_IREAD);

          bytes = read(handle, buf, 500000);

          char *pfirst = strstr((char*) buf, "<script>");
          char *plast=strstr((char*) buf, "</script>");
          int nLength=pfirst;
          newfile = fopen("file2.txt", "w");
          fwrite(buf, nLength, 1, newfile);
          fclose(newfile);

          Почему матюгается на int nLength=pfirst; ведь мы писали фактически то же самое

          int nLength=plast-pfirst;

            Почувствуй разницу - в твоем случае ты переменной типа int присваивашь указатель на char (char*). А в приведенной тобою строчке переменной типа int присваивается разница двух указателей (так называемый ptrdiff_t) - а она обычно имеет тип int. Что бы в твоем случае все было правильно сделай так:
            int nLength = pfirst - buf;

            И еще (совет на будущее) не смешивай потоковый ввод/вывод (fopen, fwrite и т. п.), и низкоуровневым (open, read и т. п.). Выбери чего-нибудь одно.
            Сообщение отредактировано: Flex_Ferrum -
              Значит теперь чтобы записать последний кусок текста я должен писать:

              int nLength = plast- buf;
              ...
              запись в файл
                int nLength = bytes - (plast - buf)
                  Почему выдает ошибку такой код

                  #include <stdio.h>
                  #include <io.h>
                  #include <alloc.h>
                  #include <fcntl.h>
                  #include <process.h>
                  #include <sys\stat.h>
                  #include <iostream.h>
                  int main(void)
                  {
                  FILE *stream;
                  int size=0;
                  char item[1];
                  stream = fopen("file.txt", "r");
                  while (! feof(stream))
                  {
                  fread(item, 1, 1, stream);
                  size++;
                  }
                  fclose(stream);

                  void *buf, *rez, *rezult;
                  int handle, bytes;
                  FILE *newfile;
                  buf = malloc(size);
                  rez = malloc(size);
                  rezult = malloc(size);


                  handle = open("file.txt", O_RDONLY | O_BINARY, S_IWRITE | S_IREAD);
                  bytes = read(handle, buf, size);


                  int k=0;
                  while (k!=1000)
                  {
                  char *pfirst=strstr((char*) buf, "<a>");
                  char *plast=strstr((char*) buf, "</a>");
                  k++;
                  if (pfirst)
                  {
                  int lenght=pfirst-(char*)buf;
                  cout <<lenght<<endl;
                  *pfirst=0;
                  newfile=fopen("rez.txt", "a");
                  fwrite(buf, lenght, 1, newfile);
                  fclose(newfile);
                  buf=plast+4;
                  cout <<buf;
                  }
                  }



                  int a;
                  cin >>a;
                  return 0;
                  }
                  Файл file.txt
                  111
                  222
                  <a>gfggfg</a>
                  sssssssssss
                  ddddddddddd
                  ffffff
                  <a>gfggfg</a>
                  gjhfgjfgj
                  fgjfgjfgj
                  <a>gfggfg</a>

                  rez.txt:
                  111
                  222
                  sssssssssss
                  ddddddddddd
                  ffffff
                  gjhfgjfgj
                  fgjfgjfgj

                  Результат дает правильный но выдает ошибку что-то с памятью не то. Может какое-то другое условие в цыкле поставить?
                    Цитата
                    GNU, 19.12.03, 14:32
                    int k=0;
                    while (k!=1000)

                    А почему у тебя именно такое условие в цикле? Пчему не сделаешь так:

                    char* end_ptr = buf + size;
                    while (buf < end_ptr)

                      Цитата
                      buf = malloc(size);
                      rez = malloc(size);
                      rezult = malloc(size);

                      Память выделил, а освободить забыл.
                      free(buf);
                      free(rez);
                      free(rezult);
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0302 ]   [ 16 queries used ]   [ Generated: 4.05.24, 02:35 GMT ]