我想这可能是所有这里的大师的简单问题,但我以某种方式找不到答案.
我想要能像csv这样简单地编写csv单元格:
stream << 1 << 2 << "Tom" << std::endl;
这将创造出输出像1,2,汤姆.我该如何实现呢?我想我需要创建自定义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”识别为表示新记录的开始 – 例如,字符串文字中的换行符将不起作用.