4.关于QT中的QFile文件操作,QBuffer,Label上添加QPixmap,QByteArray和QString之间的区别,QTextStream和QDataStream的区别,QT内存映射(

简介:  新建项目13IO 13IO.pro HEADERS += \     MyWidget.h   SOURCES += \     MyWidget.cpp   QT += gui widgets network CONFIG += C++11

  1. 新建项目13IO

13IO.pro

HEADERS += \

    MyWidget.h

 

SOURCES += \

    MyWidget.cpp

 

QT += gui widgets network

CONFIG += C++11

MyWidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H
 
#include <QWidget>
 
class MyWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent = 0);
 
signals:
 
public slots:
 
};
 
#endif // MYWIDGET_H

MyWidget.cpp

#include "MyWidget.h"
#include <QFile>
#include <QApplication>
//#include <QDebug>
//#include <QBuffer>
//#include <QLabel>
//#include <QTextStream>
//#include <QDataStream>
 
/**
 * QFile
 * QBuffer     //memory file
 * QTcpSocket
 * QUdpSocket
 *
 * QDataStream
 * QTextStream
 */
 
MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent)
{
    //QT中不建议使用char *这种类型的数据类型
    QFile file("../MyTest.txt");
    file.open(QIODevice::ReadWrite);
 
    file.write(QByteArray("abc"));
    //同样,QFile中也有如下方法
    //file.seek();
    //file.write();
    file.close();
}
 
int main(int argc,char** argv)
{
    QApplication app(argc,argv);
 
    MyWidget w;
    w.show();
 
    return app.exec();
}

运行结果:

生成的MyTest.txt文件的内容如下:

 

2 关于QBuffer

#include "MyWidget.h"

#include <QApplication>

#include <QDebug>

#include <QBuffer>

//#include <QLabel>

//#include <QTextStream>

//#include <QDataStream>

 

/**

 * QFile

 * QBuffer     //memory file

 * QTcpSocket

 * QUdpSocket

 *

 * QDataStream

 * QTextStream

 */

 

MyWidget::MyWidget(QWidget *parent) :

    QWidget(parent)

{

    QBuffer buffer;

    buffer.open(QIODevice::ReadWrite);

 

    buffer.write("abc");

    buffer.write("aabbcc");

 

    buffer.close();

 

    //可以知道buffer中存储的是缓冲区,通过下面的方式看看buffer中的内容是什么

    qDebug() << buffer.buffer();

}

 

int main(int argc,char** argv)

{

    QApplication app(argc,argv);

 

    MyWidget w;

    w.show();

 

    return app.exec();

}

运行结果:

 

3 QBuffer QPixmap实现在Label上添加图片,下面是内存文件的应用

#include "MyWidget.h"

#include <QApplication>

#include <QDebug>

#include <QBuffer>

#include <QLabel>

//#include <QTextStream>

//#include <QDataStream>

 

/**

 * QFile

 * QBuffer     //memory file

 * QTcpSocket

 * QUdpSocket

 *

 * QDataStream

 * QTextStream

 */

 

MyWidget::MyWidget(QWidget *parent) :

    QWidget(parent)

{

    // send side

QBuffer buffer;

//不要路径,因为它的内容是写在内存里面的。

    buffer.open(QIODevice::ReadWrite);

QPixmap pixmap("../aaa.png");

//pixmapsave实际上有两个参数,保存成相应的文件的时候要指定相应的格式,PNG是不是真,JPG是失真的。JPG是有损压缩,PNG是无损压缩。

    pixmap.save(&buffer, "PNG");

    buffer.close();

 

    qDebug() << buffer.buffer().size();

 

    // recv side

QPixmap pixmap2;

//通过loadFromData把它收起来。

    pixmap2.loadFromData(buffer.buffer(), "PNG");

 

    QLabel* label = new QLabel(this);

    label->setPixmap(pixmap2);

}

 

int main(int argc,char** argv)

{

    QApplication app(argc,argv);

 

    MyWidget w;

    w.show();

 

    return app.exec();

}

运行结果:

 

4 QByteArrayQString之间的区别

#include "MyWidget.h"

#include <QApplication>

#include <QDebug>

#include <QBuffer>

#include <QLabel>

//#include <QTextStream>

//#include <QDataStream>

 

/**

 * QFile

 * QBuffer     //memory file

 * QTcpSocket

 * QUdpSocket

 *

 * QDataStream

 * QTextStream

 */

 

MyWidget::MyWidget(QWidget *parent) :

    QWidget(parent)

{

    //关于QByteArrayQString

    //QByteArray编码的时候将一个汉字编码成3个字节

    QByteArray ba("涂作权");

    //QSting中有自己字符,它的大小就是几个字符

    QString str("涂作权");

    qDebug() << ba.size() << str.size();

}

 

int main(int argc,char** argv)

{

    QApplication app(argc,argv);

 

    MyWidget w;

    w.show();

 

    return app.exec();

}

 

5 QTextStreamQDataStream的区别

#include "MyWidget.h"

#include <QApplication>

#include <QDebug>

//#include <QBuffer>

#include <QFile>

//#include <QLabel>

#include <QTextStream>

//#include <QDataStream>

 

/**

 * QFile

 * QBuffer     //memory file

 * QTcpSocket

 * QUdpSocket

 *

 * QDataStream

 * QTextStream

 */

 

MyWidget::MyWidget(QWidget *parent) :

    QWidget(parent)

