日韩性视频-久久久蜜桃-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中的文件操作的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 国产人成在线 | 天天干天天操天天碰 | 中文字幕国产剧情 | 国产69页| 邻居少妇张开腿让我爽了在线观看 | 69xx视频在线观看 | 日本丰满大乳奶做爰 | 五月天中文字幕 | www.亚洲欧美 | 久久国产综合 | 丁香午夜 | 午夜小视频免费 | 国产乱人伦 | 天堂在线www | a级在线观看网站 | juliaann精品艳妇hd | 一区二区三区欧美 | 日日操夜夜骑 | 久久精品国产清自在天天线 | 婷婷av一区二区三区 | 国产久一| 亚洲欧美乱综合图片区小说区 | 亚洲在线视频 | 伊人久久成人网 | 国产伦精品一区二区三区四区免费 | 老女人综合网 | 亚洲 欧美 激情 小说 另类 | 久久成人福利 | 日日操夜夜操天天操 | 奇米影视9999 | 国精产品乱码一区一区三区四区 | 久草资源在线视频 | 久久亚洲综合色图 | 婷婷六月综合网 | 夜夜操天天干 | 被灌满精子的波多野结衣 | 四虎成人av | 1024国产在线| 国产在线一卡二卡 | 国产在线拍揄自揄拍无码视频 | 一级黄色片免费观看 | 操小妞 | 欧洲做受高潮免费看 | 成人免费网站www网站高清 | 久久精品一区二区 | 国产十八熟妇av成人一区 | 97爱视频| 久久久久久亚洲中文字幕无码 | 雪花飘电影在线观看免费高清 | 蜜桃av色偷偷av老熟女 | 他揉捏她两乳不停呻吟动态图 | 亚洲一区二区免费视频 | 国内外成人激情视频 | 日本少妇激情视频 | 青青草国产成人99久久 | 老女人做爰全过程免费的视频 | 国产精品高潮呻吟久久av野狼 | 可以直接观看的av | 亚洲激情av | 素人一区二区 | 国内精品999 | 欧美精品第一区 | xxxx日本黄色| 探花系列在线观看 | 国产亚洲毛片 | 69热在线观看 | 欧美三级成人 | 一级毛片基地 | 中文字幕第八页 | 国产成人在线观看 | 亚洲精品乱码久久久久久蜜桃麻豆 | 美国一级特黄 | 成人国产精品蜜柚视频 | www.爆操 | 综合第一页 | 国产中文字幕一区二区 | 成人拍拍视频 | 欧美 日韩 高清 | 噼里啪啦免费高清看 | 日韩av三区 | 国产精选一区二区三区 | 亚洲20p | 久久国产经典 | 欧美日韩国产大片 | 人人草人人草 | 中文字幕色网 | 日韩成人av在线 | 视频在线观看免费大片 | 三上悠亚ssⅰn939无码播放 | 精品1卡二卡三卡四卡老狼 日韩三级网 | 欧美成人影音 | 九九热最新| a级片毛片 | 欧美极品在线 | gav久久 | 国产一区二区三区中文字幕 | 国产成人精品久久 | 超碰网址 | 欧美性生交xxxxx久久久缅北 |