我想像这样调整输出文本
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 发布于 2012-10-31 21:57:55
来自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位)加上数字字符串的实际长度的前导空格
您可以看到一个使用此方法here的示例。
发布于 2012-10-31 21:56:13
我知道这可能不是您想要的,但是请记住,C主要是C++的一个子集,并且您特别有可用的函数fprintf,它比C++ I/O工具更适合格式化简单的字符串和数字。使用此命令,您可以简单地编写:
fprintf(file, "%10p %10p / %5d %d\n", it->addr, it->pc, it->off, it->layout);发布于 2012-10-31 22:32:30
如果有疑问,可以使用更多的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 00000000000000000001000000000000https://stackoverflow.com/questions/13159545
复制相似问题