【问题标题】:Equivalent of formatted printf (c) to formatted cerr in C++格式化的 printf (c) 等价于 C++ 中的格式化 cerr
【发布时间】:2013-05-29 16:30:35
【问题描述】:

我想要 C++ 中 printf("%2.2x", var);cerr<< 的等价物。
代码:

typedef unsigned char byte;  
static byte var[10];  
for(i=1; i<10; i++)  
   printf("%2.2x", var[i]);

这个想法是将调试重定向到这样的文件:./myprog 2&gt;out.txt
如果我不问太多,我也希望得到解释。
谢谢!

【问题讨论】:

  • 请注意,您可能不是有意使用static 来声明您的数组。

标签: c++ c printf


【解决方案1】:

使用fprintf(stderr, ...),例如:

fprintf(stderr, "%2.2x", var[i]);

【讨论】:

  • 如果fprintf(stderr,...)std::cerr 都被使用了,它们会在同一个缓冲区中很好地配合使用吗?
  • IIRC stderrcerr 应该是无缓冲的,并且默认情况下同步是打开的。应该没问题。
【解决方案2】:

您可以使用 C++ 中的流操作符来执行此操作,例如:

#include <iostream>
#include <iomanip>
...
std::cerr << std::hex << std::setw(2) << std::setprecision(2) << (int)var[i];

认为setw 在这里是正确的,但可以试一试,这里列出了更多:http://www.cplusplus.com/reference/iomanip/

【讨论】:

  • printf("%2.2x", var[i]); 不同。您应该在打印之前将 var[i] 转换为 int。否则将打印字符,而不是十六进制表示。
  • 这个方法打印出一些我没想到的空格
  • 这可能是因为 setw。尝试一下这些选项,因为我已经有一段时间没有使用它了。
【解决方案3】:

另一种方式是使用boost::format:

std::cerr << boost::format("%2.2x") % static_cast<int>(var[i]);

【讨论】:

  • 我没见过这个。 C 样式格式化程序的所有熟悉,加上一些实际的运行时类型安全?整洁。
【解决方案4】:
#include <iostream>
#include <iomanip>

void show_a_byte(unsigned char val) {
    std::ostream out(std::cerr.rdbuf());
    out << std::hex << std::setw(2) << std::setprecision(2)
        << static_cast<unsigned int>(val);
}

我使用了一个临时的ostream 共享cerr 的缓冲区,以确保没有一个操纵器在cerr 上留下不希望的副作用。 static_cast 是必需的,因为当 ostream 获得(signedunsigned 或普通)char 时,它认为可以将其复制为原始字节。

【讨论】:

  • 请注意,您还需要#include &lt;iomanip&gt; 才能使用 setw()。
  • 谢谢@AlexisWilke。已编辑。
猜你喜欢
  • 1970-01-01
  • 2019-07-01
  • 2010-10-06
  • 2011-02-06
  • 2021-12-04
  • 2011-03-18
  • 2021-05-17
  • 1970-01-01
  • 2020-05-10
相关资源
最近更新 更多