Qt之文件系统

发布时间 2023-10-05 12:06:30作者: TechNomad

一、文本文件的读写

1.QFile读取文本文件

QFile类是直接与IO设备打交道,进行文件读写操作的类,使用QFile可以直接打开或保存文本文件。

示例代码:

void MainWindow::on_btn_clicked()
{
    QString curPath = QDir::currentPath();
    QString dlgTitle = "打开一文件";
    QString filter = "程序文件(*.h *.cpp);;文本文件(*.txt);;所有文件(*.*)";
    QString fileName = QFileDialog::getOpenFileName(this, dlgTitle, curPath, filter);
    if (fileName.isEmpty()) {
        return;
    }

    QFile file(fileName);
    if (!file.exists()) {
        qDebug() << "文件不存在";

        return;
    }

    if (!file.open(QIODevice::ReadOnly |QIODevice::Text)) {
        qDebug() << "文件打开失败";

        return;
    }

    m_pTextEdit->setPlainText(file.readAll());
    file.close();
}

定义QFile对象变量fileName时将文件名传递给它,检查文件存在后,通过open()函数打开文件。

QFile::open()函数打开文件时需要传递QIODevice::OpenModeFlag枚举类型的参数,决定文件以什么方式打开,QIODevice::OpenModeFlag类型的主要取值如下:

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

这些取值可以组合,例如QIODevice::ReadOnly | QIODevice::Text表示只读和文本方式打开文件;文本内容读取结束后,需要调用QFile::close()函数关闭文件。

2.QFile写入文本文件

void MainWindow::on_btn_clicked()
{
    QString curPath = QDir::currentPath();
    QString dlgTitle = "另存为一个文件";
    QString filter = "程序文件(*.h *.cpp);;文本文件(*.txt);;所有文件(*.*)";
    QString fileName = QFileDialog::getSaveFileName(this, dlgTitle, curPath, filter);
    if (fileName.isEmpty()) {
        return;
    }

    QFile file(fileName);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
        qDebug() << "文件打开失败";

        return;
    }

    QString str = m_pTextEdit->toPlainText(); //整个内容作为字符串
    QByteArray strBytes = str.toUtf8(); //转换为字节数组
    qint64 ret = file.write(strBytes, strBytes.length()); //写入文件
    if (ret != strBytes.length()) {
        qDebug() << "文件写入失败";
    }
    file.close();
}

为了保存文件,用open()打开文件时,使用的模式是QIODevice::WriteOnly | QIODevice::Text。使用WriteOnly隐含着Truncate,即删除文件原有内容,并将QString类型的文本内容通过toUtf8()函数转换为UTF8编码的字节数组strBytes,然后调用QFile::write()函数将字节数组内容写入文件。