加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C流运算符问题

发布时间:2020-12-16 05:50:51 所属栏目:百科 来源:网络整理
导读:我想这可能是所有这里的大师的简单问题,但我以某种方式找不到答案. 我想要能像csv这样简单地编写csv单元格: stream 1 2 "Tom" std::endl; 这将创造出输出像1,2,汤姆.我该如何实现呢?我想我需要创建自定义streambuf(因为我不认为这是在流级别上执行的正确方
我想这可能是所有这里的大师的简单问题,但我以某种方式找不到答案.

我想要能像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”识别为表示新记录的开始 – 例如,字符串文字中的换行符将不起作用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读