Qt文件讀寫操作


原文地址:https://www.cnblogs.com/flowingwind/p/8336159.html

QFile Class

1.read讀文件

  • 加載文件對象  QFile file("文件地址");
  • 打開加載的文件file.open(打開方式);
  • 操作文件
  • 關閉打開的文件file.colse();
復制代碼
void Widget::on_pushButton_clicked()
{
    QFile file("L:/qtpro/_qtApp/text/t.txt");
    file.open(QIODevice::ReadOnly | QIODevice::Text);
    QByteArray t = file.readAll();
    ui->text_r->setText(QString(t));
    file.close();
}
復制代碼

2.wirte寫文件

  • 以純文本的形式讀取要保存文件到QString對象 //ui->text_e->toPlainText();
  • 創建QFile 對象保存文件
  • 打開QFile對象
  • 寫入文件操作
  • 關閉打開的文件;
復制代碼
void Widget::on_pushButton_2_clicked()
{
    QString e = ui->text_e->toPlainText();
    QFile file("L:/qtpro/_qtApp/text/e.txt");
    file.open(QIODevice::WriteOnly | QIODevice::Text);
    file.write(e.toUtf8());
    file.close();
}
復制代碼

細節優化處理

  • read文件添加讀取文件選擇項 QFileDialog::getOpenFileName();
  • 打開文件是否成功的判斷;
  • 按行讀取文件,可控制讀取行數與每行字符數;
  • write文件創建保存路徑QFileDialog::getSaveFileName(); 
復制代碼
void Widget::on_pushButton_clicked()
{
    QFile file;
    QString f = QFileDialog::getOpenFileName(this, QString("選擇文件"), QString("/"),QString("TEXT(*.txt)"));
    file.setFileName(f);
    if(file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        QByteArray t ;
        while(!file.atEnd())
        {
            t += file.readLine();
        }
        ui->text_r->setText(QString(t));
        file.close();
    }
}

void Widget::on_pushButton_2_clicked()
{
    QString e = ui->text_e->toPlainText();
    QFile file;
    file.setFileName(QFileDialog::getSaveFileName(this, QString("保存路徑"), QString("/"),QString("TEXT(*.txt)")));
    file.open(QIODevice::WriteOnly | QIODevice::Text);
    file.write(e.toUtf8());
    file.close();
}
復制代碼

各編碼轉換

QString -> QByteArray      QString.toUtf8();

QByteArray -> std::string  QByteArray.toStdString();

std::string -> char *        string.date();

常用靜態函數:

 

QFileDialog::getOpenFileName()    //獲取指定文件路徑名返回QString

QFileDialog::getExistingDirectory()  //獲取指定路徑返回QString

QFileDialog::getSaveFileName()    //獲取指定保存路徑返回QString

輔助配合使用的類:

 

QFileInfo class

獲取文件信息;

復制代碼
QFileInfo類用於讀取文件的屬性信息

    QFile file(f);
    QFileInfo info(file);
  
    qDebug() << info.exists();
    qDebug() << info.isFile();
    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();
復制代碼

 

二、文本流與數據流

QT中將文件分為文本文件和數據文件,文本文件內容是可讀的文本字符,數據文件的內容是二進制數據。

QFile直接支持文本文件和數據文件的操作,主要函數接口如下:

  •     qint64 read( char * data, qint64 maxSize) //數據流讀取
  •     QByteArray read( qint64 maxSize) //文本流方式讀取
  •  QByteArray readAll() //文本流方式讀取
  •  QByteArray readLine()//文本流方式讀取
  •     qint64 write(const char * data, qint64 maxSize)
  •     qint64 write(const QByteArray & byteArray)

為了簡化文本文件和數據文件的讀寫操作,QT提供了QTextStream和QDataStream輔助類。QTextStream可將寫入的數據全部轉換為可讀文本,QDataStream可將寫入的數據根據類型轉換為二進制數據。

QTemporaryFile是QT中的臨時文件操作類,用來安全創建全局唯一的臨時文件,QTemporaryFile對象銷毀時對應的臨時文件將被刪除,臨時文件的打開方式為QIODevice::ReadWrite,臨時文件常用於大數據傳遞或者進程間通信場合。

復制代碼
QTemporaryFile tempFile;
if( tempFile.open() )
{  
    tempFile.write("D.T.Software");
    tempFile.close();
}
復制代碼

QDataStream Class

數據流操作文件:

創建流對象 QDataStream date;

int a= xxxx;

string b = "xxxxxxxxx" ;

將數據存在流中 date >> a >> b;

int aa;

string bb;

從流中取出數據 date << aa << bb;

QDataStream在不同的QT版本中數據流文件格式可能是不同的,如果數據流文件需要在不同版本的QT程序間傳遞時需要考慮版本問題。

void setVersion(int v)

int version() const

QTextStream Class

文本方式操作文件:

創建流對象 QTextStream date;

date.setCodec();支持對文件讀取編碼設置(有效解決亂碼問題)

QBuffer

 QBuffer類為QByteArray提供QIODevice接口。

目前先理解為一個創建一個緩存文件;

QT中預定義了緩沖區的類QBuffer,可以將緩沖區看成一種特殊的IO設備,文件流輔助類可以直接用於操作緩沖區。QBuffer緩沖區寫入和讀取的數據必須是同一種數據類型,不能混合多種數據類型。

    QBuffer的使用場合:

    A、線程間不同類型的數據傳遞

    B、緩存外部設備中的數據返回

    C、數據讀取速度小於寫入速度

總結:

讀寫操作主要方法有read();readAll();readline(),write();

附錄:

目錄操作

1、QDir

    QT中提供了目錄操作類QDir,QDir功能如下:

    A、目錄分隔符統一使用’/’

    B、能夠對目錄進行任意操作(創建、刪除、重命名)

    C、能夠獲取指定目錄中的所有條目(文件和文件夾)

    D、能夠使用過濾字符串獲取指定條目

    E、能夠獲取系統中的所有根目錄

    QDir使用方法如下:

復制代碼
 QDir dir;
    QString path("../qt/test");
    if(!dir.exists())
    {
        dir.mkdir(path);
    }
    else
    {
        dir.cd(path);
        QStringList list = dir.entryList();
        for(int i = 0; i < list.count(); i++)
        {
            qDebug() << list[i];
        }
    }

//計算文件大小
unsigned int FileSize(QString path)
{
    QFileInfo info(path);
    unsigned int ret = 0;
    if(info.isFile())
    {
        ret = info.size();
    }
    else if(info.isDir())
    {
        QDir dir(path);
        QFileInfoList list = dir.entryInfoList();
        for(int i = 0; i < list.count(); i++)
        {
            if((list[i].fileName() != ".") && (list[i].fileName() != ".."))
            {
                ret += FileSize(list[i].absoluteFilePath());
            }
        }
    }
    return ret;
}
復制代碼

2、QFileSystemWatcher

QT中預定義了用於監控文件和目錄變化的類QFileSystemWatcher,

QFileSystemWatcher主要功能如下:

    A、能夠監控特定目錄和文件的狀態

    B、能夠同時對多個文件和目錄進行監控

    C、當目錄或文件發生改變時觸發信號

    D、通過信號與槽的機制捕捉信號並做出響應

    通常要使用QFileSystemWatcher需要自定義文件監視類。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM