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

rah*_*man 5 c++ stringstream

我正在编写一个自定义记录器,我将日志消息缓冲在 a 中,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;
}
Run Code Online (Sandbox Code Playgroud)

问题:在我看来,每当我调用此方法时,它都会seekg从头到尾开始计算字节数,并使用tellg. 我想出这个设计首先是为了节省一些 IO 时间,但是:这种连续计数是否会带来更大的成本(如果在大多数情况下调用此方法的次数很高并且日志消息很小) )?

有一个更好的方法吗?

还有一个附带问题:1MB在当今的普通计算机中,缓冲区大小是一个很好的数字吗?

谢谢

R S*_*ahu 5

您只需使用即可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();
}
Run Code Online (Sandbox Code Playgroud)

输出:

0
1
13
18
你好,世界3.14