0、说明

QTextStream提供了读写文本文件的接口。

QTextStream可以操作QIODevice,  QByteArray 和 QString,调用QTextStream的流操作可以方便的读取文字、行、数字等,还提供了文本填充和对齐的相关格式。

例如:

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

1)控制台输入输出

QTextStream也常用于控制台输入输出,它可以自动将标准输入解码为正确的格式,例如:

  1. QTextStream stream(stdin);
  2. QString line;
  3. while(stream.readLineInto(&line)){
  4. ...
  5. }

2)Device、flush与编码

除了用QTextStream构造器外,也可以通过setDevice() 和 setString()设置QTextStream的Device和String。可以用seek()跳转到指定位置,如果没有数据可读,那么atEnd()会返回true。调用flush()后,QTextStream就会把所有数据从转移到device中,并且调用device的flush()。

QTextStream在内部使用Unicode编码,并且使用QTextCodec来支持不同的字符编码。默认情况下,QTextCodec::codecForLocale()是读写时所用的编码,调用setCodec()设置编码。

3)读取文本文件

QTextStream使用三种方式读取文本文件:

  • 一块一块读,readLine() or readAll();
  • 一个字一个字读(即一次读一个字符串):QTextStream支持流入QStrings, QByteArrays 和char *的buffer。字间通过空格分隔。
  • 一个字符一个字符读:流入QChar或char,通常用于文件解析时。

由于QTextStream使用了buffer,所以我们不能用超类对象从流中读取。例如,如果我们有一个QFile对象并直接用QFile::readLine()来读取,而不是通过流,那么TextStream的在文件中位置将会失去同步。

4)格式与数字

默认情况下,当从文本流中读取数字时,QTextStream将会自动解析它的进制。例如,以"0x"开头的数字会被解析为十六进制。而以1-9开头的则会被解析为十进制。我们也可以手动设置进制,从而避免自动检测,方法是setIntegerBase():

  1. QTextStream in("0x50 0x20");
  2. int firstNumber, secondNumber;
  3.  
  4. in >> firstNumber; // firstNumber == 80
  5. in >> dec >> secondNumber; // secondNumber == 0
  6.  
  7. char ch;
  8. in >> ch; // ch == 'x'

QTextStream支持许多有关构造文本的格式选项:

可以通过setFieldWidth() 和 setPadChar()来设置文本宽度和填充字符;

使用setFieldAlignment()来设置每段文本的对齐方式;

对于数字,用setRealNumberNotation() 与 setRealNumberPrecision()设置符号和精度,一些额外的数字格式项通过setNumberFlags()设置。

类似标准C++库<iostream>,QTextStream也定义了一些全局操作符,这使得我们在使用<<与>>时,可以通过这些全局操作符及相关函数进行输出格式上的一些设置:

Manipulator Description
Qt::bin Same as setIntegerBase(2).
Qt::oct Same as setIntegerBase(8).
Qt::dec Same as setIntegerBase(10).
Qt::hex Same as setIntegerBase(16).
Qt::showbase Same as setNumberFlags(numberFlags() | ShowBase).
Qt::forcesign Same as setNumberFlags(numberFlags() | ForceSign).
Qt::forcepoint Same as setNumberFlags(numberFlags() | ForcePoint).
Qt::noshowbase Same as setNumberFlags(numberFlags() & ~ShowBase).
Qt::noforcesign Same as setNumberFlags(numberFlags() & ~ForceSign).
Qt::noforcepoint Same as setNumberFlags(numberFlags() & ~ForcePoint).
Qt::uppercasebase Same as setNumberFlags(numberFlags() | UppercaseBase).
Qt::uppercasedigits Same as setNumberFlags(numberFlags() | UppercaseDigits).
Qt::lowercasebase Same as setNumberFlags(numberFlags() & ~UppercaseBase).
Qt::lowercasedigits Same as setNumberFlags(numberFlags() & ~UppercaseDigits).
Qt::fixed Same as setRealNumberNotation(FixedNotation).
Qt::scientific Same as setRealNumberNotation(ScientificNotation).
Qt::left Same as setFieldAlignment(AlignLeft).
Qt::right Same as setFieldAlignment(AlignRight).
Qt::center Same as setFieldAlignment(AlignCenter).
Qt::endl Same as operator<<('\n') and flush().
Qt::flush Same as flush().
Qt::reset Same as reset().
Qt::ws Same as skipWhiteSpace().
Qt::bom Same as setGenerateByteOrderMark(true).

