QTextStream格式化问题

时间:2015-01-15 20:34:11

标签: c++ qt file-io format 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 个答案:

答案 0 :(得分:2)

来自QTextStream::setFieldWidth文档:

  

注意:字段宽度适用于在调用此函数后附加到此流的每个元素(例如,它还会填充endl)。

显然,这是导致问题的原因:endl符号用4个空格填充,就像放入流中的任何其他字符一样。一种可能的解决方法是在添加endl之前将字段宽度设置为0并在此之后重置字段宽度,或者完全禁用流填充并依赖其他填充方式,如QString::leftJustified

答案 1 :(得分: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