九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Qt 5——文件系統(tǒng)操作

文件系統(tǒng)

文件操作是應(yīng)用程序必不可少的部分。Qt 作為一個(gè)通用開發(fā)庫,提供了跨平臺(tái)的文件操作能力。Qt 通過QIODevice提供了對(duì) I/O 設(shè)備的抽象,這些設(shè)備具有讀寫字節(jié)塊的能力。下面是 I/O 設(shè)備的類圖(Qt5):

  • QIODevice:所有 I/O 設(shè)備類的父類,提供了字節(jié)塊讀寫的通用操作以及基本接口;
  • QFileDevice:Qt5新增加的類,提供了有關(guān)文件操作的通用實(shí)現(xiàn)。
  • QFlie:訪問本地文件或者嵌入資源;
  • QTemporaryFile:創(chuàng)建和訪問本地文件系統(tǒng)的臨時(shí)文件;
  • QBuffer:讀寫QbyteArray, 內(nèi)存文件;
  • QProcess:運(yùn)行外部程序,處理進(jìn)程間通訊;
  • QAbstractSocket:所有套接字類的父類;
  • QTcpSocket:TCP協(xié)議網(wǎng)絡(luò)數(shù)據(jù)傳輸;
  • QUdpSocket:傳輸 UDP 報(bào)文;
  • QSslSocket:使用 SSL/TLS 傳輸數(shù)據(jù);

1 基本文件操作

QFile提供了從文件中讀取和寫入數(shù)據(jù)的能力。
我們通常會(huì)將文件路徑作為參數(shù)傳給QFile的構(gòu)造函數(shù)。不過也可以在創(chuàng)建好對(duì)象最后,使用setFileName()來修改。

QFile需要使用 / 作為文件分隔符,不過,它會(huì)自動(dòng)將其轉(zhuǎn)換成操作系統(tǒng)所需要的形式。例如 C:/windows 這樣的路徑在 Windows 平臺(tái)下同樣是可以的。

QFile主要提供了有關(guān)文件的各種操作,比如打開文件、關(guān)閉文件、刷新文件等。我們可以使用QDataStream或QTextStream類來讀寫文件,也可以使用QIODevice類提供的read()、readLine()、readAll()以及write()這樣的函數(shù)。值得注意的是,有關(guān)文件本身的信息,比如文件名、文件所在目錄的名字等,則是通過QFileInfo獲取,而不是自己分析文件路徑字符串。
下面我們使用一段代碼來看看QFile的有關(guān)操作:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
 
    QFile file("in.txt");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qDebug() << "Open file failed.";
        return -1;
    } else {
        while (!file.atEnd()) {
            qDebug() << file.readLine();
        }
    }
 
    QFileInfo info(file);
    qDebug() << info.isDir();
    qDebug() << info.isExecutable();
    qDebug() << info.baseName();
    qDebug() << info.completeBaseName();
    qDebug() << info.suffix();
    qDebug() << info.completeSuffix();
 
    return app.exec();
}
  1. 我們首先使用QFile創(chuàng)建了一個(gè)文件對(duì)象。
    這個(gè)文件名字是 in.txt。如果你不知道應(yīng)該把它放在哪里,可以使用QDir::currentPath()來獲得應(yīng)用程序執(zhí)行時(shí)的當(dāng)前路徑。只要將這個(gè)文件放在與當(dāng)前路徑一致的目錄下即可。
  2. 使用open()函數(shù)打開這個(gè)文件,打開形式是只讀方式,文本格式。
    這個(gè)類似于fopen()的 r 這樣的參數(shù)。open()函數(shù)返回一個(gè) bool 類型,如果打開失敗,我們?cè)诳刂婆_(tái)輸出一段提示然后程序退出。否則,我們利用 while 循環(huán),將每一行讀到的內(nèi)容輸出。
  3. 可以使用QFileInfo獲取有關(guān)該文件的信息。
    QFileInfo有很多類型的函數(shù),我們只舉出一些例子。比如:
    • isDir()檢查該文件是否是目錄;
    • isExecutable() 檢查該文件是否是可執(zhí)行文件等。
    • baseName() 可以直接獲得文件名;
    • completeBaseName() 獲取完整的文件名
    • suffix() 則直接獲取文件后綴名。
    • completeSuffix() 獲取完整的文件后綴

