首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用setw对齐文本

使用setw对齐文本
EN

Stack Overflow用户
提问于 2012-10-31 21:51:13
回答 3查看 632关注 0票数 1

我想像这样调整输出文本

代码语言:javascript
复制
 0x29823d80    0x10019b8         /    0 00000000000000000000000000000001
 0x37449e60    0x10dfc           /   12 00000000000000000001000000000000

但是,使用下面的语句

代码语言:javascript
复制
  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";

我明白了:

代码语言:javascript
复制
0x29823d80    0x10019b8         /    0  00000000000000000000000000000001
0x37449e60    0x10dfc         /   12    00000000000000000001000000000000 
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-31 21:57:55

来自this reference

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

这意味着您执行的setw是针对字符串"0x"的,而不是实际的十六进制数。你必须在你想要对齐的输出之前使用setw

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

代码语言:javascript
复制
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的示例。

票数 5
EN

Stack Overflow用户

发布于 2012-10-31 21:56:13

我知道这可能不是您想要的,但是请记住,C主要是C++的一个子集,并且您特别有可用的函数fprintf,它比C++ I/O工具更适合格式化简单的字符串和数字。使用此命令,您可以简单地编写:

代码语言:javascript
复制
fprintf(file, "%10p %10p / %5d %d\n", it->addr, it->pc, it->off, it->layout);
票数 1
EN

Stack Overflow用户

发布于 2012-10-31 22:32:30

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

代码语言:javascript
复制
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;

产生:

代码语言:javascript
复制
0x0029823d80   0x00010019b8         /    0 00000000000000000000000000000001
0x0037449e60   0x0000010dfc         /   12 00000000000000000001000000000000
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13159545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档