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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ввод из потока 
:(
    Опции темы
Flashdown
Дата 6.5.2008, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Есть поток istream, в нем строка состоящая сначала из N-ого числа английских букв, далее из чисел, потом опять буквы и т.д.
Нужно строку, которая идет сначала - положить в переменную типа string, а число за ней - в int
Если бы было в начале число, а потом буквы - то всё было бы просто, а именно в этом случае - не знаю как... 
Желательно именно средствами потоков.

Подскажите, плз  smile 

Это сообщение отредактировал(а) Flashdown - 6.5.2008, 17:28
PM MAIL ICQ   Вверх
Rififi
Дата 6.5.2008, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 11
Всего: 36



и в чём проблема?

Код
void read_stream(std::istream& is)
{
    std::string s;
    int i;

    is >> s;
    is >> i;
}

std::stringstream ss;
ss << "zzz" << std::endl;
ss << 456 << std::endl;
read_stream(ss);

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(Rififi @  6.5.2008,  18:04 Найти цитируемый пост)
и в чём проблема?

в том что про ентеры ничего не сказано

первое что на ум пришло (извратское, но работает)
Код

struct Functor {
  Functor() : m_number_is_reached(false) {}
  bool operator()(char i_ch) {
    if (isdigit(i_ch)) m_number_is_reached = true;
    // если число достигнуто, а символ снова алфавитный, то конец чтения потока
    return m_number_is_reached && isalpha(i_ch);
    }
private:
  bool m_number_is_reached;
};

int main() {
  vector<char> vect;
  remove_copy_if(istream_iterator<char>(cin), istream_iterator<char>(), back_inserter(vect), Functor());
  string str;
  vector<char>::iterator it = find_if(vect.begin(), vect.end(), isdigit);
  copy(vect.begin(), it, back_inserter(str));
  // в диапазоне [it; vect.end()) записано число. как переводить - не помню
}




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


Шустрый
*


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

Репутация: нет
Всего: 3



Цитата(Flashdown @  6.5.2008,  17:26 Найти цитируемый пост)
Если бы было в начале число, а потом буквы - то всё было бы просто, а именно в этом случае - не знаю как...


Честно говоря я не понял почему ты не знаешь как в этом случае, но можно например вот так сделать:

Код

...
void CopyStr(char *dest,char *source,int ind1,int ind2)
{
//   dest=source[ind1..ind2];
  int i;
  for (i=ind1;i<=ind2;i++)
   dest[i-ind1]=source[i];
  dest[i-ind1]=0;
}
  ...
  //stream - TStream - твой буфер
  char stroka[1024],str_chislo[50];
  int chislo,i,ind1,ind2,ind3;

  char *ptr=(char *)malloc(stream->Size);
  stream->Read((char *)ptr,stream->Size);

 i=0;
 while (ptr[i]!=0)
 {
  ind1=i;
  while ((strchr("0123456789",ptr[i])==NULL)&&(ptr[i]!=0))  i++;
  int ind2=i;
  while ((strchr("0123456789",ptr[i])!=NULL)&&(ptr[i]!=0))  i++;
  int ind3=i;

  CopyStr(stroka,ptr,ind1,ind2-1);
  if (stroka!=NULL)
  {
    //очередная строка получена делай с ней что хочешь

  }
  CopyStr(str_chislo,ptr,ind2,ind3-1);
  if (ind2!=ind3)
  {
    //очередное число получено  делай с ним что хочешь
    chislo=StrToInt(str_chislo);
  }

 }

  free(ptr);




Это сообщение отредактировал(а) Gradov - 6.5.2008, 18:37
PM MAIL   Вверх
Flashdown
Дата 6.5.2008, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Gradov @ 6.5.2008,  18:33)
Честно говоря я не понял почему ты не знаешь как в этом случае, но можно например вот так сделать:

потому что если сначала идут цифры а потом буквы то делается просто
Код

int digits;
string symbols;
stream >> digits >> symbols;

а тут немножко посложнее, т.к. если сделать >>symbols>>digits он и цифры схавает.... 
вобщем идею я понял, спасибо!


Это сообщение отредактировал(а) Flashdown - 6.5.2008, 18:59
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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