首页 > 解决方案 > C++ 更改 istream

问题描述

我目前正在学习 C++,并且正在努力理解流。今天我学到了这个很酷的东西,你可以将一个字符串流拆分成多个浮点数/整数,比如:

#include <iostream>
#include <sstream>

using namespace std;

int main() {
    stringstream ss("1 2.2");
    int val1; float val2;
    ss >> val1 >> val2;
    cout << "val1: " << val1 << endl
         << "val2: " << val2;
    return 0;
}

现在,当我使用“1,2.2”代替“1 2.2”作为输入字符串时出现了一个问题,这类似于我从 csv 文件中得到的。我希望能够编写一些可以采用这样的 csv 字符串并将其转换为与上面示例中相同类型的流的东西。我想它看起来像

ss >> mySpecialPipe >> val1 >> val2;

现在我知道mySpecialPipe应该做几件事:

  1. 接受输入
  2. 拆分输入
  3. 在请求时写入输入

所以我试图建立这个:

#include <vector>
#include <string>
#include <iostream>
#include <sstream>

using namespace std;

class MySpecialPipe {
    private:
        char delimiter;
    public:
        vector<string> buffer;
        MySpecialPipe(char delimeter);
        friend istream& operator>> (istream &in, MySpecialPipe &p);
        friend istream& operator>> (MySpecialPipe &p, istream &in);
};

MySpecialPipe::MySpecialPipe(char delimeter): delimiter(delimeter) {}

istream& operator>> (istream &in,  MySpecialPipe &p)
{
    string s;
    while (getline(in, s, p.delimiter)) {
        p.buffer.push_back(s);
    }

    return in;
}

istream& operator>> (MySpecialPipe &p, istream &in) {
    for (string s: p.buffer) {
        // s >> in;
    }
    p.buffer.clear();
    return in;
}

int main() {
    MySpecialPipe p = MySpecialPipe(',');
    stringstream ss("1,2.2");
    stringstream ss2;
    ss >> p >> val1 >> val2;
}

如您所见,我已取消注释该行s >> in,因为编译器会抱怨,但本质上这就是我想要做的。这甚至可能吗?

如果你来了,谢谢你的时间,我期待你的回答。

标签: c++istream

解决方案


推荐阅读