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 
4

3 に答える 3

5

この参照から:

この値は「スティッキー」ではありません。ストリームの width フィールドの値の影響を受ける次の入力操作または出力操作では、値がゼロにリセットされます (「指定されていない」ことを意味します)。

これは、実際の16進数ではなく、setw文字列に対するものであることを意味します。正当化したい出力の直前"0x"に使用する必要があります。setw

編集:問題の解決策の 1 つは、先頭の を含む一時的な文字列を使用し"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個のスペースが必要なようです
  • 2 番目10は、8 桁の 16 進数 (32 ビット) と先頭の"0x"
  • 数値文字列の実際の長さを調整します

このメソッドを使用した例をここで見ることができます。

于 2012-10-31T13:57:54.660 に答える
1

Cこれはあなたが求めているものではないかもしれませんが、それは主に のサブセットであり、特に関数 fprintf が利用可能であることを覚えておいてください。これは、 I/O 機能C++よりも単純な文字列や数値のフォーマットに適しています。C++これを使用すると、次のように簡単に記述できます。

fprintf(file, "%10p %10p / %5d %d\n", it->addr, it->pc, it->off, it->layout);
于 2012-10-31T13:56:13.207 に答える
1

疑わしい場合は、もっと使用してくださいsetwsetfillまた、数字をきれいに見せるために使用できます。

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
于 2012-10-31T14:32:30.187 に答える