Qt读取文本文件

文章目录

  • 解决 Unicode 的识别问题
  • QDataStream
    • 可以用 QDataStream 序列化的数据类型
    • 构造函数
    • QDataStream常用方法
    • 示例
  • QTextStream
    • 构造方法
    • QTextStream常用方法
    • 解决中文乱码的问题
  • QFile
    • 构造函数:
    • QFile常用方法
    • QIODevice::OpenModeFlag类型取值
    • 示例:QFile 类读写文本文件
    • 示例:QFile 读写二进制文件

qt中三个常用的处理文件的头文件:

  • QDataStream
  • QTextStream
  • QFile

解决 Unicode 的识别问题

为解决 Unicode 的识别问题,可以在应用程序中做全局的设置,使得应用程序支持 Unicode。方法是在 main() 函数中使用 QTextCodec 类进行编码设置。

int main(int argc, char *argv[])
{//解决汉字乱码问题
    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForLocale(codec);
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

QDataStream

QDataStream 用于读写二进制文件。QDataStream 类可以将二进制数据序列化到 QIODevice 设备中。
Qt读取文本文件_第1张图片

可以用 QDataStream 序列化的数据类型

  • bool
  • qint8
  • qint16
  • qint32
  • qint64
  • quint8
  • quint16
  • quint32
  • quint64
  • float
  • double
  • const char *
  • QBitArray
  • QBrush
  • QByteArray
  • QColor
  • QCursor
  • QDate
  • QDateTime
  • QEasingCurve
  • QFont
  • QGenericMatrix
  • QHash
  • QIcon
  • QImage
  • QKeySequence
  • QLinkedList
  • QList
  • QMap
  • QMargins
  • QMatrix4x4
  • QPair
  • QPalette
  • QPen
  • QPicture
  • QPixmap
  • QPoint
  • QQuaternion
  • QRect
  • QRegExp
  • QRegularExpression
  • QRegion
  • QSize
  • QString
  • QTime
  • QTransform
  • QUrl
  • QVariant
  • QVector2D
  • QVector3D
  • QVector4D
  • QVector

构造函数

  • QDataStream(const QByteArray &a):构造一个对字节数组a进行操作的只读数据流
  • QDataStream(QByteArray *a, QIODevice::OpenMode mode):构造对字节数组a进行操作的数据流,mode描述如何使用设备。最好用来只写数据流
  • QDataStream(QIODevice *d):使用d这个IO设备构造数据流
  • QDataStream():构造没有I/O设备的数据流

QDataStream常用方法

方法 说明
void abortTransaction() 终止事务
bool atEnd() const 判断是否读到文件末尾,如果已经达到末尾,返回 true,否则返回 false。
QDataStream::ByteOrder byteOrder() const 返回当前字节顺序设置——BigEndian或LittleEndian
bool commitTransaction() 提交事务
QIODevice * device() const 返回当前设置的I/O设备,如果当前没有设置设备,则返回0
QDataStream::FloatingPointPrecision floatingPointPrecision() const 返回浮点精度
QDataStream &readBytes(char *&s, uint &l) 对于用 writeBytes() 方法写入文件的 l 和 s,只能使用 readBytes() 方法读取出来。
int readRawData(char *s, int len) 从文件中读取最多 len 字节的数据到 s 中,返回值表示实际读取的字节数。注意,调用该方法之前,需要先给 s 参数分配好内存空间。
void resetStatus() 重置数据流的状态
void rollbackTransaction() 回滚事务
void setByteOrder(QDataStream::ByteOrder bo) 1.将序列化字节顺序设置为bo,bo参数可以是QDataStream:BigEndian或QDataStream::LittleEndian,默认设置是big endian。除非您有特殊要求,否则我们建议您离开这个设置
void setDevice(QIODevice *d) 构造一个对字节数组a进行操作的只读数据流
void setFloatingPointPrecision(QDataStream::FloatingPointPrecision precision) 设置数据流的浮点精度
void setStatus(QDataStream::Status status) 设置数据流的状态,将数据流的状态设置为给定的“status”。在调用resetStatus()之前,将忽略对setStatus()的后续调用。
void setVersion(int v) 不同版本的 Qt 中,同名称的数据类型也可能存在差异,通过调用此方法手动指定版本号,可以确保读取数据的一致性。
int skipRawData(int len) 跳过文件中的 len 个字节,返回实际跳过的字节数。
void startTransaction() 开始事务
QDataStream::Status status() const 返回数据流的状态
int version() const 返回序列化的版本号
QDataStream & writeBytes(const char *s, uint len) 将长度 len 和 s 一起写入到文件中,对于 writeBytes() 写入的数据,只能用 readBytes() 方法读取。
int writeRawData(const char *s, int len) 将 s 中前 len 字节的数据写入文件,返回值表示成功写入的字节数。
QDataStream & operator<<(qint8 i)
QDataStream & operator<<(quint8 i)
QDataStream & operator<<(qint16 i)
QDataStream & operator<<(quint16 i)
QDataStream & operator<<(qint32 i)
QDataStream & operator<<(quint32 i)
QDataStream & operator<<(qint64 i)
QDataStream & operator<<(quint64 i)
QDataStream & operator<<(std::nullptr_t ptr)
QDataStream & operator<<(bool i)
QDataStream & operator<<(qfloat16 f)
QDataStream & operator<<(float f)
QDataStream & operator<<(double f)
QDataStream & operator<<(const char *s)
QDataStream & operator>>(qint8 &i)
QDataStream & operator>>(quint8 &i)
QDataStream & operator>>(qint16 &i)
QDataStream & operator>>(quint16 &i)
QDataStream & operator>>(qint32 &i)
QDataStream & operator>>(quint32 &i)
QDataStream & operator>>(qint64 &i)
QDataStream & operator>>(quint64 &i)
QDataStream & operator>>(std::nullptr_t &ptr)
QDataStream & operator>>(bool &i)
QDataStream & operator>>(qfloat16 &f)
QDataStream & operator>>(float &f)
QDataStream & operator>>(double &f)
QDataStream & operator>>(char *&s)

示例

#include 
#include 
#include 
int main(int argc, char *argv[])
{
    //指定要写入文件的数据
    qint32 nums[5]={1,2,3,4,5};
    QFile file("D:/demo.dat");
    file.open(QIODevice::WriteOnly);
    //创建 QDataStream 对象
    QDataStream out(&file);
    //将 nums 数组中的整数逐个写入到二进制文件中
    for(int i=0;i<5;i++){
      out << nums[i];
    }
    file.close();
    //再次打开文件,读取文件中存储的二进制数据
    file.open(QIODevice::ReadOnly);
    QDataStream in(&file);
    //读取二进制文件中的数据
    while(!in.atEnd()){
        //每次读取一个整数
        qint32 num;
        in >> num;
        qDebug() << num;
    }
    return 0;
}

QTextStream

读写文件文件

构造方法

  • QTextStream(const QByteArray &array, QIODevice::OpenMode openMode = QIODevice::ReadOnly):构造一个对array进行操作的QTextStream。不管openMode中的值是什么,数组都是只读的。
  • QTextStream(QByteArray *array, QIODevice::OpenMode openMode = QIODevice::ReadWrite):构造一个对array进行操作的QTextStream。在内部,数组由QBuffer包装
  • QTextStream(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite):构造一个对string进行操作的QTextStream
  • QTextStream(FILE *fileHandle, QIODevice::OpenMode openMode = QIODevice::ReadWrite):构造一个对 fileHandle 操作的QTextStream,在内部,创建一个QFile来处理文件指针
  • QTextStream(QIODevice *device):构造一个在device上运行的QTextStream对象
  • QTextStream():构造一个空的QTextStream对象

QTextStream常用方法

方法 说明
bool atEnd() const 判断是否读到文件末尾,如果已经达到末尾,返回 true,否则返回 false。
bool autoDetectUnicode() const 如果启用自动Unicode检测,则返回true,否则返回false。默认情况下启用自动Unicode检测
QTextCodec * codec() const 返回当前分配给流的编解码器
QIODevice * device() const 返回与QTextStream关联的当前设备,如果没有分配设备,则返回0
QTextStream::FieldAlignment fieldAlignment() const 返回当前字段对齐方式
int fieldWidth() const 返回当前字段宽度
void flush() 刷新任何等待写入设备的缓冲数据。如果QTextStream操作一个字符串,这个函数什么也不做
bool generateByteOrderMark() const 如果在使用UTF编解码器时将QTextStream设置为生成UTF BOM(字节顺序标记),则返回true;否则返回false。UTF BOM生成默认设置为false
int integerBase() const 返回当前整数的基数。0表示在读取时检测基数,或在生成数字时检测10 (decimal)
QLocale locale() const 返回此流的语言环境。默认的语言环境是C
QTextStream::NumberFlags numberFlags() const 返回当前数字标志
QChar padChar() const 返回当前填充字符
qint64 pos() const 返回对应流位置的设备位置,或者如果发生错误时返回-1。
QString read(qint64 maxlen) 从文件中读最多 maxlen 个字符,返回这些字符组成的 QString 字符串。
QString readAll() 从文件中读取所有内容,返回由读取内容组成的 QString 字符串。
QString readLine(qint64 maxlen = 0) 默认读取一行文本,如果手动指定 maxlen 的值,则最多读取 maxlen 个字符,并返回读取内容组成的 QString 字符串。
bool readLineInto(QString *line, qint64 maxlen = 0)
QTextStream::RealNumberNotation realNumberNotation() const 返回当前的实数表示法
int realNumberPrecision() const 返回当前的实数精度,或生成实数时将写入的分数位数QTextStream
void reset() 重置QTextStream的格式选项,使其回到原来的构造状态。设备、字符串和任何缓冲数据都保持不变。
void resetStatus() 重置文本流的状态
bool seek(qint64 pos) 查找到设备中的位置pos。成功true;否则返回false
void setAutoDetectUnicode(bool enabled) 如果启用为真,QTextStream将尝试通过查看流数据来检测Unicode编码,看看是否可以找到UTF-16或UTF-32 BOM(字节顺序标记)。如果找到这个标记,QTextStream将用UTF编解码器替换当前的编解码器。这个函数可以与setCodec()一起使用。通常将编解码器设置为UTF-8,然后启用UTF-16检测
void setCodec(QTextCodec *codec) 将此流的编解码器设置为codec。编解码器用于解码从指定设备读取的任何数据,并对写入的任何数据进行编码。默认情况下,使用QTextCodec::codecForLocale(),并启用自动unicode检测
void setCodec(const char *codecName) 将此流的编解码器设置为codecName。codecName的常用值包括“ISO 8859-1”、“UTF-8”和“UTF-16”。如果不能识别编码,什么也不会发生
void setDevice(QIODevice *device) 将当前设备设置为设备。如果一个设备已经被分配,QTextStream将调用flush()之前的旧设备被替换
void setFieldAlignment(QTextStream::FieldAlignment mode) 设置对齐方式,通常与 setFieldWidth() 一起使用。
void setFieldWidth(int width) 设置每份数据占用的位置宽度为 width。将当前字段宽度设置为width。如果宽度为0(默认值),则字段宽度等于生成的文本的长度。
void setGenerateByteOrderMark(bool generate) generate为真,使用UTF编解码器,QTextStream将在任何数据写入设备之前插入BOM(字节顺序标记)。如果generate为false,则不插入BOM。在写入任何数据之前必须调用此函数。否则,它什么也不做
void setIntegerBase(int base) 将整数的基数设置为base,用于读取和生成数字。基数可以是2(二进制)、8(八进制)、10(十进制)或16(十六进制)。如果base为0,QTextStream将尝试通过检查流上的数据来检测base。在生成数字时,QTextStream假设基数为10,除非基数已被显式设置
void setLocale(const QLocale &locale) 将此流的区域设置为locale。指定的locale用于数字及其字符串表示形式之间的转换。默认的语言环境是C,它是一个特例——因为向后兼容的原因,没有使用千位组分隔符
void setNumberFlags(QTextStream::NumberFlags flags) 将当前数字标志设置为标志。flags是一组来自NumberFlag enum的标志,描述了对生成的代码进行格式化的选项(例如,是否总是写基数或数字符号)。
void setPadChar(QChar ch) 将字段对齐设置为模式。当与setFieldWidth()一起使用时,此函数允许生成文本对齐到左(AlignLeft)、右(AlignRight)、中(AlignCenter)对齐的格式化输出。
void setRealNumberNotation(QTextStream::RealNumberNotation notation) 将实数表示法设置为记数法(智能表示法、固定表示法、科学表示法)。当读取和生成数字时,QTextStream使用这个值来检测实数的格式
void setRealNumberPrecision(int precision) 将实数的精度设置为precision。此值描述生成实数时QTextStream应写入的分数位数。精度不能是负数。默认值是6
void setStatus(QTextStream::Status status) 将文本流的状态设置为给定的status。在调用resetStatus()之前,将忽略对setStatus()的后续调用
void setString(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite) 使用给定的openMode将当前字符串设置为string。如果一个设备已经被分配,QTextStream将调用flush()之前替换它
void skipWhiteSpace() 从流中读取和丢弃空白,直到检测到非空格字符,或者直到atEnd()返回true。这个函数在逐个字符读取流时非常有用。空白字符是QChar::isSpace()返回true的所有字符
QTextStream::Status status() const 返回文本流的状态
QString *string() const 返回分配给QTextStream的当前字符串,如果没有分配字符串,则返回0
QTextStream &operator<<(QChar c) 输出文本流
QTextStream &operator<<(char c)
QTextStream &operator<<(short i)
QTextStream &operator<<(unsigned short i)
QTextStream &operator<<(int i)
QTextStream &operator<<(unsigned int i)
QTextStream &operator<<(long i)
QTextStream &operator<<(unsigned long i)
QTextStream &operator<<(qlonglong i)
QTextStream &operator<<(qulonglong i)
QTextStream &operator<<(float f)
QTextStream &operator<<(double f)
QTextStream &operator<<(const QString &string)
QTextStream &operator<<(QStringView string)
QTextStream &operator<<(QLatin1String string)
QTextStream &operator<<(const QStringRef &string)
QTextStream &operator<<(const QByteArray &array)
QTextStream &operator<<(const char *string)
QTextStream &operator<<(const void *ptr)
QTextStream &operator>>(QChar &c)
QTextStream &operator>>(char &c)
QTextStream &operator>>(short &i)
QTextStream &operator>>(unsigned short &i)
QTextStream &operator>>(int &i)
QTextStream &operator>>(unsigned int &i)
QTextStream &operator>>(long &i)
QTextStream &operator>>(unsigned long &i)
QTextStream &operator>>(qlonglong &i)
QTextStream &operator>>(qulonglong &i)
QTextStream &operator>>(float &f)
QTextStream &operator>>(double &f)
QTextStream &operator>>(QString &str)
QTextStream &operator>>(QByteArray &array)
QTextStream &operator>>(char *c)

解决中文乱码的问题

在使用 QTextStream 读写有中文内容的文本文件时,为了能正确识别 Unicode 码,需要调用 setAutoDetectUnicode(true),设置 QTextStream 可以自动识别 Unicode 码,如果不做此设置,读取文件的中文将是乱码,无法正常显示。

QFile

QFile 类是直接与 IO 设备打交道,进行文件读写操作的类,使用 QFile 可以直接打开或保存文本文件。支持文本文件和二进制文件。
QFile 类支持对文件进行读取、写入、删除、重命名、拷贝等操作。

构造函数:

  • QFile(const QString &name, QObject *parent)
  • QFile(QObject *parent)
  • QFile(const QString &name)
  • QFile()

参数 name 用来指定要操作的目标文件,包含文件的存储路径和文件名,存储路径可以使用绝对路径(比如 “D:/Demo/test.txt”)或者相对路径(比如"./Demo/test.txt"),路径中的分隔符要用 “/” 表示。

QFile常用方法

方法 说明
bool copy(const QString &newName) 将当前文件的内容拷贝到名为 newName 的文件中,如果成功,方法返回 true,否则返回 false。copy 方法在执行复制操作之前,会关闭源文件。
bool exists() const 检查文件是否存在
bool link(const QString &linkName) 为文件创建快捷方式
bool open(FILE *fh, QIODevice::OpenMode mode, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle) 打开文件
bool open(int fd, QIODevice::OpenMode mode, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle) 打开文件
bool remove() 删除当前文件,成功返回 true,失败返回 false。
bool rename(const QString &newName) 对当前文件进行重命名,新名称为 newName,成功返回 true,失败返回 false。
void setFileName(const QString &name) 设置文件名
QString symLinkTarget() const 提供符号链接的目标文件
qint64 QFile::size() const 获取当前文件的大小。对于打开的文件,该方法返回文件中可以读取的字节数。
bool QIODevice::getChar(char *c) 从文件中读取一个字符,并存储到 c 中。读取成功时,方法返回 true,否则返回 false。
bool QIODevice::putChar(char c) 向文件中写入字符 c,成功时返回 true,否则返回 false。
QByteArray QIODevice::read(qint64 maxSize) 从文件中一次性最多读取 maxSize 个字节,然后返回读取到的字节。
qint64 QIODevice::read(char *data, qint64 maxSize) 从文件中一次性对多读取 maxSize 个字节,读取到的字节存储到 data 指针指定的内存控件中。该方法返回成功读取到的字节数。
QByteArray QIODevice::readAll() 读取文件中所有的数据。
qint64 QIODevice::readLine(char *data, qint64 maxSize) 每次从文件中读取一行数据或者读取最多 maxSize-1 个字节,存储到 data 中。该方法返回实际读取到的字节数。
qint64 QIODevice::write(const char *data, qint64 maxSize) 向 data 数据一次性最多写入 maxSize 个字节,该方法返回实际写入的字节数。
qint64 QIODevice::write(const char *data) 将 data 数据写入文件,该方法返回实际写入的字节数。
qint64 QIODevice::write(const QByteArray &byteArray) 将 byteArray 数组中存储的字节写入文件,返回实际写入的字节数。

QFile::open() 函数打开文件时需要传递 QIODevice::OpenModeFlag 枚举类型的参数

QIODevice::OpenModeFlag类型取值

  • QIODevice::ReadOnly:以只读方式打开文件,用于载入文件。
  • QIODevice::WriteOnly:以只写方式打开文件,用于保存文件。
  • QIODevice::ReadWrite:以读写方式打开。
  • QIODevice::Append:以添加模式打开,新写入文件的数据添加到文件尾部。
  • QIODevice::Truncate:以截取方式打开文件,文件原有的内容全部被删除。
  • QIODevice::Text:以文本方式打开文件,读取时“\n”被自动翻译为换行符,写入时字符串结束符会自动翻译为系统平台的编码,如Windows 平台下是“\r\n”。
  • QIODevice::NoOpen:不打开。
  • QIODevice::UnBuffered:不缓存

示例:QFile 类读写文本文件

#include 
#include 
int main(int argc, char *argv[])
{
    //创建 QFile 对象,同时指定要操作的文件
    QFile file("D:/demo.txt");
    //对文件进行写操作
    if(!file.open(QIODevice::WriteOnly|QIODevice::Text)){
        qDebug()<<"文件打开失败";
    }
    //向文件中写入两行字符串
    file.write("C语言中文网\n");
    file.write("http://c.biancheng.net");
    //关闭文件
    file.close();
    //重新打开文件,对文件进行读操作
    if(!file.open(QIODevice::ReadOnly|QIODevice::Text)){
        qDebug()<<"文件打开失败";
    }
    //每次都去文件中的一行,然后输出读取到的字符串
    char * str = new char[100];
    qint64 readNum = file.readLine(str,100);
    //当读取出现错误(返回 -1)或者读取到的字符数为 0 时,结束读取
    while((readNum !=0) && (readNum != -1)){
        qDebug() << str;
        readNum = file.readLine(str,100);
    }
    file.close();
    return 0;
}

示例:QFile 读写二进制文件

#include 
#include 
int main(int argc, char *argv[])
{
    //指定要写入文件的数据
    qint32 nums[5]={1,2,3,4,5};
    //写入文件之前,要将数据以二进制方式存储到字节数组中
    QByteArray byteArr;
    byteArr.resize(sizeof(nums));
    for(int i=0;i<5;i++){
        //借助指针,将每个整数拷贝到字节数组中
        memcpy(byteArr.data()+i*sizeof(qint32),&(nums[i]),sizeof(qint32));
    }
    //将 byteArr 字节数组存储到文件中
    QFile file("D:/demo.dat");
    file.open(QIODevice::WriteOnly);
    file.write(byteArr);
    file.close();
    //再次打开文件,读取文件中存储的二进制数据
    file.open(QIODevice::ReadOnly);
    QByteArray resArr = file.readAll();
    //输出读取到的二进制数据
    qDebug()<<"resArr: "<<resArr;
    //将二进制数据转化为整数
    char* data = resArr.data();
    while(*data){
        qDebug() << *(qint32*)data;
        data += sizeof(qint32);
    }
    return 0;
}

你可能感兴趣的:(QT,qt,c++,QFile,QDataStream,QTextStream)