如何跟踪std :: stringstream中的当前位置

时间:2014-07-17 05:22:16

标签: c++ stringstream

我正在编写一个自定义记录器,我在std::stringstream中缓冲我的日志消息,并在std::ofstream足够大时将其刷新到文件(std::stringstream)(以节省一些IO)潜伏) 。由于std::stringstream没有.size()方法,我使用seekgtellg

template <typename T>
MyClass & operator<< (const T& val)
{
    boost::unique_lock<boost::mutex> lock(mutexOutput);
    output << val;  //std::stringstream output;
    output.seekg(0, std::ios::end);
    if(output.tellg() > 1048576/*1MB*/){
        flushLog();
    }
    return *this;
}

问题: 在我看来,每当我调用此方法时,它使用seekg开始计算从开头一直到结尾的字节,并使用tellg获取大小。我想出了这个设计以节省一些IO时间,但是:这不是连续计数会产生更大的成本(如果对这种方法的调用次数很高而且日志消息很小,就像在大多数情况下一样) )?

有更好的方法吗?

还有一个侧面问题:1MB是否是现今正常计算机中缓冲区大小的一个很好的数字?

谢谢

1 个答案:

答案 0 :(得分:2)

您可以使用ostringstream::tellp()来获取字符串的长度。这是一个取自http://en.cppreference.com/w/cpp/io/basic_ostream/tellp的例子。

#include <iostream>
#include <sstream>
int main()
{
    std::ostringstream s;
    std::cout << s.tellp() << '\n';
    s << 'h';
    std::cout << s.tellp() << '\n';
    s << "ello, world ";
    std::cout << s.tellp() << '\n';
    s << 3.14 << '\n';
    std::cout << s.tellp() << '\n' << s.str();
}

输出:

0
1
13
18
hello, world 3.14