Qt扫盲- QTextStream 理论总结

QTextStream 理论总结

  • 一、概述
  • 二、使用
    • 1. 构造函数
    • 2. 立即写入
    • 3. 编码
    • 4. 读取
  • 三、格式化

一、概述

QTextStream类为读写文本提供了一个方便的接口。QTextStream可以操作QIODevice、QByteArray或QString。使用QTextStream的流操作符,我们可以方便地读写单词、行和数字。

二、使用

为了生成文本,QTextStream支持字段填充和对齐的格式化选项,以及数字的格式化选项。例子:

QFile data("output.txt");
if (data.open(QFile::WriteOnly | QFile::Truncate)) {QTextStream out(&data);out << "Result: " << qSetFieldWidth(10) << left << 3.14 << 2.7;// writes "Result: 3.14      2.7       "
}

1. 构造函数

使用QTextStream读取控制台输入并写入控制台输出也很常见。QTextStream是区域设置敏感的,并且会自动使用正确的编解码器解码标准输入。有时候我们需要逐行的去处理数据,我们就可以用下面的代码。可以把 stdin 按照构造函数里面的要求,改成像 QString、或者 QFile 之类的

例子:

QTextStream stream(stdin);
QString line;
while (stream.readLineInto(&line)) {...
}

除了使用QTextStream的构造函数,还可以通过调用setDevice()或setString()来设置QTextStream操作的设备或字符串。我们可以通过调用seek()来查找一个位置,当没有数据需要读取时,atEnd()将返回true。

我们可以看到这些构造函数可以 去传递字符串和IO设备的。

QTextStream(const QByteArray &array, QIODevice::OpenMode openMode = QIODevice::ReadOnly)
QTextStream(QByteArray *array, QIODevice::OpenMode openMode = QIODevice::ReadWrite)
QTextStream(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite)
QTextStream(FILE *fileHandle, QIODevice::OpenMode openMode = QIODevice::ReadWrite)
QTextStream(QIODevice *device)
QTextStream()

2. 立即写入

如果调用flush(), QTextStream将清空其写缓冲区中的所有数据,并在设备上调用flush()。相当于就是刷新数据到具体的设备,就像写文件,调用了 flush() 就会立即写入到磁盘中去。

3. 编码

在内部,QTextStream使用基于Unicode的缓冲区,QTextStream使用QTextCodec自动支持不同的字符集。默认情况下,QTextCodec::codecForLocale()用于读写,但也可以通过调用setCodec()来设置编解码器。它还支持自动Unicode检测。当此功能启用时(默认行为),QTextStream将检测UTF-16或UTF-32 BOM(字节顺序标记),并在读取时切换到适当的UTF编解码器。QTextStream默认不会写入BOM,但是我们可以通过调用setGenerateByteOrderMark(true)来启用它。当QTextStream直接操作QString时,将禁用编解码器。

4. 读取

读取文本文件时,有三种使用QTextStream的一般方法:

  • 通过调用 readLine() 或 readAll() 逐读取。
  • 一个word一个word。QTextStream支持流式转换为QStrings、QByteArrays和char*缓冲区。单词由空格分隔,前导空格会自动跳过。
  • 通过流式转换成QChar或char类型逐个字符。在解析文件时,这种方法通常用于方便的输入处理,独立于字符编码和行尾语义。要跳过空格,可以调用skipWhiteSpace()。

由于文本流使用了缓冲区,所以不应该使用超类的实现从流中读取数据。例如,如果我们有一个QFile,并直接使用QFile::readLine()而不是使用流读取它,文本流的内部位置将与文件的位置不同步。

默认情况下,当从文本流读取数字时,QTextStream将自动检测数字的基本表示。例如,如果数字以“0x”开头,则认为它是十六进制形式。如果它以数字1 ~ 9开头,则认为它是十进制形式,以此类推。我们可以通过调用setIntegerBase()来设置整数基数,从而禁用自动检测。例子:

  QTextStream in("0x50 0x20");int firstNumber, secondNumber;in >> firstNumber;             // firstNumber == 80in >> dec >> secondNumber;     // secondNumber == 0	这里就是读的是 0x20 的 0 ,这里的得出就是 Qt::decchar ch;in >> ch;                      // ch == 'x' 这里就是读的是 0x20 的 x 

三、格式化

QTextStream支持生成文本的许多格式选项。可以调用setFieldWidth()和setPadChar()来设置字段宽度和填充字符。使用setFieldAlignment()设置每个字段的对齐方式。对于实数,调用setRealNumberNotation()和setRealNumberPrecision()来设置生成数字的记数法(SmartNotation、ScientificNotation、FixedNotation)和精度。通过setNumberFlags()还可以获得一些额外的数字格式化选项。

