QTextStream 格式问题
QTextStream formatting issue
我正在尝试使用 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 列开始,并写入一个 5 列宽(我的字段宽度)的值,并使其左对齐。
我试过一段时间不走运地使用这些参数。如果我能让它在上面的小测试程序中工作,我想我可以成功地将这个更改移植到我的更大的程序中,该程序写入一个文本文件。
来自 QTextStream::setFieldWidth
文档:
Note: The field width applies to every element appended to this stream after this function has been called (e.g., it also pads endl).
很明显,这是导致您出现问题的原因:endl
符号被填充了 4 个空格,就像您放入流中的任何其他字符一样。一种可能的解决方法是在添加 endl 之前将字段宽度设置为 0 并在之后重置字段宽度,或者完全禁用流填充并依赖其他填充方式,如 QString::leftJustified
.
克服这个问题的一种方法是在写 endl
之前和之后使用 qSetFieldWidth
。在写入 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
来格式化数字输出。我已将我的问题简化为一个小测试程序来演示我的问题。以下是我的代码:
#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 列开始,并写入一个 5 列宽(我的字段宽度)的值,并使其左对齐。
我试过一段时间不走运地使用这些参数。如果我能让它在上面的小测试程序中工作,我想我可以成功地将这个更改移植到我的更大的程序中,该程序写入一个文本文件。
来自 QTextStream::setFieldWidth
文档:
Note: The field width applies to every element appended to this stream after this function has been called (e.g., it also pads endl).
很明显,这是导致您出现问题的原因:endl
符号被填充了 4 个空格,就像您放入流中的任何其他字符一样。一种可能的解决方法是在添加 endl 之前将字段宽度设置为 0 并在之后重置字段宽度,或者完全禁用流填充并依赖其他填充方式,如 QString::leftJustified
.
克服这个问题的一种方法是在写 endl
之前和之后使用 qSetFieldWidth
。在写入 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