【问题标题】:QTextStream formatting issueQTextStream 格式问题
【发布时间】:2015-05-26 13:26:27
【问题描述】:

我正在尝试使用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 列开始,并写入一个五列宽(我的字段宽度)的值,并使其左对齐。

我已经尝试过一段时间没有运气的参数。如果我可以让它在上面的小测试程序中工作,我想我可以成功地将这个更改移植到我的更大的程序中,该程序编写一个文本文件。

【问题讨论】:

    标签: c++ qt file-io format qtextstream


    【解决方案1】:

    克服这个问题的一种方法是在编写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  
    

    【讨论】:

      【解决方案2】:

      来自QTextStream::setFieldWidth 文档:

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

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

      【讨论】:

      • 我在文档中看到了这一点,但我希望它们是一个比不断设置和重置字段宽度更简单的解决方案。我可以确认您的方法是一种解决方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 2011-08-16
      • 2011-02-12
      • 2011-11-25
      • 2016-11-29
      • 2019-06-07
      相关资源
      最近更新 更多