混合数字类istream问题

时间:2012-08-20 18:25:00

标签: c++ operator-overloading iostream fractions iomanip

我在夏天给自己做了一些功课,由于这个问题,我98%完成的项目已经停止了。

我有一个名为Mixed的课程。它包含整数,分子和分母的成员数据。我需要重载所有常用运算符,以允许混合类型的对象的乘法,加法,比较和流式传输。除了>>之外,我已经超载了所有运营商(提取算子)。

所有读入的混合数字都是格式: 整个分子/分母

ex:1 2 / 3,0 7/8,-3 18 / 5,0 -1/89

标题:friend istream& operator>> (istream &, Mixed);

CPP文件:istream& operator>> (istream &in, Mixed m) {...}

对于作业,我仅限于iostream和iomanip库。我的计划是读取流中的值并将它们分配给临时的int变量(w,n,d),然后我将使用Mixed构造函数创建对象m。不幸的是,我想不出分离分子和分母的方法。它们都是整数,但它们之间有一个char(/)。

  • 我不能将getline()与其分隔符一起使用,因为它将数据分配给char数组,我不相信我可以在没有其他库的情况下转换为int。
  • 我不能使用char数组,然后出于同样的原因对其进行分段。
  • 我不能在get()和peek()中使用while循环,因为我认为我不能将char数组转换为int。
  • 我不能使用字符串或c字符串然后对其进行分段,因为这需要外部库。

再一次,我需要将像“22/34”这样的值分成22和34,只使用iostream和iomanip。我有一些相当明显的方法可以忽略吗?有没有办法使用指针隐式转换?

2 个答案:

答案 0 :(得分:2)

你可以首先提取分母,然后是分离字符,然后是分母。

插图示例:

istream& operator>> (istream &in, Mixed &m) {
    int num, denom;
    char separ;

    in >> num;
    in.get(separ);
    if (separ != '/')
      in.setstate(ios::failbit);
    in >> denom;

    if (in) {
      // All extraction worked
      m.numerator = num;
      m.denominator = denom;
    }

    return in;
}

答案 1 :(得分:0)

  

再次,我需要分割一个像" 22/34"进入22和34,使用   只有iostream和iomanip。

你是不是只读了第一个整数,用get来获取下一个字符,然后读第二个整数?像这样:

#include <iostream>

int main() {
    using std::cin;
    using std::cout;

    int num;
    int den;

    while(cin) {
        cin >> num;
        if (cin.get() != '/') {
            // handle error
        }   
        cin >> den;

        cout << num << "/" << den << std::endl;
    }   

    return 0;
}

然后,您可以确保在两个整数之间读取的字符为'/',如果不是,则可以正确处理。