【问题标题】:justify text with setw使用 setw 对齐文本
【发布时间】:2012-10-31 13:51:13
【问题描述】:

我想像这样证明输出文本的合理性

 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 

【问题讨论】:

    标签: c++ setw


    【解决方案1】:

    来自this reference

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

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

    您可以查看使用此方法的示例here

    【讨论】:

    • 但这可能会导致0x 与号码分开。我的意思是setw(5) 我们有0x123450x 345
    • @mahmood 然后你还需要根据十六进制数的位数调整填充。请查看我修改后的答案。
    【解决方案2】:

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

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

    【讨论】:

    • 但我正在寻找&lt;&lt;的解决方案
    • 很好。但总的来说,最好记住你有整个 C 工具箱可用,并且要务实地使用最适合该任务的工具箱,而不是坚持使用 C++-only 子集的原教旨主义者。
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-26
      • 1970-01-01
      • 2022-08-15
      • 2015-03-25
      • 2014-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多