1

我想证明这样的输出文本

 0x29823d80    0x10019b8         /    0 00000000000000000000000000000001
 0x37449e60    0x10dfc           /   12 00000000000000000001000000000000

然而有了这个声明

  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";

我明白了:

0x29823d80    0x10019b8         /    0  00000000000000000000000000000001
0x37449e60    0x10dfc         /   12    00000000000000000001000000000000 
4

3 回答 3

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())
     << '/' ...

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

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

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

于 2012-10-31T13:57:54.660 回答
1

我知道这可能不是您所追求的,但请记住,这C主要是 的一个子集C++,并且您特别具有可用的函数 fprintf,它比C++I/O 工具更适合格式化简单的字符串和数字。有了这个,你只需写:

fprintf(file, "%10p %10p / %5d %d\n", it->addr, it->pc, it->off, it->layout);
于 2012-10-31T13:56:13.207 回答
1

如有疑问,请使用更多setw!此外,您可以使用setfill使数字看起来更漂亮:

std::cout << "0x"
          << std::hex << std::setfill('0') << std::setw(10) << (*it).addr
          << std::setw(5) << std::setfill(' ') << "0x"
          << std::hex << std::setfill('0') << std::setw(10) << (*it).pc
          << std::setw(10) << std::setfill(' ') << "/"
          << std::dec << std::setw(5) << (*it).off
          << std::setw(33) << (*it).layout
          << std::endl;

产生:

0x0029823d80   0x00010019b8         /    0 00000000000000000000000000000001
0x0037449e60   0x0000010dfc         /   12 00000000000000000001000000000000
于 2012-10-31T14:32:30.187 回答