与标准c++库中的一样,QTextStream也定义了几个全局的操作符函数:

ManipulatorDescription
Qt::binSame as setIntegerBase(2).
Qt::octSame as setIntegerBase(8).
Qt::decSame as setIntegerBase(10).
Qt::hexSame as setIntegerBase(16).
Qt::showbaseSame as setNumberFlags(numberFlags()
Qt::forcesignSame as setNumberFlags(numberFlags()
Qt::forcepointSame as setNumberFlags(numberFlags()
Qt::noshowbaseSame as setNumberFlags(numberFlags() & ~ShowBase).
Qt::noforcesignSame as setNumberFlags(numberFlags() & ~ForceSign).
Qt::noforcepointSame as setNumberFlags(numberFlags() & ~ForcePoint).
Qt::uppercasebaseSame as setNumberFlags(numberFlags()
Qt::uppercasedigitsSame as setNumberFlags(numberFlags()
Qt::lowercasebaseSame as setNumberFlags(numberFlags() & ~UppercaseBase).
Qt::lowercasedigitsSame as setNumberFlags(numberFlags() & ~UppercaseDigits).
Qt::fixedSame as setRealNumberNotation(FixedNotation).
Qt::scientificSame as setRealNumberNotation(ScientificNotation).
Qt::leftSame as setFieldAlignment(AlignLeft).
Qt::rightSame as setFieldAlignment(AlignRight).
Qt::centerSame as setFieldAlignment(AlignCenter).
Qt::endlSame as operator<<(‘\n’) and flush().
Qt::flushSame as flush().
Qt::resetSame as reset().
Qt::wsSame as skipWhiteSpace().
Qt::bomSame as setGenerateByteOrderMark(true).

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/114855.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LABVIEW 安装教程(超详细)

目录 LabVIEW2017&#xff08;32/64位&#xff09;下载地址&#xff1a; 一 .简介 二.安装步骤&#xff1a; LabVIEW2017&#xff08;32/64位&#xff09;下载地址&#xff1a; 链接&#xff1a; https://pan.baidu.com/s/1eSGB_3ygLNeWpnmGAoSwcQ 密码&#xff1a;gjrk …

JAVA面经整理(MYSQL篇)

索引: 索引是帮助MYSQL高效获取数据的排好序的数据结构 1)假设现在进行查询数据&#xff0c;select * from user where userID89 2)没有索引是一行一行从MYSQL进行查询的&#xff0c;还有就是数据的记录都是存储在MYSQL磁盘上面的&#xff0c;比如说插入数据的时候是向磁盘上面…

C++ 类和对象(六)赋值运算符重载

1 运算符重载 C为了增强代码的可读性引入了运算符重载&#xff0c;运算符重载是具有特殊函数名的函数&#xff0c; 也具有其返回值类型&#xff0c;函数名字以及参数列表&#xff0c;其返回值类型与参数列表与普通的函数类似。 函数名字为&#xff1a;关键字operator后面接需…

css之Flex弹性布局(父项常见属性)

文章目录 &#x1f415;前言&#xff1a;&#x1f3e8;定义flex容器 display:flex&#x1f3e8;在flex容器中子组件进行排列&#x1fa82;行排列 flex-direction: row&#x1fa82;将行排列进行翻转排列 flex-direction: row-reverse&#x1f3c5;按列排列 flex-direction: col…

No170.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

mstsc改端口为33389

windows 远程默认端口3389不太安全&#xff0c;改成33389防下小人 把下面的2个文本存在后缀.reg的文件&#xff0c;双击导入注册表&#xff0c;"PortNumber"dword:0000826d 这个就是33389对应的端口号的16进制值&#xff0c;要想自己改成其它的换下值即可 Windows …

人工智能、机器学习、深度学习的区别

人工智能涵盖范围最广&#xff0c;它包含了机器学习&#xff1b;而机器学习是人工智能的重要研究内容&#xff0c;它又包含了深度学习。 人工智能&#xff08;AI&#xff09; 人工智能是一门以计算机科学为基础&#xff0c;融合了数学、神经学、心理学、控制学等多个科目的交…

LeetCode讲解篇之77. 组合

文章目录 题目描述题解思路题解代码 题目描述 题解思路 遍历nums&#xff0c;让当前数字添加到结果前缀中&#xff0c;递归调用&#xff0c;直到前缀的长度为k&#xff0c;然后将前缀添加到结果集 题解代码 func combine(n int, k int) [][]int {var nums make([]int, n)fo…

分享转发API

分享转发API 微信小程序可以在page中定义 onShareAppMessage函数&#xff0c;设置该页面的分享信息。只有定义了此事件处理函数&#xff0c;小程序右上角菜单栏才会显示“转发”按钮&#xff0c;用户点击页面内的转发按钮是才能调用函数&#xff0c; 除了在这里点击转发按钮进行…

最新!两步 永久禁止谷歌浏览器 Google Chrome 自动更新

先放效果图&#xff1a; CSDN这个问题最火的大哥的用了没用 像他这样连浏览器都打不开 为什么要禁止chrome自动更新 看到很多搞笑的大哥&#xff0c;说为啥要禁止&#xff1b; 我觉得最大的原因就是chromedriver跟不上chrome的自动更新&#xff0c;导致我们做selenium爬虫的…

MySQL数据库查询实战操作

前置条件: 创建库:MySQL基本操作之创建数据库-CSDN博客 创建表:MySQL基本操作之创建数据表-CSDN博客 目录 常规查询常用函数union查询一、常规查询 普通的查询方式 1、查询所有姓名以 "张" 开头的学生: SELECT * FROM student WHERE name LIKE 张%; 这条语…

Golang爬虫入门指南

引言 网络爬虫是一种自动化程序&#xff0c;用于从互联网上收集信息。随着互联网的迅速发展&#xff0c;爬虫技术在各行各业中越来越受欢迎。Golang作为一种高效、并发性好的编程语言&#xff0c;也逐渐成为爬虫开发的首选语言。本文将介绍使用Golang编写爬虫的基础知识和技巧…

支付风控规则

支付宝使用基本风控规则 一、 6个规则 1、规则一&#xff1a;30分钟内&#xff0c;不要连续刷3笔&#xff08;包括失败交易&#xff09;&#xff0c;两笔交易时间间隔大于5分钟&#xff0c;交易金额不要一样&#xff0c;不要贴近限额&#xff1b; 2、规则二&#xff1a;非正…

ETL工具对比

ETL开发 ETL是英文Extract-Transform-Load的缩写&#xff0c;表示将数据从来源端&#xff0c;经过抽取&#xff0c;转换&#xff0c;加载到目标数据源的过程。 数据抽取 分为全量抽取和增量抽取&#xff0c;数据量达到百万级别建议用增量抽取&#xff0c;小于百万级别可用增…

matlab中绘制 维诺图(Voronoi Diagram)

1.专业术语&#xff08;相关概念&#xff09;&#xff1a; 基点Site&#xff1a;具有一些几何意义的点 细胞Cell&#xff1a;这个Cell中的任何一个点到Cell中基点中的距离都是最近的&#xff0c;离其他Site比离内部Site的距离都要远。 Cell的划分&#xff1a;基点Site与其它的…

Java中的static关键字

一、static关键字的用途 在《Java编程思想》P86页有这样一段话&#xff1a; “static方法就是没有this的方法。在static方法内部不能调用非静态方法&#xff0c;反过来是可以的。而且可以在没有创建任何对象的前提下&#xff0c;仅仅通过类本身来调用static方法。这实际上正是s…

frida中使用gson打印map对象

Java.openClassFile("/data/local/tmp/r0gson.dex").load();const gson Java.use(com.r0ysue.gson.Gson);var Gson Java.use(‘com.google.gson.Gson’).$new(); console.log("map -> " Gson.toJsonTree(map).getAsJsonObject());

JS小数运算出现00000多位小数怎么解决

JS小数运算出现00000多位小数怎么解决 给大家分享一个经典的前端面试题&#xff1a; 0.10.2 0.3 //false javascript中浮点数的计算是以2进制计算的&#xff0c;所以0.10.2变成&#xff1a;0.30000000000000004 解决方案一 首先最简单的是利用JavaScript 的toFixed(n) 方…

app分发的一些流程

应用分发的流程通常包括以下步骤&#xff1a; 开发应用程序&#xff1a;首先&#xff0c;您需要开发您的应用程序。这包括编写代码、设计用户界面、测试应用程序等等。确保您的应用程序符合各个应用商店的规范和要求&#xff0c;以确保顺利通过审核。 准备应用材料&#xff1a…

Element UI定义方法校验邮箱格式

1. .vue中定义了3个邮箱输入框&#xff0c;前面两个是输入多个邮件地址&#xff0c;最后一个是使用element自带的校验来校验单个邮件地址 <el-row><el-col :span"24"><el-form-item label"收件人" prop"to"><el-input v-mo…