Qt——Qt中的文件操作、文本流和数据流

1.Qt中的IO操作的处理方式

  • Qt通过统一的接口简化了文件与外部设备的操作方式
  • Qt中的文件被看作一种特殊的外部设备
  • Qt中的文件操作与外部设备的操作相同

2.IO操作中的关键函数接口

  • 打开设备:bool open(OpenMode mode)
  • 读取数据:QByteArray read(qint64 maxSize)
  • 写入数据:qint64 write(const QByteArray& byteArray)
  • 关闭设备:void close()

IO操作的本质:连续存储空间的数据读写

Qt中IO设备的类型

  • 顺序存取设备:只能从头开始顺序的读写数据,不能指定数据的读写位置

  • 随机存取设备:可以定位到任意的位置进行数据的读写

    #include <QCoreApplication>
    #include <QFile>
    #include <QByteArray>
    #include <QDebug>
    #include <QFileInfo>
    #include <QDateTime>

    void write(QString f)
    {
    QFile file(f);
    //使用只写的方式打开文件,写入文本
    if( file.open(QIODevice::WriteOnly | QIODevice::Text) )
    {
    file.write("Hello World\n");
    file.write("QT Study");
    file.close();
    }
    }
    void read(QString f)
    {
    QFile file(f);
    if( file.open(QIODevice::ReadOnly | QIODevice::Text ))
    {
    QByteArray ba1= file.read(4); //读取四个字符
    QByteArray ba2 = file.readLine(); //一行一行读取
    QString s1(ba1);
    QString s2(ba2);
    qDebug() << s1;
    qDebug() << s2;
    file.close();
    }
    }

    void info(QString f)
    {
    QFile file(f);
    QFileInfo info(file);

    复制代码
      qDebug() << info.exists();// 判断文件是否存在
      qDebug() << info.isFile(); //判断这个路径是不是文件,是文件返回true,目录返回false
      qDebug() << info.isReadable(); //判断是否有读取权限
      qDebug() << info.isWritable(); //判断是否有写入权限
      qDebug() << info.created(); //创建时间
      qDebug() << info.lastRead(); //最后一次读取文件的时间
      qDebug() << info.lastModified(); //最后一次修改的时间
      qDebug() << info.path(); //文件的完整路径
      qDebug() << info.fileName(); //文件名
      qDebug() << info.suffix(); //文件后缀名
      qDebug() << info.size(); //文件大小

    }
    int main(int argc, char *argv[])
    {
    QCoreApplication a(argc, argv);

    复制代码
      //如果有这个文件,则写入,如果没有,则新建并写入
      //write("C:/Users/聪/Desktop/新建 文本文档.txt");
      read("C:/Users/聪/Desktop/新建 文本文档.txt");
      info("C:/Users/聪/Desktop/新建 文本文档.txt");
      return QCoreApplication::exec();

    }

3.Qt中的文件操作

Qt中提供了临时文件操作类(QTemporaryFile)

  • 安全创建了一个全局唯一的临时文件

  • 当对象销毁时对应的临时文件将被删除

  • 临时文件的打开方式为QIODevice::ReadWrite

  • 临时文件常用于大数据传递或者进程间通信的场合

    #include <QCoreApplication>
    #include <QTemporaryFile>
    #include <QFileInfo>
    #include <QDebug>

    int main(int argc, char *argv[])
    {
    QCoreApplication a(argc, argv);

    复制代码
      QTemporaryFile tempFile; //临时文件不需要文件名
    
      if( tempFile.open() )
      {
          tempFile.write("Hello World");
          tempFile.close();
      }
      QFileInfo info(tempFile);
      qDebug() << info.isFile();
      qDebug() << info.path();
      qDebug() << info.fileName();
    
      return QCoreApplication::exec();

    }

运行结果:

true

"C:/Users/聪/AppData/Local/Temp"

"test15.hcMpOb"

4.Qt中的文件分为两大类

  • 文本文件------文件内容时可读的文本字符
  • 数据文件------文件内容是直接的二进制数据

如何将一个浮点数据写入文本文件和数据文件?