我們可以由下面的示例看到,baseName()和completeBaseName(),以及suffix()和completeSuffix()的區(qū)別

QFileInfo fi("/tmp/archive.tar.gz");
QString base  = fi.baseName();  // base = "archive"
QString base  = fi.completeBaseName();  // base = "archive.tar"
QString ext   = fi.suffix();  // ext = "gz"
QString ext   = fi.completeSuffix();  // ext = "tar.gz"

2 二進(jìn)制文件讀寫

我們可以直接讀寫沒有編碼的二進(jìn)制數(shù)據(jù),例如圖像、視頻、音頻等。
QDataStream既能夠存取 C++ 基本類型,如 int、char、short 等,也可以存取復(fù)雜的數(shù)據(jù)類型,例如自定義的類。實(shí)際上,QDataStream對(duì)于類的存儲(chǔ),是將復(fù)雜的類分割為很多基本單元實(shí)現(xiàn)的。

結(jié)合QIODevice,QDataStream可以很方便地對(duì)文件、網(wǎng)絡(luò)套接字等進(jìn)行讀寫操作。我們從代碼開始看起:

QFile file("file.dat");
file.open(QIODevice::WriteOnly);
QDataStream out(&file);
out << QString("the answer is");
out << (qint32)42;

如果你直接運(yùn)行這段代碼,你會(huì)得到一個(gè)空白的 file.dat,并沒有寫入任何數(shù)據(jù)。這是因?yàn)槲覀兊膄ile沒有正常關(guān)閉。為性能起見,數(shù)據(jù)只有在文件關(guān)閉時(shí)才會(huì)真正寫入。因此,我們必須在最后添加一行代碼

file.close(); // 如果不想關(guān)閉文件,可以使用 file.flush();

接下來我們將存儲(chǔ)到文件中的答案取出來

QFile file("file.dat");
file.open(QIODevice::ReadOnly);
QDataStream in(&file);
QString str;
qint32 a;
in >> str >> a;

唯一需要注意的是,你必須按照寫入的順序,將數(shù)據(jù)讀取出來。順序顛倒的話,程序行為是不確定的,嚴(yán)重時(shí)會(huì)直接造成程序崩潰。

QDataStream同QIODevice有什么區(qū)別?

區(qū)別在于,QDataStream提供流的形式,性能上一般比直接調(diào)用原始 API 更好一些。

3 文本文件讀寫

QTextStream使用 16 位的QChar作為基礎(chǔ)的數(shù)據(jù)存儲(chǔ)單位,同樣,它也支持 C++ 標(biāo)準(zhǔn)類型,如 int 等。實(shí)際上,這是將這種標(biāo)準(zhǔn)類型與字符串進(jìn)行了相互轉(zhuǎn)換。

QTextStream同QDataStream的使用基本一致,例如下面的代碼將把“The answer is 42”寫入到 file.txt 文件中:

QFile data("file.txt");
if (data.open(QFile::WriteOnly | QIODevice::Truncate)) 
{
    QTextStream out(&data);
    out << "The answer is " << 42;
}

這里,我們?cè)趏pen()函數(shù)中增加了QIODevice::Truncate打開方式。我們可以從下表中看到這些打開方式的區(qū)別:

QTextStream與QDataStream注意

雖然QTextStream的寫入內(nèi)容與QDataStream一致,但是讀取時(shí)卻會(huì)有些困難:

QFile data("file.txt");
if (data.open(QFile::ReadOnly)) 
{
    QTextStream in(&data);
    QString str;
    int ans = 0;
    in >> str >> ans;
}

