Russian Qt Forum

Qt => Общие вопросы => Тема начата: Гурман от Январь 14, 2014, 10:34



Название: в QTextStream у HEX чисел как ведущие ноли вывести?
Отправлено: Гурман от Январь 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() работают по-другому


Название: Re: в QTextStream у HEX чисел как ведущие ноли вывести?
Отправлено: Old от Январь 14, 2014, 10:52
Почитайте про манипуляторы для потоков и ваша жизнь сильно упроститься. :)


Название: Re: в QTextStream у HEX чисел как ведущие ноли вывести?
Отправлено: Гурман от Январь 14, 2014, 11:16
читал, они все через setЧегоНибудь() работают, и подходящего для заполнения 0-ми шестнадцатиричных чисел нет


Название: Re: в QTextStream у HEX чисел как ведущие ноли вывести?
Отправлено: Old от Январь 14, 2014, 11:47
Вам нужно установить длину поля width( 8 ) и установить заполнитель fill( '0' ).
С помощью манипуляторов это делается очень быстро.


Название: Re: в QTextStream у HEX чисел как ведущие ноли вывести?
Отправлено: Kurles от Январь 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();
}
}


Название: Re: в QTextStream у HEX чисел как ведущие ноли вывести?
Отправлено: Гурман от Январь 14, 2014, 12:21
базу менять не удобно, манипулятора для width и fill нет, начинает заполнять любые выводимые данные, значит надо менять до и после вывода, а с showbase получается вообще полная ерунда

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

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


Название: Re: в QTextStream у HEX чисел как ведущие ноли вывести?
Отправлено: Old от Январь 14, 2014, 12:29
манипулятора для width и fill нет
Как это нет? Есть.


Название: Re: в QTextStream у HEX чисел как ведущие ноли вывести?
Отправлено: Гурман от Январь 14, 2014, 12:35
а, да есть, но не удобно все равно, и showbase работает криво, вариант QString лучше, хотя тоже не идеально, при изменении базы приходится самому выводить её обозначение

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


Название: Re: в QTextStream у HEX чисел как ведущие ноли вывести?
Отправлено: Old от Январь 14, 2014, 12:41
Можно свой манипулятор написать.


Название: Re: в QTextStream у HEX чисел как ведущие ноли вывести?
Отправлено: Johnik от Январь 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"