QTextStream文本流用法(一)

简介: QTextStream文本流用法(一)

由于我们项目中经常会用到一些文本流,所以今天分享下QTextStream文本流的简单用法。

QTextStream是一个非常强大的类,它可以对IO设备,QString,QByteArray等类进行方便的读写操作。

在文本流中,QTextStream重载了两种运算符以简化输入输出流的用法,运算符<<被称为插入符,顾名思义,是往该流对象中插入数据。另一个运算符>>被称之为提取符,即从流对象中提取出数据。

请看如下代码:

#include <QTextStream>
int main()
{
    //使用提取符从标准输入中提取输入数据
    QTextStream in(stdin);
    int i;
    in >> i;
    float f;
    in >> f;
    char buf[50];
    in >> buf;
    //使用插入符向标准输出中写数据
    QTextStream out(stdout);
    out << "i=";
    out << i;
    out << " f=";
    out << f;
    out << " buf=";
    out << buf;
    out << endl;
}
//input: 10 20.5 hello //回车
//out:   i=10 f=20.5 buf=hello


当然,我们也可以将提取符和插入符连续使用:

int main()
{
    //连续使用提取符从标准输入中提取输入数据
    QTextStream in(stdin);
    int i;
    float f;
    char buf[50];
    in >> i >> f >> buf;
    //连续使用插入符向标准输出中写数据
    QTextStream out(stdout);
    out << "i=" << i
        << " f=" << f
        << " buf=" << buf << endl;
}
//input: 10 20.5 hello
//out:   i=10 f=20.5 buf=hello


但是,如果我们在输入的时候输错了,这时,文本流会如何处理呢?

int main()
{
    //连续使用提取符从标准输入中提取输入数据
    QTextStream in(stdin);
    int i = 10;
    float f = 2.5;
    char buf[50] = "kafka";
    in >> i >> f >> buf;
    //连续使用插入符向标准输出中写数据
    QTextStream out(stdout);
    out << "i=" << i   << " status: " << out.status() << "\n"
        << "f=" << f   << " status: " << out.status() << "\n"
        << "buf=" << buf << " status: " << out.status() << endl;
}
//input: hello my world
//out:   i=0 status: 0
//       f=0 status: 0
//       buf=hello status: 0


以上结果表明,输入流会跳过那些输入错误的数据,而其对应的数据类型变量会被赋值为默认值。而流的状态值也不会被修改,但是在C++标准库中,流状态会被修改。

到这里,可能有人会问,为什么输出流后面会有一个endl,其实endl的作用是刷新流,并且换行,这和标准库中的endl差不多,而且endl是属于操纵算子中的一类,关于操纵算子,小豆君在接下来的文章会专门介绍。刷新流的真正作用就是将那些存储在流内部缓冲区中的数据真正输出。

下面来做一个小实验

int main()
{
    QTextStream in(stdin);
    int i;
    float f;
    char buf[50];
    in >> i >> f >> buf;
    QTextStream out(stdout);
    out << "i=" << i
        << " f=" << f
        << " buf=" << buf;//去掉了endl
    while(true){}
}
//input: 10 20.5 hello //回车


当按回车时,控制台并没有打印,这是因为数据还在流的缓冲区中,并没有真正输出,所以你需要调用endl来刷新缓冲区。 如果,我们编写一个日志文件的接口,那最好就是要为我们的输出流加上endl或者flush(刷新缓冲区,但不换行),这样,即使程序崩溃,我们也能在日志文件中看到离发生错误的地方的最近的代码。

现在,我们再修改一下程序

int main()
{
    //为out加上了作用域,当out超出作用域,调用QTextStream析构函数
    {
        QTextStream in(stdin);
        int i;
        float f;
        char buf[50];
        in >> i >> f >> buf;
        QTextStream out(stdout);
        out << "i=" << i
            << " f=" << f
            << " buf=" << buf;//去掉了endl
    }
    while(true){}
}


当我们再次运行程序,输入数据后,程序进行了真正的输出,这是因为,在out超出作用域后,调用QTextStream析构函数,刷新缓冲区,控制台就有打印信息了。

