Я пытаюсь использовать 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 и записывала значение шириной в пять столбцов (ширина моего поля) и выравнивание по левому краю.
Я пытался поиграться с параметрами некоторое время без удачи. Если я смогу заставить это работать в небольшой тестовой программе, описанной выше, я думаю, что мне удастся перенести это изменение в мою гораздо большую программу, которая записывает текстовый файл.
Одним из способов преодоления этого является использование 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
От QTextStream::setFieldWidth
документация:
Примечание. Ширина поля применяется к каждому элементу, добавляемому к этому потоку после вызова этой функции (например, он также заполняет endl).
Очевидно, что это причина вашей проблемы: endl
Символ дополняется четырьмя пробелами, как и любой другой символ, который вы помещаете в поток. Возможный обходной путь — установить ширину поля на 0 перед добавлением endl и сброс ширины поля после этого или полностью отключить заполнение потока и полагаться на другие способы заполнения, такие как QString::leftJustified
,