Проблема с форматированием QTextStream

Я пытаюсь использовать QTextStream отформатировать числовой вывод. Я упростила свою проблему в небольшую тестовую программу, чтобы продемонстрировать свою проблему. Ниже приведен мой код:

#include <QCoreApplication>
#include <QTextStream>
#include <QFile>

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

QFile file("testfile.txt");

if (file.open(QIODevice::WriteOnly | QIODevice::Text))
{
QTextStream out(&file);

out.setFieldAlignment(QTextStream::AlignLeft);
out.setFieldWidth(5);

out << "1" << "A" << endl;
out << "2" << "B" << endl;
out << "3" << "C" << endl;
out << "4" << "D" << endl;
out << "5" << "E" << endl;
out << "6" << "F" << endl;
}

return a.exec();
}

Вот вывод, сгенерированный вышеуказанной программой:

1    A
2    B
3    C
4    D
5    E
6    F

Обратите внимание на отступ в пяти нижних строках? Это моя проблема, я не хочу, чтобы отступ начинался с новой строки. Я хочу, чтобы каждая строка начиналась со столбца 0 и записывала значение шириной в пять столбцов (ширина моего поля) и выравнивание по левому краю.

Я пытался поиграться с параметрами некоторое время без удачи. Если я смогу заставить это работать в небольшой тестовой программе, описанной выше, я думаю, что мне удастся перенести это изменение в мою гораздо большую программу, которая записывает текстовый файл.

2

Решение

Одним из способов преодоления этого является использование qSetFieldWidth до и после написания endl, Установка ширины до нуля перед записью endl и снова установка на предыдущее значение.

Это не сильно изменит ваш код из-за удобного qSetFieldWidth функция, которая эквивалентна QTextStream::setFieldWidth :

#include <QCoreApplication>
#include <QTextStream>
#include <QFile>

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

QFile file("testfile.txt");

if (file.open(QIODevice::WriteOnly | QIODevice::Text))
{
QTextStream out(&file);

out.setFieldAlignment(QTextStream::AlignLeft);
out.setFieldWidth(5);

out << "1" << "A" << qSetFieldWidth(0) << endl <<qSetFieldWidth(5);
out << "2" << "B" << qSetFieldWidth(0) << endl <<qSetFieldWidth(5);
out << "3" << "C" << qSetFieldWidth(0) << endl <<qSetFieldWidth(5);
out << "4" << "D" << qSetFieldWidth(0) << endl <<qSetFieldWidth(5);
out << "5" << "E" << qSetFieldWidth(0) << endl <<qSetFieldWidth(5);
out << "6" << "F" << qSetFieldWidth(0) << endl <<qSetFieldWidth(5);
}

return a.exec();
}

Теперь результат:

1    A
2    B
3    C
4    D
5    E
6    F
2

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

От QTextStream::setFieldWidth документация:

Примечание. Ширина поля применяется к каждому элементу, добавляемому к этому потоку после вызова этой функции (например, он также заполняет endl).

Очевидно, что это причина вашей проблемы: endl Символ дополняется четырьмя пробелами, как и любой другой символ, который вы помещаете в поток. Возможный обходной путь — установить ширину поля на 0 перед добавлением endl и сброс ширины поля после этого или полностью отключить заполнение потока и полагаться на другие способы заполнения, такие как QString::leftJustified,

2

По вопросам рекламы [email protected]