用setw证明文本

mah*_*ood 1 c++ setw

我想证明这样的输出文本

 0x29823d80    0x10019b8         /    0 00000000000000000000000000000001
 0x37449e60    0x10dfc           /   12 00000000000000000001000000000000
Run Code Online (Sandbox Code Playgroud)

但是有了这个说法

  fout << std::setw(5) << std::hex << "0x" << (*it).addr << " " 
       << std::setw(5) << std::hex << "0x" << (*it).pc << std::setw(10) << "/" << std::setw(5) << std::dec << (*it).off << "\t" 
       << std::setw(5) << (*it).layout << "\n";
Run Code Online (Sandbox Code Playgroud)

我明白了:

0x29823d80    0x10019b8         /    0  00000000000000000000000000000001
0x37449e60    0x10dfc         /   12    00000000000000000001000000000000 
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 5

这个参考:

此值不是"粘性":受流宽度字段值影响的下一个输入或输出操作会将其重置为零(表示"未指定").

这意味着setw您所做的是字符串"0x"而不是实际的十六进制数.你必须setw 你想要证明的输出之前使用.

编辑:您的问题的一个解决方案是使用包含前导的临时字符串"0x",以及使用这些字符串的格式:

std::ostringstream val1, val2;

val1 << "0x" << std::hex << (*it).addr;
val2 << "0x" << std::hex << (*it).pc;

fout << val1.str() << " " << val2.str()
     << std::setw(10 + 10 - val2.str().length())
     << '/' ...
Run Code Online (Sandbox Code Playgroud)

10 + 10 - val2.str().length()我从上面得到的表达式:

  • 第一个10是因为你似乎想要在数字和斜线之间留出10个空格
  • 第二个10因为它允许8个十六进制数字(32位)加上前导"0x"
  • 调整数字字符串的实际长度

您可以在此处查看使用此方法的示例.