以上代码,都使用的是标准输入输出,如果想要从文件中读取和写入,只需要向QTextStream的构造函数中传入QFile对象即可。

#include <QTextStream>
#include <QFile>
int main()
{
    QFile fileIn("main.cpp");//请确保exe所在目录存在main.cpp
    Q_ASSERT(fileIn.open(QIODevice::ReadOnly));
    QTextStream in(&fileIn);
    QFile fileOut("main.out");
    Q_ASSERT(fileOut.open(QIODevice::WriteOnly));
    QTextStream out(&fileOut);
    QString line;
    int cnt = 0;
    while(in.readLineInto(&line))
    {
        out << QStringLiteral("%1: %2\n").arg(++cnt).arg(line);
    }
}


上面的程序是将main.cpp中的文本读取出来加上行号,再写入main.out中,你是否感觉到输入输出流的强大呢,只用少许的代码,就可以将一个文件的内容复制到另一个文件,并且还可以针对文件中的内容加以修改。

好了,关于QTextStream就先介绍到这里,我们下节继续介绍它的其它强大功能。

最后也希望大家多多支持小豆君的创作,关注小豆君的公众号“小豆君Qt分享”,最新文章都会在公众号第一时间发布,或者你有不懂的问题,关注公众号后,可加好友或进Qt群获得答案。

相关文章
|
存储 编译器 C++
QT之QFlags详解
QT之QFlags详解
632 0
|
存储 编解码 Cloud Native
C++ Qt关于多屏幕窗口处理
C++ Qt关于多屏幕窗口处理
|
XML 编解码 自然语言处理
不需要熟悉,但需要了解的libiconv库
但是很多老式的计算机还在使用当地的传统的字符编码方式。而一些程序,例如邮件程序和浏览器必须能在这些不同的用户编码之间作转换。其他的一些程序则内置支持Unicode,以顺利支持国际化的处理,但是仍然有在Unicode和其他的传统编码之间转换的需求。GNU的libiconv就是为这两种应用设计的编码转换库。
不需要熟悉,但需要了解的libiconv库
|
网络协议 数据安全/隐私保护 Linux
|
人工智能 供应链 监控
【对话CIO】制造业出海,联想的经验与实战
【对话CIO】制造业出海,联想的经验与实战
|
人工智能 自然语言处理 搜索推荐
全网首发 | PAI Model Gallery一键部署阶跃星辰Step-Video-T2V、Step-Audio-Chat模型
Step-Video-T2V 是一个最先进的 (SoTA) 文本转视频预训练模型,具有 300 亿个参数,能够生成高达 204 帧的视频;Step-Audio 则是行业内首个产品级的开源语音交互模型,通过结合 130B 参数的大语言模型,语音识别模型与语音合成模型,实现了端到端的文本、语音对话生成,能和用户自然地进行高质量对话。PAI Model Gallery 已支持阶跃星辰最新发布的 Step-Video-T2V 文生视频模型与 Step-Audio-Chat 大语言模型的一键部署,本文将详细介绍具体操作步骤。
|
10月前
|
SQL 人工智能 自然语言处理
【爆肝实测】当AiPy遇上Vibe Coding:打工人的AI编程解放之路!
AiPy是一款基于“自然语言驱动+代码全自动生成”的免费Vibe Coding工具,重新定义编程方式。访问官网https://www.aipyaipy.com开启AI编程新体验!
|
编解码 算法 vr&ar
深度剖析FFmpeg视频解码后的帧处理到Qt显示 从AVFrame到QImage的转换(二)
深度剖析FFmpeg视频解码后的帧处理到Qt显示 从AVFrame到QImage的转换
726 1
|
传感器 存储 监控
树莓派的应用场景有哪些
树莓派是一种小型、低成本的计算机,广泛应用于教育、家庭自动化、媒体中心、游戏、机器人、物联网项目等领域,支持多种操作系统和编程语言。
2700 8
|
数据可视化
【Qt 学习笔记】Qt窗口 | 菜单栏 | QMenuBar的使用及说明
【Qt 学习笔记】Qt窗口 | 菜单栏 | QMenuBar的使用及说明
4394 3

热门文章

最新文章