Qt中使用流读写文件
二进制文件的读写:
QDataStream 提供了基于 QIODevice 的二进制数据的序列化。数据流是一种二进 制流,这种流完全不依赖于底层操作系统、CPU 或者字节顺序(大端或小端)。由于数据流就是二进制 流,因此我们也可以直接读写没有编码的二进制数据,例如图像、视频、音频等。 QDataStream 既能够存取 C++ 基本类型,如 int、char、short 等,也可以存 取复杂的数据类型,例如自定义的类。实际上,QDataStream 对于类的存储,是 将复杂的类分割为很多基本单元实现的。
1,写二进制文件:
QString path = QFileDialog::getSaveFileName(this,"open","./","source(*.cpp)");
if(path.isEmpty() == false){
QFile file(path);
if(file.open(QIODevice::WriteOnly) == true)
{
/*常见数据流和file文件关联
* 往数据流输入数据=往文件里面写数据
*/
QDataStream stream(&file);
stream << QString("测试") << 250;
file.close();
}
}
注:创建数据量对象的时候绑定输入输出驱动后,向数据流里面写数据,相当于往驱动绑定的文件里面写数据。和标准C++里面的输入输出流一样,<<表示数据的流向。
2,读二进制文件
QString path = QFileDialog::getOpenFileName(this,"open","./","source(*.cpp)");
if(path.isEmpty() == false){
QFile file(path);
if(file.open(QIODevice::ReadOnly) == true)
{
/*常见数据流和file文件关联
* 往数据流输出数据=文件读数据
*/
QDataStream stream(&file);
/*读的时候按写的顺序取数据*/
QString str ;
int a ;
stream >> str >> a;
/*转成char*类型的数据输出*/
cout <<str.toUtf8().data();
cout <<a;
file.close();
}
}
注:读的时候要注意数据写入顺序。
对于cout我们使用宏定义如下:
#define cout qDebug() << "[" << __FILE__ << ":" << __LINE__ <<"]"
这样在输出的时候就可以输出文件名和行号,便于调试。
文本文件的读写:
二进制文件比较小巧,却不是人可读 的格式。而文本文件是一种人可读的文件。为了操作这种文件,我们需要使用 QTextStream 类。QTextStream 和 QDataStream 的使用类似,只不过它是操作纯 文本文件的。 QTextStream 会自动将 Unicode 编码同操作系统的编码进行转换,这一操作对 开发人员是透明的。它也会将换行符进行转换,同样不需要自己处理。
1,写文本文件:
QString path = QFileDialog::getSaveFileName(this,"Save","./","source(*.cpp)");
if(path.isEmpty() == false)
{
QFile file(path);
if(file.open(QIODevice::WriteOnly) == true)
{
QTextStream textStream(&file);
/*指定编码*/
textStream.setCodec("UTF-8");
textStream << QString("你好,世界!") << 1000;
file.close();
}
}
注:关于QTextStream 只是比QDataStream 多了一个可以指定编码,其余方法相同。
2,写文本文件:
QString path = QFileDialog::getOpenFileName(this,"Save","./","source(*.cpp)");
if(path.isEmpty() == false)
{
QFile file(path);
if(file.open(QIODevice::ReadOnly) == true)
{
QTextStream textStream(&file);
/*指定编码*/
textStream.setCodec("UTF-8");
/*
默认全部为字符串
QString str;
int a;
textStream >> str >> a;
cout << str.toUtf8().data() << a;
*/
QString str;
str = textStream.readAll();
cout << str;
file.close();
}
}
注:在读文件的时候一般指定的编码和写文件的时候相同,防止出现乱码,字在读的时候和QDataStream不同的是,它默认全部为字符串,如果按照顺序读取的时候,后面的整型变量为0,因为把整型数默认也为字符,所以读的时候一般采用和QFile相同的方式读
1,如上,全部直接读写
QString str;
str = textStream.readAll();
cout << str;
2,也可以采用一个循环一行一行读取
while(textStream.atEnd() == false)
{
str += textStream.readLine();
}
使用QBuffer配合二进制数据流读写文件
1,普通QBuffer读写文件:
/*定义字节数组和QBuffer对象*/
QByteArray array;
QBuffer memFile(&array,this);
/*打开*/
memFile.open(QIODevice::WriteOnly);
/*写入数据*/
memFile.write("111111111111111111111");
memFile.write("22222222222222222222222");
/*关闭,并且写入*/
memFile.close();
qDebug() << memFile.buffer();
qDebug() << "array="<< array;
注意:每次在缓冲写入数据之后必须要关闭之后才能正常写入。
2,配合二进制流读写数据:
写入数据(QString类型和整型):
QBuffer memFile(this);
memFile.open(QIODevice::WriteOnly);
QDataStream stream(&memFile);
stream << QString("测试") <<250;
memFile.close();
读数据:
memFile.open(QIODevice::ReadOnly);
QDataStream stream1(&memFile);
QString str;
int a;
stream1 >> str >> a;
qDebug() << str.toUtf8().data() << a;
注意:读数据的时候不能使用如下方法:
qDebug() << QString(memFile.buffer()).toUtf8().data();
经过多次类型转换之后无法正常读出数据。
更多推荐

所有评论(0)