file io - Overload ifstream in c++



我正试图从一个看起来像这样的文件中读取形式x + y* I的复数:

2 + 3i
4 + 5i

如果我像这样实现它,它只适用于第一行,我希望能够以同样的方式再次读取第二行。什么好主意吗?

istream& operator>>(istream& in, Complex& c) {
    in >>  c.r >> c.i;
    return in;
}

编辑:不要直接抛出异常,因为这不是iostreams通常的处理方式。

编辑:单独处理符号字符,以便允许输入中的空格。

一个快速而肮脏的解决方案:

istream& operator>>(istream& in, Complex& c)
{
    char sign;
    char suffix;
    in >> c.r >> sign >> c.i >> suffix;
    if ((sign != '+' && sign != '-') || suffix != 'i') {
        in.setstate(ios::failbit);
    }
    if (sign == '-') {
        c.i = -c.i;
    }
    return in;
}

您需要确保在处理输入时同时读取"+"one_answers"i"。

下面的实现可以工作:

struct complex
{
    double r;
    double i;
};
std::istream& operator>>(std::istream& in, complex& c)
{
    char plus, i;
    in >> c.r >> plus >> c.i >> i;
    return in;
}
std::string initdata = "2 + 3in4 + 5in";
int main()
{
    std::stringstream ss(initdata);
    std::vector<complex> values;
    std::istream_iterator<complex> begin(ss), end;
    std::copy(begin, end, std::back_inserter<std::vector<complex>>(values));
}

我会这样做:

#include <iostream>
struct complex
{
    int r, i;
};
int main ()
{
    complex co;
    char c;
    while ((std::cin >> co.r >> c /* '+' */ >> co.i >> c /* 'i' */))
    {
        std::cout << co.r << ' ' << co.i << "in";
    }
}

这应该可以为您工作:

#include <iostream>
#include <sstream>
int main(int argc, char *argv[])
{
    std::istringstream s(
        "2 + 3in"
        "4 + 5in"
    );
    char sgn;
    double r;
    double i;
    while(s >> r >> sgn >> i) {
        if(s.get() != 'i') {
            std::cerr << "Missing in";
            return -1;
        }
        std::cout << r << sgn << i << "in";
    }
    return 0;
}

注意:虚数部分前的空格和后面的i将打断输入

相关内容

  • 没有找到相关文章

最新更新