3

I'm a usual lurker but this is my first post! I understand you guys like detail so I will do my best. I will appreciate whatever input anyone has.

I am working on an overloading the extraction operator for an object with a dynamic array of digits. The console input will have leading white space, then an int, then anything after. I need to ignore white space, extract the int, and then leave the rest alone. Easy right?

Here is an example of code I found online:

    istream & operator >> (istream &m, MyInt & p)
{
    int x = 0;
    p.currentLength = 0;
    while ((m.peek() == '\n') || (m.peek() == '\0') ||
           (m.peek() == '\t') || (m.peek() == ' '))
    {
        m.get();
    }
        while ((m.peek() >= '0') && (m.peek() <= '9'))
    {
        if (p.currentLength >= p.maxSize)
        {
            p.grow();
        }
        m >> p.theNumber[x];
        x++;
        p.currentLength++;
    }
    m.get();
    // reverse the order (i.e. - 123 to 321)
    char * temp = new char[p.maxSize];
        for (int y = 0; y < p.currentLength; y++)
    {
        temp[y] = p.theNumber[p.currentLength - 1 - y];
    }   
    delete [] p.theNumber;
    p.theNumber = temp;

    return m;
}

Now, I understand this method may work, however to me, that seems like an extremmeelly inefficient method. For a trillion digit number, Grow() would reallocate the array a trillion times! Perhaps this is not as bad as I think it is?

My current method has been using seekg() and peek() and get(). Like so:

    istream& operator >> (istream& is, MyInt& z)
{
    int i = 0, j = 0;
    // check if next char is white
    while (is.peek() == 38)
    {
        j++;
        is.seekg(j); // skip if white
    }
    while (isdigit(is.peek()))
    {
        i++;
        is.seekg(j + i);
        if (!is.peek())
        {
            is.clear();
            break;
        }
    }
    is.seekg(j);
    z.length = i; 
    z.digits = new int[i + 1];
    for (i = 0; i < z.length; i++)
    {
        z.digits[i] = C2I(is.get());
    }
    return is;
}

Also, here is my main:

  int main()
{
    MyInt B;
    cout << "\n\nChange B to what num? ---> ";
    cin >> B;
    cout << "B is now: " << B;

    char c;
    cout << "\n\n\n\n\nEnter char to exit :   ";
    cin >> c;
    return 0;
}

For the life of me I can not find what is causing my program to exit. The last output seems to say, 'B is now: -1'

I believe the this means the << B failed. I have B initialized to 0 currently, and the rest of my code has presented no other issues. It's private member data only include the pointer and a length (num of digits). Also C2I() is a function that converts '0' through '9' to 0 through 9.

A big issue for me is I am fairly new to parsing, so I don't have very eloquent ways to test this, or other ideas.

Again I appreciate everything you guys do. I have already learned a great deal from browsing here!

spanishgum
  • 1,030
  • 1
  • 14
  • 29

0 Answers0