比如,我们要用十进制和十六进制输出两个值:

  1. QTextStream in("0x50 20");
  2. int firstNumber, secondNumber;
  3.  
  4. in >> hex >> firstNumber; // firstNumber == 80
  5. in >> dec >> secondNumber; // secondNumber == 20

1、模块和加载项

Header: #include <QTextStream>
qmake: QT += core

2、构造

QTextStream(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()  

3、静态字段

enum FieldAlignment { AlignLeft, AlignRight, AlignCenter, AlignAccountingStyle } 对齐方式
enum NumberFlag { ShowBase, ForcePoint, ForceSign, UppercaseBase, UppercaseDigits } 整数、float、double数字输出时的显示格式
flags NumberFlags
enum RealNumberNotation { ScientificNotation, FixedNotation, SmartNotation } float、double表示方法
enum Status { Ok, ReadPastEnd, ReadCorruptData, WriteFailed } 当前文本流的状态

6、实例方法

返回值类型

方法

说明

bool atEnd() 如果QTextStream中没有更多数据可读,返回true
bool autoDetectUnicode() 如果允许自动监测Unicode则返回true
QTextCodec * codec() 编解码器
QIODevice * device() Device
QTextStream::FieldAlignment fieldAlignment() 对齐方式
int fieldWidth() 文本宽度
void flush() 刷新所有等待写入Device的buffer中的数据
bool generateByteOrderMark() 当采用UTF编码器时,如果QTextStream被设置为生成UTC BOM时返回true
int integerBase() 当前进制
QLocale locale()  
QTextStream::NumberFlags numberFlags() number flags
QChar padChar() 填充字符
qint64 pos() 当前位置
QString read(qint64 maxlen) 读取至多maxlen个字符
QString readAll() 读取全部
QString readLine(qint64 maxlen = 0) 读一行,至多maxlen
bool readLineInto(QString *line, qint64 maxlen = 0) 读一行到line中,至多maxlen
QTextStream::RealNumberNotation realNumberNotation() 数字标识
int realNumberPrecision() 数字精度
void reset() 重置格式选项
void resetStatus() 重置状态
bool seek(qint64 pos) 跳转到Pos处
void

setAutoDetectUnicode(bool enabled)

设置是否自动检测编码

setCodec(QTextCodec *codec)

setCodec(const char *codecName)

设置编解码器
setDevice(QIODevice *device) 设置Device
setFieldAlignment(QTextStream::FieldAlignment mode) 对齐方式
setFieldWidth(int width) 文本宽度
setGenerateByteOrderMark(bool generate)  
setIntegerBase(int base) 进制
setLocale(QLocale locale)  
setNumberFlags(QTextStream::NumberFlags flags) number flag
setPadChar(QChar ch) 填充字段
setRealNumberNotation(QTextStream::RealNumberNotation notation) 数字标识
setRealNumberPrecision(int precision) 数字精度
setStatus(QTextStream::Status status) 状态
setString(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite) 为string设置当前字符串
void skipWhiteSpace() 跳过开头的空格字符,之后读取全部
QTextStream::Status status() 状态
QString * string() QTextStream的string
QTextStream & operator<<(T t) 写入t到stream中,T可以是任何常见Qt、C格式
QTextStream & operator>>(T &t) 从stream中读取一个T存入t中

Qt:QTextStream的更多相关文章

  1. Qt:禁止qDebug的输出

    Qt:禁止qDebug的输出 在工程的.pro文件里加上以下编译批令即可: DEFINES += QT_NO_DEBUG_OUTPUT

  2. Qt:使用自定义的字体

    Qt:使用自定义的字体 1. 下载字体文件 2. 加载字体文件 3. 使用字体   QFontDatabase::addApplicationFont("XENOTRON.TTF" ...

  3. Qt:QJsonObject

    0.说明 QJsonObject在逻辑上就是一个Map或Dict!记住这一点对理解它的方法.说明很有帮助. QJsonObject类封装了JSON Object. JSON Object是一个Key- ...

  4. Qt:QJsonValue

    0.说明 QJsonValue类用于操作JSON中的各种数据. JSON是用于存储结构化数据的格式,JSON中的数据可以是六种类型: 基本类型 存储类型 bool QJsonValue::Bool d ...

  5. Qt:QJsonArray

    0.说明 QJsonArray中存储了一系列的QJsonValue.可以向其中插入.删除QJsonValue. 一个QJsonArray可以与QVariantList互相转换.可以通过size()访问 ...

  6. Qt:QUrl构造时的qrc前缀

    参考(按对我帮助从大到小排列): Qt内的各种路径(让人迷惑) - 鬼谷子com - 博客园 qt webengineview 加载本地资源方式 - beautifulday - 博客园 (17条消息 ...

  7. Qt:QFile、QIODevice

    QFile 0.说明 QFile是读写文件的类,这里的文件包括文本文件.二进制文件.资源文件. 通常情况下,文件读写使用QFile.QTextStream.QDataStream就够了. file n ...

  8. Qt:正则表达式语法:

         正则表达式是验证输入.从输入中提取数据以及对输入进行搜索和替换的强大工具,所谓正则表达式,regexp是一种利用模式匹配语言来描述字符串组成限制条件的方式;        Qt 提供了一个Q ...

  9. Qt:QT右键菜单

    Qt QTableView 上加右键弹出菜单, 并复制选中的单元格内容到剪贴板中 http://wenku.baidu.com/view/c51cfb63cf84b9d528ea7a29.html h ...

随机推荐

  1. 如何快速将数据用逗号隔开——巧用EXCEL

    问题是这样的,下图是爬虫获得的数据,注意该数据存储在CSV格式的EXCEL表格中,单元格中的数据每四个代表一个点的经纬度,但是很明显它现在的这个形式是没法利用的, 因此需要对数据进行挖掘,提取出经纬度 ...

  2. linux 启动过程原理哦

    bios加电自检硬件设备 grub引导加载程序 当内核被加载到内存,内核阶段就开始了. init进程是所有进程的发起者和控制者.因为在任何基于unix的系统中,它都是第一个运行的进程. 然后执行sys ...

  3. 检测当前编译器支持c++版本

    if (__cplusplus > 201703L) std::cout << "C++2a\n"; else if (__cplusplus == 201703 ...

  4. 「CTSC2010」产品销售

    「CTSC2010」产品销售 30pts的费用流都会吧... 100pts只要模拟费用流就行了,是不是很简单呀( 咕咕咕 令\(M_i\)表示\(i-1\to i\)的正向边,\(M_i^{'}\)表 ...

  5. 在Android中用纯Java代码布局

    感谢大佬:https://www.jianshu.com/p/7aedea560f16 在Android中用纯Java代码布局 本文的完成了参考了一篇国外的教程,在此表示感谢. Android中的界面 ...

  6. Mysql Json函数总览 (一)

    JSON函数相关文章均来自官网,此处仅做记录,以便以后查询方便. https://dev.mysql.com/doc/refman/5.7/en/json-functions.html JSON函数参 ...

  7. 学习jsp篇:jsp Session介绍

    1.Session基本介绍 Session---会话,它是一个内置对象.会话打个比方说就是浏览网站:开始到结束,或者说购物从开始到结束. 2.Session机制 客户端在第一次请求服务端时,服务端会产 ...

  8. 区段统计 mysql 语句 case when then end as

    EXPLAIN SELECT COUNT(*),CASEWHEN device_width > 729 THEN '>729'WHEN device_width BETWEEN '720' ...

  9. 实现“手机qq”侧滑菜单 -- 吴欧

    基本数据采集 经过体验,手机QQ采用的应该是线性动画,即视图缩放比例等随手指在屏幕上滑动的距离以一次方程的形式变化. 提取基本数据,向右侧滑达到最大幅度时: 1.   右侧主视图左边界距离屏幕左边界的 ...

  10. iOS,蓝牙开发!!--By帮雷

    iOS的蓝牙开发大致有以下几种方式. 1 GameKit.framework [只能存在于iOS设备之间,多用于游戏 能搜索到的demo比较多,不确切说名字了,code4app里面就有] 2 Core ...