Qt中将文件类型分为2大类:
1、文本文件:文件的内容是可读的文本字符
2、数据文件:文件内容是直接的二进制数据
QFile类直接支持文本文件和数据文件的读写(通过继承自QIODevice的成员函数)
qint64 | read ( char * data, qint64 maxSize ) | ||
QByteArray | read ( qint64 maxSize ) | ||
qint64 | write ( const char * data, qint64 maxSize ) | ||
qint64 | write ( const char * data ) | ||
qint64 | write ( const QByteArray & byteArray ) |
但是有时候需要需要进行类型的转换
#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) ) //未指定QIODevice::Text方式,用二进制的方式打开文件
{
QString hi = "Good Evening";
double value = 3.14;
file.write(hi.toStdString().c_str()); //函数参数类型为const char*类型,因此将dt转为标准字符串(C++中的string),再取C风格字符串指针
file.write(reinterpret_cast<char*>(&value), sizeof(value));
file.close();
}
if( file.open(QIODevice::ReadOnly) )
{
QString hi = "";
double value = 0;
hi = QString(file.read(12));
//注意!!此处读取的长度一定不能包含'\0' 不能通过sizeof("Goodevening ")的方式指定读取长度,必须读取确实有效的数据,包含'\0'后会读取出怪异的符号
file.read(reinterpret_cast<char*>(&value), sizeof(value));
file.close();
qDebug() << hi;
qDebug() << value;
}
return a.exec();
}
文本流与数据流
Qt提供了辅助类简化了文本文件/数据文件的读写
1、QTextStream写入的数据全部转换为可读文本
2、QDataStream写入的数据根据类型转换为二进制数据
I/O设备辅助类的使用方式
//1.创建QFile文件对象(如:file)
//2.使用file对象打开文件
//3.将数据写入文件
QxxxStream out(&file);
out << QString("xxx");
out << QString("Result: ")<< 3.14;
//4.将数据从文件中读出
QxxxStream in(&file);
in >> dt; //dt须声明为QString类型;
in >> result; //result须声明为QString;
in >> value; //value声明为double;
对于QTextStream:
1、QTextStream可以读写所有文本格式的文件,比如纯文本文件、HTML文件、XML文件
2、QTextStream考虑了Unicode编码与系统本地编码或其他任意编码之间的转换问题,并且处理了不同操作系统换行符的问题
3、QTextStream的读取与写入字符串的问题,如:
QTextStream out(&file);
out << “Good” << “Evening”;
QTextStream in(&file);
QString str1, str2;
In >> str1 >> str2;
这里,实际写入到out中的字符串为”GoodEvening”,并且在读取时,str1获得了整个字符串”GoodEvening”,str2什么也读取不到,QTextStream内部维护了一个Unicode的缓冲区。因此我们在读取字符串时一般使用
QString | readLine ( qint64 maxlen = 0 ) |
或
QString | readAll () |
整块整块的读取内容
也有其他的办法:
1)、以单词的形式读取,可以一次性写入一长串的字符串,字符串内的单词必须由空格分开(前导空格会被忽略),读取时以QString的形式读取,一个QString只能读到一个单词
如:
out <<“Good Evening”;
in >> str1 >> str2;//QString对象str1读取到Good,str2读取到Evening
2)、以字符的形式读取,不管怎么写入,一次只读取一个字符
如:
out << “Good Evening”;
while(!in.atEnd())
{ in>> a;
//接着处理字符a
}
可通过成员函数
void | skipWhiteSpace () |
跳过空格,以字符读取的形式经常在解析文件,使用独立的字符编码时方便输入处理
4、默认情况下QTextStream使用系统本地编码,可通过成员函数
void | setCodec ( QTextCodec * codec ) |
void | setCodec ( const char * codecName ) |
指定编码
5、QTextStream拥有流操作器Manipulator(放在输出内容前)或一些成员函数用于格式化输出(具体参考帮助文档),如:
out << showbase << uppercasedigits << hex<< 12345678;
或
out.setNumberFlags(QTextStream::ShowBase |QTextStream::UppercaseDigits);
out.setIntegerBase(16);
out << 12345678;
操作后生成的实际输出文本为0xBC614E
对于QDataStream:
不同Qt版本的数据流文件格式可能不同,读写文件时需要设置版本号
void | setVersion ( int v ) |
int | version () const |
#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("Good Evening ") << endl;
out << QString("Result: ") << endl; //输出"Result:"
out << 5 << '*' << 6 << '=' << 5 * 6<< endl;//输出5*6=30到文本文件中
file.close();
}
if( file.open(QIODevice::ReadOnly | QIODevice::Text) )
{
QTextStream in(&file);
while( !in.atEnd() )
{
QString line = in.readLine(); //每次在in中读取一行
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("Good Evening ");
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();
}
声明:
此文根据 狄泰学院唐老师的《QT实验分析教程》创作