gpt4 book ai didi

c++ - 限制文件流的文件大小?

转载 作者:行者123 更新时间:2023-11-30 02:50:07 25 4
gpt4 key购买 nike

我的应用程序目前以一种非常简单的方式登录:

void Log::create( const std::string& path, bool append )
{
if(append)
m_log.open(path.c_str(),std::ios_base::out | std::ios_base::app);
else
m_log.open(path.c_str(),std::ios_base::out | std::ios_base::trunc);
}

std::ofstream& Log::get()
{
return m_log;
}

void Log::write( const std::string& what )
{
get() << "[" << TimeOfDay::getDate() << "] ";
get() << what << std::endl;
}

void Log::write( const std::string& where, const std::string& what )
{
get() << "[" << TimeOfDay::getDate() << "] ";
get() << "[" << where << "] " << what << std::endl;
}

std::ofstream& Log::write()
{
get() << "[" << TimeOfDay::getDate() << "] ";
return get();
}

std::ofstream Log::m_log;

此应用程序在服务器上运行。现在,如果日志超过某个文件大小,我想停止记录。

有没有办法在没有 boost 或其他库的情况下做到这一点?

谢谢

最佳答案

您可以创建一个过滤流缓冲区,它被设置为写入一个文件,但如果写入的数据超过指定数量则停止写入。像这样:

class limitbuf
: public std::streambuf {
std::streambuf* sbuf;
size_t size;
size_t limit;
char buffer[1024];
public:
limitbuf(std::streambuf* sbuf, size_t limit)
: sbuf(sbuf), limit(limit), size(0)
{
this->setp(buffer, buffer + 1023);
}
int overflow(int c) {
if (c != std::char_traits<char>::eof()) {
this->pptr() = std::char_traits<char>::to_char_type(c);
this->pbump(1);
}
return this->sync() == 0
? std::char_traits<char>::not_eof(c)
: std::char_traits<char>::eof();
}
int sync() {
if (this->size < limit) {
this->size += this->sbuf->sputn(this->pbase(),
std::min(
size_t(this->pptr() - this->pbase()),
this->limit - this->size)
);
this->sbuf->pubsync();
}
this->setp(this->pbase(), this->epptr());
return 0;
}
};

只需将此流缓冲区作为过滤器安装到您的日志文件中,它应该被限制为一些合适的大小:

std::ofstream out("some.log", 16384);
limitbuf sbuf(out.rdbuf());
std::ostream log(&sbuf);

这个流缓冲区的基本思想相当简单:数据是内部缓冲区,并在缓冲区溢出或刷新时写入:

  • 当缓冲区设置为setp()时溢出流调用 overflow(c)与下一个要写入的字符(或者,可能与 std::char_traits<char>::eof() )。由于 te 流缓冲区被告知缓冲区比实际可用的小一个字符,溢出的字符被添加到缓冲区并且整个缓冲区被刷新。
  • 当缓冲区被刷新时(例如,通过在 std::endl 上使用 std::ostream 写入此缓冲区)函数 sync()最终被调用。它只是写入当前缓冲的字符。该代码只是查看是否还有空间可以写入任何内容,如果有可用空间则写入该字符。 size成员维护写入了多少个字符和limit设置为指示要写入多少数据。

如果流缓冲区不只是限制输出,那么如果没有更多空间,可能需要修改正在发生的事情的逻辑。例如,如果有无法写入的遗留字符,流缓冲区可能会决定打开一个新文件(并可能移动其他文件)。

关于c++ - 限制文件流的文件大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20691689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com