如何将 warn() 的输出转换为字符串?
How do I get warn()'s output into a string?
如果文件无法打开,我将使用非标准函数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::format
和vsnprintf()
来解决。
你说得对—没有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);
}
这里的主要困难是argv
是main
的本地数据,因此您可能需要将其保存到main中的可访问位置,或者使用一些非标准机制在函数中重新检索该数据。
不幸的是,我能找到的warn
的文档非常糟糕,如果你想精确地复制它的输出,可能需要一些测试/试用和错误。
相关文章:
- 通过构造函数方法输出的类到类类型转换是 5500 为什么不是 5555
- 在插入容器之前转换输出迭代器
- 字符数组到十六进制字符串的转换 - 意外输出
- 将ctypes c_void_p强制转换为c输出参数
- 使用递归函数 (c++) 将长字符串转换为整数时输出错误
- 输出使用 cout 转换为 ASCII 的文本时输出格式不正确,C++
- 输入 1024 后十进制到二进制转换的输出错误?
- 无效* 转换获得意外输出
- 有没有一种简单的方法可以将矢量 int 集转换为字符串输出?
- 是否可以转换 c++ 运算符新输出?
- 为什么我的C++程序输出不同的数字来将米转换为英尺?
- 为什么给我输出 2 我使用类型转换?
- 使用 iconv 进行 UTF8 转换的输出不正确
- 如何将 Openh264 解码帧无延迟输出格式转换为 OpenCV 矩阵
- 我将 c++ 矢量数据集转换为 c 数组.我将相同的数据集传递到一个应该给出相同输出的函数中
- strtoull() 的输出在转换为双精度然后又转换为 uint64_t 时会失去精度
- 为什么当我在MD5 Hash中转换相同的C 字符串时,每次都会获得不同的输出
- 在 C++ 中从字符串转换为常量字符*时出现奇怪的输出
- 如何获得一个循环来在屏幕c++上转换输出
- 意外的大端转换输出