我正在编写一个代码,我需要通过向其添加数据来创建std::string
(此处数据表示应用程序的日志)。但是字符串也有其大小限制。我在try-catch
块中编写了代码,当append()
失败时,它会抛出异常。我需要在append()
之前检查是否附加新字符串会导致任何exception
,因为一旦抛出异常,它就会清除字符串中的数据。
我想检查附加新字符串是否会导致任何异常,如果是,则将数据写入文件并清除字符串以进行下一次输入。
由于它是一个应用程序日志,我不知道最终的大小。因此,我试图使代码不易受到上述问题的影响
我检查了一个条件如下:
如果“current_string_size + to_be_attached_string_size exceeds string.max_size()
”则将代码写入文件
如果“not”,则将to_be_attached_string附加到current_string
但它在某处失败了。
我需要检查什么条件?
答案 0 :(得分:2)
使用C ++ 11,只需将string::append()
尝试放入 try catch
阻止(就像您最初那样)。 If an exception is thrown for any reason, this function has no effect (strong exception guarantee),与您的意见相反(“因为一旦抛出异常,它就会清除字符串中的数据”)或预先C ++ 11。
std::string orig, to_append;
try {
orig.append(to_append);
} catch(...) {
write_to_file(orig);
orig = std::move(to_append);
}
然而,将日志写入string
是没有意义的(除非您想从同一程序中读取string
,但这不再是日志)。
根据{{3}}的建议,直接写入std::ofstream
更有意义:
void add_to_log(std::string const&msg, bool flush=false)
{
static std::ofstream logfile;
if(!logfile)
logfile.open("logfile.txt");
logfile << msg;
if(flush) logfile << std::flush;
}
std::ofstream
无论如何都会缓冲输出,即只有在缓冲区变满或者强制它(通过flush
)时才写入光盘。