首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QTextStream格式问题

QTextStream格式问题
EN

Stack Overflow用户
提问于 2015-01-15 20:34:10
回答 2查看 3.1K关注 0票数 2

我正在尝试使用QTextStream来格式化数字输出。我已经将我的问题简化为一个小测试程序来演示我的问题。以下是我的代码:

代码语言:javascript
复制
#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();
}

下面是由上面的程序生成的输出:

代码语言:javascript
复制
1    A    
    2    B    
    3    C    
    4    D    
    5    E    
    6    F    

注意到下面五行的缩进了吗?这是我的问题,我不想让缩进开始新的行。我希望每一行从0开始,并写出一个5列宽的值(我的字段宽度),然后左对齐。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-16 07:19:31

克服这一问题的一种方法是在编写qSetFieldWidth之前和之后使用endl。在写入endl之前将宽度设置为零,然后再次设置为前一个值。

由于方便的qSetFieldWidth函数(相当于QTextStream::setFieldWidth ),它不会改变您的代码:

代码语言:javascript
复制
#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();
}

现在的结果是:

代码语言:javascript
复制
1    A    
2    B    
3    C    
4    D    
5    E    
6    F  
票数 2
EN

Stack Overflow用户

发布于 2015-01-15 20:48:40

来自QTextStream::setFieldWidth文档:

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27972476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档