C++ 流运算符问题

标签 c++ csv stream

我想这对这里的所有专家来说可能是个简单的问题,但我不知何故无法找出答案。

我希望能够像这样简单地将 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/

相关文章:

javascript - 如何使用 “JavaScript enabled” 获取 HTML?

类中的 C++ 对象引用

c++ - 使用 auto、decltype、= 、[ ] 声明函数

java sql查询从csv文件导入的数据

php - 仅增加一个 PHP 页面的 Max_input_vars 限制

c# - 如何在 stream.read 中传递一个 long 作为偏移量?

.net - 我可以在 powershell 中执行此操作吗?读取注册表,将二进制内容写入文件

C++重复间接访问与直接访问

C++ - 组合复制/move 运算符和构造函数

php - 从 csv 文件中删除第一行并根据它创建表