日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt中的文件操作

發布時間:2025/4/5 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt中的文件操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1 文件讀寫類
      • 1.1 QFile
      • 1.2 QTextStream和QDataStream
    • 2 文件輔助類
      • 2.1 QFileInfo
    • 3 臨時文件類
      • 3.1 QTemporaryFile

1 文件讀寫類

1.1 QFile

QFile簡介:

  • QFile是Qt中用于文件操作的類。
  • QFile對象對應到計算機上的一個文件。

疑問:如何使用ReadWrite對文件進行操作呢?先放在這里。


文本文件和數據文件:

Qt中將文件類型分為2大類:

  • 文本文件:文件內容是可讀的文本字符。
  • 數據文件:文件內容是直接的二進制數據。

QFile直接支持文本文件和數據文件的讀寫:

思考:如何將一個浮點數據寫入文本文件和數據文件?

#include <QtCore/QCoreApplication> #include <QFile> #include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QFile file("C:/Users/hp/Desktop/test.hex");if( file.open(QIODevice::WriteOnly) ) // 不指明就是二進制文件{QString dt = "D.T.Software";double value = 3.14;file.write(dt.toStdString().c_str());file.write(reinterpret_cast<char*>(&value), sizeof(value));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 a.exec(); }

可以看到上面的寫入是很麻煩的,并且對于文件寫入來說都是講一段內存空間中的數據寫入文件中,而不區分文本文件和數據文件。

為了方便的對文本文件和數據文件,我們可以借助QTextStream和QDataStream。

1.2 QTextStream和QDataStream

Qt提供輔助類簡化了文本文件/數據文件的讀寫:

  • QTextStream:寫入的數據全部轉換為可讀文本。
  • QDataStream:寫入的數據根據類型轉換為二進制數據。

IO設備輔助類的使用方式:

編程實驗:使用文件輔助類讀寫

#include <QtCore/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);out << QString("D.T.Software") << 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.setVersion(QDataStream::Qt_4_7);out << QString("D.T.Software");out << QString("Result: ");out << 3.14;file.close();}if( file.open(QIODevice::ReadOnly) ){QDataStream in(&file);QString dt = "";QString result = "";double value = 0;in.setVersion(QDataStream::Qt_4_7);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/hp/Desktop/text.txt");data_stream_test("C:/Users/hp/Desktop/data.dat");return a.exec(); }

對于QDataStream來說,不管寫入的是QString、C方式的字符串、整形數據等,都有特定的二進制流格式,所以讀取的時候才能直接以類型來進行讀取。不是任何對象都能使用QDataStream進行序列化的,要想序列化必須自己實現序列化的方法。有很多Qt提供的類都實現了序列化的方法,比如對于QString如下(太長了我才不看):

#if !defined(QT_NO_DATASTREAM) || (defined(QT_BOOTSTRAPPED) && !defined(QT_BUILD_QMAKE)) /*!\fn QDataStream &operator<<(QDataStream &stream, const QString &string)\relates QStringWrites the given \a string to the specified \a stream.\sa {Serializing Qt Data Types} */QDataStream &operator<<(QDataStream &out, const QString &str) {if (out.version() == 1) {out << str.toLatin1();} else {if (!str.isNull() || out.version() < 3) {int byteOrder = out.byteOrder();const QChar* ub = str.unicode();static const uint auto_size = 1024;char t[auto_size];char *b;if (str.length()*sizeof(QChar) > auto_size) {b = new char[str.length()*sizeof(QChar)];} else {b = t;}int l = str.length();char *c=b;while (l--) {if (byteOrder == QDataStream::BigEndian) {*c++ = (char)ub->row();*c++ = (char)ub->cell();} else {*c++ = (char)ub->cell();*c++ = (char)ub->row();}ub++;}out.writeBytes(b, sizeof(QChar)*str.length());if (str.length()*sizeof(QChar) > auto_size)delete [] b;} else {// write null markerout << (quint32)0xffffffff;}}return out; }/*!\fn QDataStream &operator>>(QDataStream &stream, QString &string)\relates QStringReads a string from the specified \a stream into the given \a string.\sa {Serializing Qt Data Types} */QDataStream &operator>>(QDataStream &in, QString &str) { #ifdef QT_QSTRING_UCS_4 #if defined(Q_CC_GNU) #warning "operator>> not working properly" #endif #endifif (in.version() == 1) {QByteArray l;in >> l;str = QString::fromLatin1(l);} else {quint32 bytes = 0;in >> bytes; // read size of stringif (bytes == 0xffffffff) { // null stringstr.clear();} else if (bytes > 0) { // not emptyif (bytes & 0x1) {str.clear();in.setStatus(QDataStream::ReadCorruptData);return in;}const quint32 Step = 1024 * 1024;quint32 len = bytes / 2;quint32 allocated = 0;while (allocated < len) {int blockSize = qMin(Step, len - allocated);str.resize(allocated + blockSize);if (in.readRawData(reinterpret_cast<char *>(str.data()) + allocated * 2,blockSize * 2) != blockSize * 2) {str.clear();in.setStatus(QDataStream::ReadPastEnd);return in;}allocated += blockSize;}if ((in.byteOrder() == QDataStream::BigEndian)!= (QSysInfo::ByteOrder == QSysInfo::BigEndian)) {ushort *data = reinterpret_cast<ushort *>(str.data());while (len--) {*data = qbswap(*data);++data;}}} else {str = QLatin1String("");}}return in; } #endif // QT_NO_DATASTREAM

不同版本的數據流文件格式可能不同,我們可以通過如下函數進行設置:

當數據流文件可能在不同版本的Qt程序間傳遞數據時,我們需要考慮版本問題!


2 文件輔助類

2.1 QFileInfo

QFileInfo類用于讀取文件屬性信息。


示例程序:

#include <QtCore/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("D.T.Software\n");file.write("Delphi Tang\n");file.close();} }void read(QString f) {QFile file(f);if( file.open(QIODevice::ReadOnly | QIODevice::Text) ){QByteArray ba = file.readLine();QString s(ba);qDebug() << s;file.close();} }void info(QString f) {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(); }int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);write("C:/Users/hp/Desktop/test.txt");read("C:/Users/hp/Desktop/test.txt");info("C:/Users/hp/Desktop/test.txt");return a.exec(); }

3 臨時文件類

3.1 QTemporaryFile

Qt中提供了臨時文件操作類QTemporaryFile:

  • 安全地創建一個全局唯一的臨時文件。
  • 當對象銷毀時對應的臨時文件將被刪除。
  • 臨時文件的默認打開方式為QIODevice::ReadWrite。
  • 臨時文件常用于大數據傳遞或者進程間通信的場合。


示例程序:

#include <QtCore/QCoreApplication> #include <QTemporaryFile> #include <QFileInfo> #include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QTemporaryFile tempFile;if( tempFile.open() ){tempFile.write("D.T.Software");tempFile.close();}QFileInfo info(tempFile);qDebug() << info.isFile();qDebug() << info.path();qDebug() << info.fileName();return a.exec(); }

參考資料:

  • QT實驗分析教程
  • 總結

    以上是生活随笔為你收集整理的Qt中的文件操作的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。