簡體   English   中英

在c ++中重載ifstream

[英]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;
}

處理輸入時,您需要確保同時讀取“+”和“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 + 3i\n4 + 5i\n";

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 << "i\n";
    }
}

這應該適合你:

#include <iostream>
#include <sstream>

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

注意:虛部和尾部i之前的空格正在打破輸入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM