c++ - 有没有一种好方法可以让函数在不使用 IOStream 库的情况下写入控制台、文件或内存缓冲区?

标签 c++

评论my answer here让我思考如何实现与 C++ 流相同的模式。具体来说,我需要能够拥有一个可以写入控制台、文件或字符串/内存缓冲区的函数。我不需要 IOStreams 提供的大部分格式化功能。是否有一些更好的设计可以允许这种在其他圈子中常用的惯用重定向?

例如 - 为了进行测试,我需要能够写入字符串,但对于实际程序使用,它总是会写入文件或控制台。

最佳答案

完全未经测试,但您明白了。

struct stdio_stream {
    enum { invalid_t, file_t, str_t } which;
    union {
        FILE *file_p;
        string *str_p;
    };

    int printf( char *fmt, ... );
    int scanf( char *fmt, ... );

    stdio_stream() : which( invalid_t ), file_p( NULL ) {};

     // etc
};

int stdio_stream::printf( char *fmt, ... ) {
    int ret;
    va_list args;
    va_start( args, fmt );

    if ( which == file_t ) {
        ret = vfprintf( file_p, fmt, args );
    } else if ( which == str_t ) {
        string_p->resize( vsnprintf( NULL, 0, fmt, args )+1, '\0' );
        ret = vsnprintf( &* string_p->begin(), string_p->size(), fmt, args );
    } else throw runtime_error( "uninitialized stream" );

    va_end( args );
    return ret;
}

就我个人而言,我认为 iostream 非常棒。如果我需要快速进行,我会编写一个快速解析器。 printf 仍有很大的速度提升空间……我想这是一个很好的中间立场,但仍然只是一个折衷方案。

关于c++ - 有没有一种好方法可以让函数在不使用 IOStream 库的情况下写入控制台、文件或内存缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3593332/

相关文章:

c++ - QT QTableWidget::item() 返回 nullptr,即使 widget 分配给它

c++ - 在 C++11 中查找和访问优先级队列中的元素

java - Linux 中的 SMTP/POP3 客户端

c# - 将字符串从 C# 传递到 C++ DLL 并返回——最小示例

c++ - 在 COM IDL 中如何从 COM 依赖引用枚举?

c++ - 当用户定义的 dll 引用另一个用户定义的 dll 时出现链接器错误

c++ - 数组初始化函数 : Passing Array as Pointer: C++

c++ - 在用户定义的类 C++ 中重载下标运算符

c++ - 在 STL 容器中存储 OpenCV Mat 对象时避免内存泄漏

c++ - CFLAGS 并分配多个引用?