文本流/数据流(二级制格式)
- 文本流 (依赖平台,不同平台可能乱码)涉及文件编码
#include <QTextStream>
操作的都是基础数据类型:int float string
//Image Qpoint QRect就不可以操作
需要下面的
- 数据流 (不依赖平台—二级制)不涉及文件编码,,
怎么读进去,怎么读出来
#include <QDataStream>
不同的主机进行数据传传输,使用的就是数据流。
使用文件流操作必须注释#include
文件流操作基本和QFile相同
QTextStream
读文件(直接会当作一个字符串一次性读完)
//#include <QFile>
QFile file(fileName);
//指定打开方式 --有返回值
bool isOk = file.open(QFile::ReadOnly);
if(isOk == false)
{
QMessageBox::critical(this,"ERROR","File open Failed");
}
//读文件
QTextStream stream(&file);//将I/O设备给流对象
stream.setCodec("utf8");//设置读取方式为utf8
QString array;
//读取多行
while(stream.atEnd())//判断读到最后一行
{ //按照本地文件格式去读
array += stream.readLine();
}
//显示文本
ui->textEdit->setText(array);
QT中的乱码很恶心,需要记住上面的操作
写文件
按照文本流的方式写,会将将两部分连在一起
//写
QFile f("aaa.txt");
f.open(QFile::WriteOnly);
QTextStream txt(&f);
//写文件
txt<<QString("lalalla")<<123456;
f.close();
//读
QString buf1;
f.open(QFile::ReadOnly);
txt.setDevice(&f);
txt>>buf1;//读操作符
qDebug()<<buf1.toUtf8().data();
因此建议,读文件不要使用操作符的方式去读。最好使用readLine()/readAll()的方式读取
写的时候可以用上面方式去写
QDataStream
读(写的时候会把每一个数据分成一个小块,会给头部记录数据类型/长度)
!!!!!怎么写进去,怎么读出来!!!!
写 :如 1234 → pig → dog123
读 1234 pig dog 123
//#include <QFile>
QFile f("aaa.txt");//文件对象(可以当作显示屏(I/O设备))
f.open(QFile::WriteOnly);
QDataStream txt(&f); //写的时候会把每一个数据分成一个小块,会给头部记录数据类型/长度
//写文件
txt<<QString("lalalla")<<123456; //运算符写入
f.close();
QString buf1;
f.open(QFile::ReadOnly);
txt.setDevice(&f);
txt>>buf1;
qDebug()<<buf1.toUtf8().data();
输出:lalala ,那123456去哪了?
给代码加上number 必须是int类型和下面的123456一一对应,读的时候两种类型必须对应
QString buf1;
int number; //给代码加上number 必须是int类型和下面的123456一一对应,读的时候两种类型必须对应
f.open(QFile::ReadOnly);
txt.setDevice(&f);
txt>>buf1>>number;
qDebug()<<buf1.toUtf8().data()<<number;
由于数据流方式写入是二进制格式,因此直接打开文件时乱码的。
使用文本编辑器打开aaa.txt
QDataStream txt(&f); //对I/O设备进行操作,还可以对内存进行操作。
QByteArray :可以当作一个内存块
//对内存进行操作,即可操作可传输
QByteArray buff;
QImage image("");
QDataStream Ds(&buff,QIODevice::ReadWrite);
ds<<image;//将图片写入带内存中
完整代码
#include "widget.h"
#include "ui_widget.h"
//#include <QFile>
#include <QFileDialog>
#include <QMessageBox>
#include <QPushButton>
#include <QTextCodec>
#include <QDebug>
#include <QTextStream>
#include <QDataStream>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
connect(ui->selectFile,&QPushButton::clicked,this,[=](){
QString fileName= QFileDialog::getOpenFileName(this,"openfile","");
if(fileName.isEmpty() == true)
{
QMessageBox::warning(this,"warning","打开失败");
return;
}
ui->lineEdit->setText(fileName);
//创建对象
//默认读取文件格式:utf8
QFile file(fileName);
//指定打开方式 --有返回值
bool isOk = file.open(QFile::ReadOnly);
if(isOk == false)
{
QMessageBox::critical(this,"ERROR","File open Failed");
}
//读文件
QTextStream stream(&file);//将I/O设备给流对象
stream.setCodec("UTF-8");//设置读取方式为utf8
QString array;
//读取多行
while(false == stream.atEnd())//判断读到最后一行
{
array += stream.readLine();//按照本地文件格式去读
}
//显示文本框
ui->textEdit->setText(array);
//文件读写完成
// char buf[55] = {"1111"};
// file.write(buf,strlen(buf));
// file.write(QString("llala").toUtf8());
// file.write(buf);
// //关闭文件
file.close();
});
// QFile f("aaa.txt");
// f.open(QFile::WriteOnly);
// QTextStream txt(&f);
// //写文件
// txt<<QString("lalalla")<<123456;
// f.close();
// QString buf1;
// f.open(QFile::ReadOnly);
// txt.setDevice(&f);
// txt>>buf1;
// qDebug()<<buf1.toUtf8().data();
QFile f("aaa.txt");
f.open(QFile::WriteOnly);
QDataStream ds(&f); //对I/O设备进行操作,可以对内存进行嗯操作/
//写文件
ds<<QString("lalalla")<<123456;
f.close();
QString buf1;
int number;
f.open(QFile::ReadOnly);
ds.setDevice(&f);
ds>>buf1>>number;
qDebug()<<buf1.toUtf8().data()<<number;
// //对内存进行操作
// QByteArray buff;
// QImage image("");
// QDataStream Ds(&buff,QIODevice::ReadWrite);
// ds<<image;//将图片写入带内存中
}
Widget::~Widget()
{
delete ui;
}