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直接支持文本文件和數據文件的讀寫:
思考:如何將一個浮點數據寫入文本文件和數據文件?
可以看到上面的寫入是很麻煩的,并且對于文件寫入來說都是講一段內存空間中的數據寫入文件中,而不區分文本文件和數據文件。
為了方便的對文本文件和數據文件,我們可以借助QTextStream和QDataStream。
1.2 QTextStream和QDataStream
Qt提供輔助類簡化了文本文件/數據文件的讀寫:
- QTextStream:寫入的數據全部轉換為可讀文本。
- QDataStream:寫入的數據根據類型轉換為二進制數據。
IO設備輔助類的使用方式:
編程實驗:使用文件輔助類讀寫
對于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類用于讀取文件屬性信息。
示例程序:
3 臨時文件類
3.1 QTemporaryFile
Qt中提供了臨時文件操作類QTemporaryFile:
- 安全地創建一個全局唯一的臨時文件。
- 當對象銷毀時對應的臨時文件將被刪除。
- 臨時文件的默認打開方式為QIODevice::ReadWrite。
- 臨時文件常用于大數據傳遞或者進程間通信的場合。
示例程序:
參考資料:
總結
- 上一篇: 为什么加油要熄火?
- 下一篇: 汽车一侧从车尾刮到车头很大一条划痕修理需