我想这对这里的所有专家来说可能是个简单的问题,但我不知何故无法找出答案。
我希望能够像这样简单地将 csv 单元格写入流:
stream << 1 << 2 << "Tom" << std::endl;
这将创建像 1,2,Tom 这样的输出。我怎样才能做到这一点?我认为我需要创建自定义 streambuf(因为我认为这不是在流级别上执行此操作的正确方法,只是为所有类型重载 << 真的很痛苦)但我不确定如何 << 通常实现。它叫 put 还是 write 还是什么。我应该覆盖那些还是什么?还是我完全错过了什么?
如果有任何帮助,我将不胜感激:)
干杯,
最佳答案
完成 98% 的事情并不难:
#include <iostream>
class add_comma {
std::ostream &os;
bool begin;
typedef add_comma &ref;
public:
add_comma(std::ostream &o) : os(o), begin(true) {}
template <class T>
ref operator<<(T const &t) {
if (!begin)
os << ",";
os << "\"" << t << "\"";
begin = false;
return *this;
}
ref operator<<(std::ostream &manip(std::ostream &o) ) {
if (&manip == &std::endl)
reset();
manip(os);
return *this;
}
void reset() { begin = true; }
operator void *() { return (void *)os; }
};
int main() {
add_comma a(std::cout);
a << 1 << 2 << "This is a string" << std::endl;
a << 3 << 4 << "Another string" << std::endl;
return 0;
}
编辑:我至少在某种程度上修复了代码——它现在只在写入的项目之间放置逗号,而不是在一行的开头。但是,它仅将“endl”识别为表示新记录开始的信号——例如,字符串文字中的换行符将不起作用。
关于C++ 流运算符问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2376446/