Я хочу обосновать вывод текста, как это
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
От эта ссылка:
Это значение не является «липким»: следующая операция ввода или вывода, на которую влияет значение поля ширины потока, сбрасывает его в ноль (что означает «не указано»).
Это означает, что 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"
Вы можете увидеть пример, используя этот метод Вот.
Я знаю, что это может быть не то, что вы после, но помните, что C
в основном подмножество C++
и что у вас, в частности, есть функция fprintf, которая гораздо больше подходит для форматирования простых строк и чисел, чем C++
Средства ввода / вывода. При этом вы просто напишите:
fprintf(file, "%10p %10p / %5d %d\n", it->addr, it->pc, it->off, it->layout);
Если есть сомнения, используйте больше 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