Search code examples
c++operator-overloadingistream

Overriding operator>> for a Strings class


I just have a quick question. I need to override the operator >> for a custom String class and I can't quite figure out how to do it.

I know that this code works, because it was my original method of solving the problem:

istream& operator>>(istream &is, String &s) {
  char data[ String::BUFF_INC ];  //BUFF_INC is predefined
  is >> data;
  delete &s;
  s = data;
  return s;
}

However, according to the spec (this is a homework assignment), I need to read in the characters 1 at a time to manually check for whitespace and ensure that the string isn't too big for data[]. So I changed my code to the following:

istream& operator>>(istream &is, String &s) {
  char data[ String::BUFF_INC ];
  int idx = 0;
  data[ 0 ] = is.get();
  while( (data[ idx ] != *String::WHITESPACE) && !is.ios::fail() ) {
    ++idx;
    is.get();
    data[ idx ] = s[ idx ];
  }
  return is;
}

When this new code is executed however it just gets stuck in a loop of user input. So how do I use is.get() to read in the data character by character but not wait for more user input? Or should I perhaps be using something other than .get()?


Solution

  • You don't seem to be doing anything with the character you get from the stream

    istream& operator>>(istream &is, String &s) {
      char data[ String::BUFF_INC ];
      int idx = 0;
      data[ 0 ] = is.get();
      while( (data[ idx ] != *String::WHITESPACE) && !is.ios::fail() ) {
        ++idx;
        is.get();              // you don't do anything with this
        data[ idx ] = s[ idx ]; // you're copying the string into the buffer
      }
      return is;
    }
    

    So it checks whether the string s contains a whitespace, not whether you read a whitespace from the stream.