代码之家  ›  专栏  ›  技术社区  ›  Billy ONeal IS4

是否有一种好的方法可以让函数不使用iostream库就可以写入控制台、文件或内存缓冲区?

c++
  •  0
  • Billy ONeal IS4  · 技术社区  · 14 年前

    评论 my answer here 让我思考如何实现与C++流相同的模式。具体来说,我需要能够有一个可以写入控制台、文件或字符串/内存缓冲区的函数。我不需要大多数格式设置功能,这样iostreams就可以提供。有一些吗? 更好的 设计哪种类型的重定向允许惯用地在其他圆中使用?

    例如 -对于测试,我需要能够写入一个字符串,但是对于真正的程序使用,它总是指向一个文件或控制台。

    2 回复  |  直到 14 年前
        1
  •  2
  •   Potatoswatter    14 年前

    完全没有经过测试,但你明白了。

    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 我想这是一个不错的中间地带,但仍然只是一个妥协。

        2
  •  0
  •   BarsMonster    14 年前

    好吧,您可以使用“con”文件名将控制台作为一个文件写入,我相信这就是我们所能做的一切,而不必考虑iostream的使用复杂性。