在使用QDataStream的時(shí)候,這樣的代碼很方便,但是使用了QTextStream時(shí)卻有所不同:讀出的時(shí)候,str 里面將是 The answer is 42,ans 是 0。這是因?yàn)楫?dāng)使用QDataStream寫入的時(shí)候,實(shí)際上會(huì)在要寫入的內(nèi)容前面,額外添加一個(gè)這段內(nèi)容的長(zhǎng)度值。而以文本形式寫入數(shù)據(jù),是沒有數(shù)據(jù)之間的分隔的。因此,使用文本文件時(shí),很少會(huì)將其分割開來讀取,而是使用諸如使用:

  • QTextStream::readLine() 讀取一行
  • QTextStream::readAll()讀取所有文本

這種函數(shù)之后再對(duì)獲得的QString對(duì)象進(jìn)行處理。

默認(rèn)情況下,QTextStream的編碼格式是 Unicode,如果我們需要使用另外的編碼,可以使用:

stream.setCodec("UTF-8");

這樣的函數(shù)進(jìn)行設(shè)置。

Qt 工程案例

#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QMessageBox>
#include <QFile>
#include <QTextCodec>
#include <QFileInfo>
#include <QDebug>
#include <QDateTime>
#include <QTextStream>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //點(diǎn)擊按鈕 選取文件
    connect(ui->pushButton,&QPushButton::clicked,[=](){

         QString path = QFileDialog::getOpenFileName(this,"打開文件","C:\\Users\\zhangtao\\Desktop");
         if(path.isEmpty())
         {
            QMessageBox::warning(this,"警告","打開失敗");
         }
         else
         {
             //將路徑 放入到lineEdit
             ui->lineEdit->setText(path);
             //讀取文件
             //QFile默認(rèn)支持UTF-8格式

             //QTextCodec * codec = QTextCodec::codecForName("gbk");

             QFile file(path); //參數(shù)路徑名稱
             //指定打開方式(只讀)
             //file.open(QIODevice::ReadOnly);
             file.open(QFileDevice::ReadOnly);

             QByteArray array;
             array = file.readAll();

//             while( !file.atEnd())
//             {
//               array += file.readLine();
//             }

             //設(shè)置到 文本編輯框中
             ui->textEdit->setText(array);
             file.close();
             //讀gbk
             // ui->textEdit->setText( codec->toUnicode(array));


             //寫文件
             //重新指定打開方式
//             file.open(QFileDevice::Append);
//             file.write("哦哦哦哦哦哦");
//             file.close();

             //通過QFileInfo讀取文件信息
               QFileInfo info(path);
               qDebug() << "路徑: "<< info.filePath() << " 名稱: "
                        <<info.fileName() << " 文件大小" << info.size() << "后綴名:"<<info.suffix();

               qDebug() << "創(chuàng)建日期:" <<info.created().toString("yyyy-MM-dd hh:mm:ss");
               qDebug() << "修改日期:" <<info.lastModified().toString("yyyy/MM/dd hh:mm:ss");
         }

    });



    //文件流讀寫文件
    //分類:文本流(基礎(chǔ)數(shù)據(jù)類型) 和 數(shù)據(jù)流 (大型QImage)

    //文本流
//    QFile file("aaa.txt");
//    file.open(QFileDevice::WriteOnly);
//    QTextStream stream(&file);
//    stream<< QString("hello World") << 123456 ;
//    file.close();

//    //讀取
//    file.open(QFileDevice::ReadOnly);
//    QString str;
//    //stream >>str; //讀取空格 結(jié)束
//    str = stream.readAll();
//    qDebug() << str;

    //數(shù)據(jù)流 二進(jìn)制
    QFile file("bbb.txt");
    file.open(QFileDevice::WriteOnly);
    QDataStream stream(&file);
    stream << QString("hello World") << 123456;
    file.close();

    //讀數(shù)據(jù)
    file.open(QFileDevice::ReadOnly);
    QString str;
    int num;
    stream >>str >> num;
    qDebug() << str << num;

}

Widget::~Widget()
{
    delete ui;
}

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Qt 文件處理
QT 讀取txt 文件
QT學(xué)習(xí) 之 文本文件讀寫
(轉(zhuǎn))4.3加載和保存(LoadingandSaving)
Qt讀寫文件(2種方式)實(shí)現(xiàn)詳解
Qt操作xml文件(增刪改功能)
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服