复制代码
#include <QCoreApplication>
#include <QFile>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QFile file("C:/Users/聪/Desktop/test.hex");
    if( file.open(QIODevice::WriteOnly) )
    {
        QString dt = "Hello World";
        double value = 3.14;
        file.write(dt.toStdString().c_str()); //QString类型不能直接写入文件,所以先转为C语言风格的字符串
        //第一个参数必须是 *char 类型的指针(地址)
        file.write(reinterpret_cast<char*>(&value), sizeof(value));//file.write() 不接收变量本身,只接收内存地址

        file.close();
    }
    if( file. open(QIODevice::ReadOnly) )
    {
        QString dt = "";
        double value = 0;
        dt = QString(file.read(12));
        file.read(reinterpret_cast<char*>(&value), sizeof(value));
        file.close();

        qDebug() << dt;
        qDebug() <<value;
    }

    return QCoreApplication::exec();
}

5.Qt提供辅助类简化了文本文件/数据文件的读写

  • QTextStream------写入的数据全部转换为可读文本

  • QDataStream------写入的数据根据类型转化为二进制数据

    #include <QCoreApplication>
    #include <QFile>
    #include <QTextStream>
    #include <QDataStream>
    #include <QDebug>

    void text_stream_test(QString f)
    {
    QFile file(f);
    //写文件
    if( file.open(QIODevice::WriteOnly | QIODevice::Text) )
    {
    QTextStream out(&file);

    复制代码
          // 像 cout 一样,直接输出各种数据
          out << QString("Hello World") << endl;
          out << QString("Result: ") << endl;
          out << 5 << "*" << 6 << "=" << 5*6 <<endl;
          file.close();
      }
      //读文件
      if( file.open(QIODevice::ReadOnly | QIODevice::Text) )
      {
          QTextStream in(&file);
          while( !in.atEnd() )
          {
              QString line = in.readLine();
              qDebug() << line;
          }
          file.close();
      }

    }

    void data_stream_test(QString f)
    {
    QFile file(f);
    if( file.open(QIODevice::WriteOnly) )
    {
    QDataStream out(&file);

    复制代码
          out << QString("Hello World");
          out << QString("Result: ");
          out << 3.14;
    
          file.close();
      }
      if( file.open(QIODevice::ReadOnly) )
      {
          QDataStream in(&file);
          QString dt = "";
          QString result = "";
          double value = 0;
    
          in >> dt;
          in >> result;
          in >> value;
    
          file.close();
    
          qDebug() << dt;
          qDebug() << result;
          qDebug() << value;
      }

    }

    int main(int argc, char *argv[])
    {
    QCoreApplication a(argc, argv);
    text_stream_test("C:/Users/聪/Desktop/新建 文本文档.txt");
    data_stream_test("C:/Users/聪/Desktop/data.txt");

    复制代码
      return QCoreApplication::exec();

    }

运行结果:

"Hello World"

"Result: "

"5*6=30"

"Hello World"

"Result: "

3.14

6.数据流文件的版本信息

不同Qt版本的数据流文件格式可能不同

相关推荐
ACP广源盛139246256732 小时前
长距传输全能芯 @ACP#GSV5800 Type‑C/DP1.4/HDMI2.0 高速延长芯片
c语言·开发语言·网络·人工智能·嵌入式硬件·计算机外设·电脑
存在的五月雨2 小时前
Python操作 调用yolov8n-pose
开发语言·python·yolo
cmc10282 小时前
230.C语言循环的相关延时计算
c语言·开发语言
Fate_I_C2 小时前
Kotlin 基础语法快速回顾
android·开发语言·kotlin
一只大袋鼠2 小时前
MyBatis 进阶实战(四): 连接池、动态 SQL、多表关联(一对多 / 多对一 / 多对多)
java·开发语言·数据库·sql·mysql·mybatis
梅羽落2 小时前
conda下载python老是404下载失败
开发语言·python·conda
电商API&Tina2 小时前
【1688API接口】1688 开放平台 API 接入心得
java·开发语言·数据库·python·sql·json
Rabitebla2 小时前
【C++】手撕日期类——运算符重载完全指南(含易错点+底层逻辑分析)
java·c语言·开发语言·数据结构·c++·算法·链表
I_belong_to_jesus2 小时前
信号处理新书推荐-MATLAB信号处理从入门到精通
开发语言·matlab·信号处理