{

    QFile file("../teststream.txt");

    //QTextStream需要一个QIODevice来构造它

    file.open(QIODevice::ReadWrite);

 

    QTextStream textStream(&file);

 

    //通过下面的方式可以写文件,并且文件内容中是正常的

    textStream << 1 << "abc" << 1.2 << QString("abc");

 

file.close();

//运行之后,在项目所在目录下发现多了teststream.txt文件,文件内容如下:

#if 0

    //如果想写进去很方便读出来的话使用DataStream

    QFile file("../teststream.txt");

    file.open(QIODevice::ReadWrite);

 

    QDataStream dataStream(&file);

    dataStream << 1 << "abc" << 1.2 << QString("abc") << QPoint(1,1);

file.close();

//上面的运行结果如下:

#endif

}

 

int main(int argc,char** argv)

{

    QApplication app(argc,argv);

 

    MyWidget w;

    w.show();

 

    return app.exec();

}

 

6 内存映射,虚拟内存,可以使用多台电脑操作同一个文件(只要指针指向文件的位置不同就可以)

#include "MyWidget.h"
#include <QApplication>
#include <QDebug>
//#include <QBuffer>
#include <QFile>
//#include <QLabel>
#include <QTextStream>
//#include <QDataStream>
 
/**
 * QFile
 * QBuffer     //memory file
 * QTcpSocket
 * QUdpSocket
 *
 * QDataStream
 * QTextStream
 */
 
MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent)
{
    //虚拟内存和内存映射,QFile可以自动创建文件
    QFile file("../map.txt");
 
    file.open(QIODevice::ReadWrite);
    //扩展文件的大小为64k
    file.seek(64 * 1024);
    //向文件中写入1
    file.write("1");
    //文件关闭
    file.close();
    //然后再通过ReadWrite的方式构造它
    file.open(QIODevice::ReadWrite);
    //构造内存映射
    uchar* ptr = file.map(0,64*1024);
    //可以像指针一样来操作文件内容
    *ptr = 'a';
    ptr[1] = 'b';
 
    //read file
    uchar ch = *ptr;
    file.unmap(ptr);
    file.close();
}
 
int main(int argc,char** argv)
{
    QApplication app(argc,argv);
 
    MyWidget w;
    w.show();
 
    return app.exec();
}
//运行结果:

 

目录
相关文章
|
4月前
|
Java 开发者
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
54 0
|
5天前
|
存储 缓存 安全
阿里云服务器内存型r7、r8a、r8y、r8i实例区别及选择参考
随着阿里云2024年金秋云创季的开始,目前在阿里云的活动中,属于内存型实例规格的云服务器有内存型r7、内存型r8a、内存型r8y和内存型r8i这几个实例规格,相比于活动内的经济型e和通用算力型u1等实例规格来说,这些实例规格等性能更强,虽然这几个实例规格的云服务器通常处理器与内存的配比为都是1:8,但是他们在处理器、存储、网络、安全等方面等性能并不是一样的,所以他们的适用场景也有着不同。本文为大家介绍内存型r7、r8a、r8y、r8i实例的性能、适用场景的区别以及选择参考。
|
2月前
|
存储 缓存 安全
阿里云服务器经济型、通用算力型、计算型、通用型、内存型实例区别及选择参考
阿里云服务器的实例规格有经济型、通用型、计算型、内存型、通用算力型、大数据型、本地SSD型、高主频型、突发型、共享型等不同种类的实例规格,在阿里云的活动中,主要以经济型、通用算力型、计算型、通用型、内存型实例为主,相同配置的云服务器往往有多个不同的实例可选,而且价格差别也比较大,这会是因为不同实例规格的由于采用的处理器不同,底层架构也有所不同(例如X86 计算架构与Arm 计算架构),因此不同实例的云服务器其性能与适用场景是有所不同。本文为大家详细介绍阿里云的经济型、通用算力型、计算型、通用型和内存型实例的性能特点及适用场景,以供大家选择参考。
阿里云服务器经济型、通用算力型、计算型、通用型、内存型实例区别及选择参考
|
2月前
|
存储 缓存 Linux
用户态内存映射
【9月更文挑战第20天】内存映射不仅包括物理与虚拟内存间的映射,还涉及将文件内容映射至虚拟内存,使得访问内存即可获取文件数据。mmap 系统调用支持将文件或匿名内存映射到进程的虚拟内存空间,通过多级页表机制实现高效地址转换,并利用 TLB 加速映射过程。TLB 作为页表缓存,存储频繁访问的页表项,显著提升了地址转换速度。
|
1月前
|
Linux C++
Linux c/c++文件虚拟内存映射
这篇文章介绍了在Linux环境下,如何使用虚拟内存映射技术来提高文件读写的速度,并通过C/C++代码示例展示了文件映射的整个流程。
43 0
|
2月前
|
存储 安全 Linux
将文件映射到内存,像数组一样访问
将文件映射到内存,像数组一样访问
29 0
|
2月前
|
存储 缓存 NoSQL
Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
68 0
|
2月前
|
设计模式 前端开发 安全
Qt注册类对象单例与单类型区别
在进行开发时,应当根据具体的应用场景和需求来选择使用单例模式或是单类型。如果是全局服务或状态管理,可能需要单例模式;如果是为了使QML环境下的不同组件能够访问到同一个后端服务对象,则可能需要使用单类型。
34 2
|
3月前
|
存储 程序员 编译器
堆和栈内存的区别是什么
【8月更文挑战第23天】堆和栈内存的区别是什么
224 4
|
3月前
|
存储 安全 Java
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别;什么是程序计数器,堆,虚拟机栈,栈内存溢出,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存