2012-10-31 19 views
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 

回答

5

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一個例子。

+0

但是這可能會導致'0x'與數字分開。我的意思是用'setw(5)'我們有'0x12345'和'0x 345' – mahmood

+0

@mahmood然後你還需要根據十六進制數字的位數來調整填充。請參閱我的修改答案。 –

1

我知道這可能不是成爲你後,但請記住,C大部分是C++的子集,特別有fprintf可用的功能,它比I/O設備更適合格式化簡單的字符串和數字。有了這個,你就簡單的寫:

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

然而當我在尋找解決辦法''<< – mahmood

+0

很好。但總的來說,最好記住你擁有整個'C'工具箱,並且在使用最適合該任務的工具箱時務實,而不是堅持使用「C++」 - 僅僅是子集。 – amaurea

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 
相關問題