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。
- 临时文件常用于大数据传递或者进程间通信的场合。
示例程序:
参考资料: