c++ - 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
应该做几件事:
- 接受输入
- 拆分输入
- 在请求时写入输入
所以我试图建立这个:
#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
,因为编译器会抱怨,但本质上这就是我想要做的。这甚至可能吗?
如果你来了,谢谢你的时间,我期待你的回答。
解决方案
推荐阅读
- azure - 在浏览器中缓存 Azure 提供的图像
- python-3.x - 字节和 base64 格式 (Python3)
- python - Python3:自定义排序
- google-cloud-platform - GCE 仅显示 ~15% 的使用率,但顶部显示 ~99%
- c - 如何使 SDL_ttf 与 SDL2 一起工作?
- javascript - 为什么 JS 不从 Jinja 读取数据?
- javascript - 为什么我的汉堡菜单在单击时没有打开?
- c++ - unique_ptr
构造函数要求 Deleter 不抛出 - python - 线性回归速度增加
- python - 使用 numpy 查找 True 值垂直和水平连接的索引