我目前正在学习 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;
}
Run Code Online (Sandbox Code Playgroud)
现在出现了一个问题,当我使用“1,2.2”代替“1 2.2”作为输入字符串时,这类似于我从 csv 文件中得到的内容。我希望能够编写一些内容,将这样的 csv 字符串转换为与上面示例中相同类型的流。我想它看起来像
ss >> mySpecialPipe >> val1 >> val2;
Run Code Online (Sandbox Code Playgroud)
现在我知道mySpecialPipe应该做几件事:
所以我试图建立这个:
#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;
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我取消了该行的注释s >> in,因为编译器会抱怨,但基本上这就是我想要做的。这甚至可能吗?
如果你到了这里,谢谢你的时间,我期待着你的回答。