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

时间:2015-09-23 09:53:12

标签: c++ windows string exception append

我正在编写一个代码,我需要通过向其添加数据来创建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 但它在某处失败了。
我需要检查什么条件?

1 个答案:

答案 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)时才写入光盘。