如何将 warn() 的输出转换为字符串?

How do I get warn()'s output into a string?

本文关键字:转换 输出 字符串 warn      更新时间:2023-10-16

如果文件无法打开,我将使用非标准函数warn()(由BSD提供(输出错误消息,如下所示:

std::string path = get_path() ;
std::ifstream file(path) ;
if (file.is_open()) { /* do something */ }
else {
    warn("%s", path.c_str()) ;
    // uses errno to figure out what the error was and outputs it nicely along with the filename
}

这对输出它来说很好,但如果我想在其他地方使用整个字符串,除了打印它呢?warn()函数似乎没有将错误写入字符串的窗体。我试过推出自己的程序,但相比之下,它似乎非常麻烦(除了没有得到程序的名称(:

this->foo((boost::format("%s: %s") % path % strerror(errno)).str()) ;

那么,如何将warn()的输出作为字符串呢?

warn将其输出置于标准错误输出上。因此,您必须创建一种机制,将标准错误输出重定向到一个可以读回字符串的位置。最直接的方法可能是将标准错误重定向到一个文件,然后将该文件作为字符串读回。例如,您可以尝试使用dup2()来实现这一点(如本问题的答案所述(。

然而,包装自己版本的warn可能是更好的选择。不过,您可以考虑使用vsnprintf()函数来实现它。这个问题的答案可以同时使用boost::formatvsnprintf()来解决。

你说得对—没有sprintf模拟(即没有假设的swarn函数(。

你的方法似乎可行。

你的回转会产生类似于的结果

path + ": " +  strerror(errno);

据猜测,它所包含的"程序名称"可能只是argv[0],所以你显然可以生成一个大致相当于warn的名称,它只是返回一个std::string,其中包含以下一般顺序的内容:

std::string warn_s(std::string const &path) { 
    char *pname = strrchr(argv[0], '/');
    if (pname == NULL)
        pname = argv[0];
    return path + pname + ":  " + strerror(errno);
}

这里的主要困难是argvmain的本地数据,因此您可能需要将其保存到main中的可访问位置,或者使用一些非标准机制在函数中重新检索该数据。

不幸的是,我能找到的warn的文档非常糟糕,如果你想精确地复制它的输出,可能需要一些测试/试用和错误。