Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Ввод из потока


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

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

Автор: Rififi 6.5.2008, 18:04
и в чём проблема?

Код
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);

Автор: Alek86 6.5.2008, 18:18
Цитата(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()) записано число. как переводить - не помню
}


Автор: Gradov 6.5.2008, 18:33
Цитата(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);



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

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)