Russian Qt Forum
Ноябрь 25, 2024, 00:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: в QTextStream у HEX чисел как ведущие ноли вывести?  (Прочитано 5930 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Январь 14, 2014, 10:34 »

в лог пишу:

Код:
void MainWindow::writeLog( char prefix, char data )
{
if( LogFileName != "" )
{
QFile log( LogFileName );
if( ! log.open( QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text ) )
return;
QTextStream out( &log );
out.setNumberFlags( QTextStream::ShowBase | QTextStream::UppercaseDigits );
out.setIntegerBase( 16 );
out << prefix;
out << (int) data;
out << "\n";
log.close();
}
}

числа выводятся без ведущих 0, выглядит нехорошо

а еще желательно выводить в двоичном виде, чтобы легко с осциллограммой сравнивать, там уже вед. 0 обязательны

в описании включения вед. 0 не нашел, а setFieldWidth() с setPadChar() работают по-другому
Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Январь 14, 2014, 10:52 »

Почитайте про манипуляторы для потоков и ваша жизнь сильно упроститься. Улыбающийся
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Январь 14, 2014, 11:16 »

читал, они все через setЧегоНибудь() работают, и подходящего для заполнения 0-ми шестнадцатиричных чисел нет
Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Январь 14, 2014, 11:47 »

Вам нужно установить длину поля width( 8 ) и установить заполнитель fill( '0' ).
С помощью манипуляторов это делается очень быстро.
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #4 : Январь 14, 2014, 12:19 »

Я бы сделал примерно так:
Код
C++ (Qt)
void MainWindow::writeLog( char prefix, char data )
{
if( LogFileName != "" )
{
QFile log( LogFileName );
if( ! log.open( QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text ) )
return;
QTextStream out( &log );
               out << QString("%0%1").arg(prefix).arg(data, 2, 16, QChar('0'));
log.close();
}
}
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #5 : Январь 14, 2014, 12:21 »

базу менять не удобно, манипулятора для width и fill нет, начинает заполнять любые выводимые данные, значит надо менять до и после вывода, а с showbase получается вообще полная ерунда

фигово, явно недопродумано... лучше тогда уж в QString форматировать и ее выводить, хотя тоже не удобно

а, ну вот пока ответ писал, как раз QString и предложили
Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Январь 14, 2014, 12:29 »

манипулятора для width и fill нет
Как это нет? Есть.
« Последнее редактирование: Январь 14, 2014, 12:32 от Old » Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #7 : Январь 14, 2014, 12:35 »

а, да есть, но не удобно все равно, и showbase работает криво, вариант QString лучше, хотя тоже не идеально, при изменении базы приходится самому выводить её обозначение

всё, можно закрыть тему
Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Январь 14, 2014, 12:41 »

Можно свой манипулятор написать.
Записан
Johnik
Крякер
****
Online Online

Сообщений: 339


Просмотр профиля
« Ответ #9 : Январь 14, 2014, 12:47 »

Пример:

Код
C++ (Qt)
#include <QtCore/qmath.h>
 
#define BITS_PER_BYTE 8
#define C_LN2 0.693147180559945309417
 
template <typename TNumberType>
static QString format(TNumberType n, int base = 10)
{
int bitsPerDigit = qLn(static_cast<qreal>(base)) / C_LN2;
int digits = sizeof(n) * BITS_PER_BYTE / bitsPerDigit;
 
QString result = QString::number(n, base);
result.prepend(QString(digits - result.length(), '0'));
return result;
}
 
int main(int argc, char *argv[])
{
qDebug() << format(10, 16);
return 0;
}

Только надо не забыть предусмотреть форматирование отрицательных чисел, а то может получиться нечто вроде:
format(-10, 10) => "0000000-10"


« Последнее редактирование: Январь 14, 2014, 12:50 от Johnik » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.295 секунд. Запросов: 22.