Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> friend std::istream &operator>> для класса строки, реализация 
V
    Опции темы
anatox91
Дата 18.5.2008, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: 1
Всего: 13



а почему не работает пример opjox'a можете подсказать? вроде разобрался в его примере и по-моему все должно работать... но не работает...


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
opjox
Дата 18.5.2008, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 17.1.2008

Репутация: 2
Всего: 14



Цитата(bsa @  18.5.2008,  12:20 Найти цитируемый пост)
Но лучше типизировать (т.е. использовать '\0'), имхо.

'\0' – подчеркнет тип, но, имхо, для глаза 0 приятнее выглядит. На нижнем уровне присвоение будет выполнено одинаково.

Цитата(anatox91 @  18.5.2008,  19:37 Найти цитируемый пост)
а почему не работает пример opjox'a можете подсказать? вроде разобрался в его примере и по-моему все должно работать... но не работает...


Засада сидит в строчке:
Код

size_t len = p->in_avail();

если код собран с помощью g++, то для потока std::cin функция in_avail упорно возвращает 0, даже несмотря на то, что в буфере есть данные. Причем, на VS2008 код работает на ура. 

Чтобы все заработало, надо в len занести кол-ва данных в буфере. Или же модифицировать механизм поиска разделителя. 

Сейчас будет хоккей smile , после него попробую разобраться с проблемой. 

PM MAIL ICQ   Вверх
anatox91
Дата 18.5.2008, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: 1
Всего: 13



попробовал, действительно на визуалке все фурычит, а на MinGW не хочет... 
opjox, спасибо кстати, очень интересные функции узнал, +



--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
opjox
Дата 20.5.2008, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 17.1.2008

Репутация: 2
Всего: 14



В силу обстоятельств smile , отвечаю только сейчас.

Решить проблему так и не смог. Попробовал найти замену in_avail(), но тщетно. Потом решил пойти другим путем – пройтись по всему буферу до разделителя или до окончания данных. Тут уже все пошло лучше и даже удалось написать рабочий код для VS2008:

Код

  friend std::istream& operator>>(std::istream &in, cstring &obj)
  {
    std::istream::sentry s(in);       // ждем, пока в буфере будет хотя бы что-то
    if(s) {
      std::streambuf *p = in.rdbuf(); // получаем указатель на буфер с данными
      
      // узнаем, сколько символов до разделителя
      //
      obj.len = 0;                 
      char a;
      while( (a = p->sgetc())!=EOF && obj.it_not_separator(a)) {
        obj.len++;
        p->sbumpc();
      }
      // узнали, сколько символов до разделителя

      for(size_t len=0; len<obj.len; len++) p->sungetc(); // теперь вернемся к первому символу
      
      if(obj.buf) delete [] obj.buf;
      obj.buf = new char[obj.len+1];

      for(size_t i=0; i<obj.len; i++) obj.buf[i] = p->sbumpc(); // копируем в наш буфер
      obj.buf[obj.len] = 0;
    }
    return in;
  }


Но у этого кода есть проблема: если мы достигнем не разделителя, а конца данных, то тогда происходит сброс всего буфера, из-за чего все данные в нем теряются. Но для g++ оказалось всю намного хуже и без этого.  Функция sungetc отрабатывала всего один раз, а остальные вызовы игнорировались. Из-за этого не удается достич начала данных.

Похоже, придется отказаться от этого варианта, не вижу я пока больше способов решения проблем этого пути. 

PM MAIL ICQ   Вверх
baldina
Дата 20.5.2008, 07:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Что-то кажется мне с getline() попроще будет. Пусть даже и с неоднократным выделением памяти: производительность тут имхо не слишком важна ибо 
Цитата

интересно можно ли это сделать без классов 
 а в серьезной задаче будет std::string, т.к. велосипед уже изобретен и проверен.

Код

struct cstring {
  size_t len;
  char *string;
};

std::istream& operator>>(std::istream& in, cstring& obj)
{
  const size_t buf_size = 256;
  char buf[buf_size];
  obj.len = 0;
  obj.string = (char*)calloc(1,1);
  do
  {
    in.clear ();
    in.getline (buf, buf_size, ' ');
    size_t len = in.gcount ();
    if (len == 0)
      break;
    obj.string = (char*)realloc (obj.string, obj.len + len);
    strcpy (obj.string + obj.len, buf);
    obj.len += len;
  } while (in.fail ());

  return in;
}


PM MAIL   Вверх
anatox91
Дата 20.5.2008, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: 1
Всего: 13



всем спасибо, решил все-таки через string пусть будет  smile 
хотя конечно странно что пример opjox'а не работает в MinGW, но в VS2008 работает...


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1428 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.