证明与运输及工务局局长文(justify text with setw)

2019-10-17 08:26发布

我想输出文本像这样的辩解

 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 

Answer 1:

从这个参考 :

此值是不“发粘”:下一个输入或输出操作是由该流的宽度字段的值的影响,因此复位至零(意为“未指定”)。

这意味着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"
  • 调整为数字字符串的实际长度

您可以使用这种方法看到一个例子在这里 。



Answer 2:

我知道这可能不是你所追求的,但请记住, C大多的一个子集C++ ,而且你特别具备的功能fprintf中可用,这是一个用于格式化简单的字符串和数字比更适合C++的I / O设备。 有了这个,你就简单的写:

fprintf(file, "%10p %10p / %5d %d\n", it->addr, it->pc, it->off, it->layout);


Answer 3:

有疑问时,可以使用更多的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


文章来源: justify text with setw
标签: c++ setw