如何检查string :: append()是否会失败

我写了一个代码,我需要通过附加数据来创build一个std::string (这里的数据意味着应用程序的日志)。 但是string也有其大小的限制。 我在try-catch块中写了代码,当append()失败时,它会抛出exception。 我需要在append()之前检查是否附加新的string会导致任何exception ,因为一旦抛出exception,它将清除string中的数据。
我想检查,如果附加新的string将导致任何exception,如果是的话,然后将数据写入文件,并清除下一个input的string。
由于这是一个应用程序日志,我不知道最终的大小是什么。 所以我正在努力使代码不易受上面解释的问题的影响。
我已经检查了一个条件如下:
如果“ current_string_size + to_be_attached_string_size exceeds string.max_size() ”,那么将代码写入文件。
如果“不”,则将to_be_attached_string附加到current_string。
但它在某处失败。
我需要检查什么条件?

使用C ++ 11,并简单地把你的string::append()尝试放入try catch (就像你最初一样)。 如果由于某种原因引发了一个异常,这个函数不起作用(强烈的异常保证) ,与您的意见相反(“因为一旦抛出异常,它将清除字符串中的数据”)或C ++ 11之前。

 std::string orig, to_append; try { orig.append(to_append); } catch(...) { write_to_file(orig); orig = std::move(to_append); } 

然而,将一个日志写入一个string是没有意义的(除非你想从同一个程序中读取该string ,但是这不再是一个日志)。 遵循Peter Eke的建议,直接写入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 )写入磁盘,就会写入磁盘。