文本流/数据流(二级制格式)
- 文本流 (依赖平台,不同平台可能乱码)涉及文件编码
#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");//设置读取方式为utf8QString 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);//创建对象//默认读取文件格式:utf8QFile 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");//设置读取方式为utf8QString 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;
}