выровнять текст с помощью setw

Я хочу обосновать вывод текста, как это

 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

1

Решение

От эта ссылка:

Это значение не является «липким»: следующая операция ввода или вывода, на которую влияет значение поля ширины потока, сбрасывает его в ноль (что означает «не указано»).

Это означает, что 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"
  • Отрегулируйте для фактической длины строки номера

Вы можете увидеть пример, используя этот метод Вот.

5

Другие решения

Я знаю, что это может быть не то, что вы после, но помните, что C в основном подмножество C++и что у вас, в частности, есть функция fprintf, которая гораздо больше подходит для форматирования простых строк и чисел, чем C++ Средства ввода / вывода. При этом вы просто напишите:

fprintf(file, "%10p %10p / %5d %d\n", it->addr, it->pc, it->off, it->layout);
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
1
По вопросам рекламы [email protected]