QT开发--文件的读写操作

第十三章 文件的读写操作

Qt提供两种读写纯文本文件的方法:

1、直接使用 QFile 类的IO功能;

2、结合 QFileQTextStream,利用流(Stream)进行操作。

13.1 文件读操作

13.1.1 使用QFile类

        Qt封装了QFile类,方便我们对文件进行操作,可以按照如下的步骤进行:

        - 使用QFile加载文件对象

        - 打开文件 file.open(打开方式)

        - 操作文件

        - 关闭文件 file.close()

实例:点击读写文件按钮,读取文件内容到 textEdit中

设置ui界面

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    MyDialog md;
    // 点击选取文件按钮,弹出文件对话框
    md.connect(md.ui->pushButton,&QPushButton::clicked,[&]() {
        QString path=  QFileDialog::getOpenFileName(md.ui->pushButton, //对话框部件
                                                            "打开文件", //对话框标题
                                              "C:/Users/WFD/Desktop"); //默认打开路径,找不到就是工作目录
        // 将路径显示在lineEdit中
        md.ui->textEdit_2->setText(path);

        // 读取文件内容,放入textEdit中
        QFile file(path);//参数就是文件的路径
        // 设置打开方式
        file.open(QIODevice::ReadOnly);
        // 用QByteArray类去接收读取的信息
        QByteArray array=file.readAll();
        // 将读取到的数据放入textEdit中
        md.ui->textEdit->setText(array);
        // 关闭文件对象
        file.close();
    });
    md.show();
       // 进入Qt应用程序的事件循环
       return app.exec();
}
按钮结合QFileDialog::getOpenFileName实现打开文件目录

        QFile::open() 函数打开文件时需要传递 `QIODevice::OpenModeFlag` 枚举类型的参数,决定文件以什么方式打开。

QIODevice::ReadOnly  	//以只读方式打开文件,用于载入文件。
QIODevice::WriteOnly  	//以只写方式打开文件,用于保存文件。
QIODevice::ReadWrite 	//以读写方式打开。
QIODevice::Append  		//以添加模式打开,新写入文件的数据添加到文件尾部。
QIODevice::Truncate 	//以截取方式打开文件,文件原有的内容全部被删除。
QIODevice::Text       	//以文本方式打开文件,读取时“\n”被自动翻译为换行符,
                        //写入时字符串结束符会自动翻译为系统平台的编码,
                        //如 Windows 平台下是“\r\n”。

//这些取值可以组合,例如 QIODevice::ReadOnly | QIODevice::Text 表示以只读和文本方式打开文件。

        操作文件时,若以只读方式打开文本文件,可用QFile::readAll()一次读取全部内容,

        返回QByteArray,需转为QString查看。或使用readLine()逐行读取,并用file.atEnd()判断是否结束:

QByteArray array;  
while (!file.atEnd()) {  
    array += file.readLine();  
}

13.1.2 使用QTextStream类

        如果操作的是文本文件,Qt还专门封装了一个处理文本流的QTextStream类,我们可以用它来读取文本内容。

// 点击选取文件按钮,弹出文件对话框
connect(ui->pushButton,&QPushButton::clicked,[=]() {
	QString path =  QFileDialog::getOpenFileName(this,"打开文件","C:/Users/WFD/Desktop");
	// 将路径放在lineEdit中
	ui->lineEdit->setText(path);
	// 读取文件内容,放入textEdit中
	QFile file(path);	// 参数就是文件的路径
	// 设置打开方式
	file.open(QIODevice::ReadOnly);
	// 用QTextStream类去读取文本信息
	QTextStream QS(&file);
	// 用QString类去接收读取的信息
	QString array = QS.readAll();
	// 将读取到的数据放入textEdit中
	ui->textEdit->setText(array);
	// 关闭文件对象
	file.close();
}

13.2 文件写操作

13.2.1 使用QFile类

        使用QFile同样可以对文件进行写操作:

//获取要写入的文件路径
QString path = QFileDialog::getSaveFileName(  
    this,        // 父窗口  
    "保存",      // 对话框标题  
    "D:\\temp\\",// 默认目录  
    "TXT (*.txt)"// 文件过滤器  
);

QFile file(path);  
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {  
    file.write("你好");   //写入
    file.close();  
} else {  
    // 处理文件打开失败的情况  
    qDebug() << "无法打开文件以写入";  
}

13.2.2 使用QTextStream类

        QTextStream类对操作符进行了重载,我们可以通过 << 操作符将字符串流入文本文件:

QString path = QFileDialog::getSaveFileName(this, //父指针
                                           "保存",//对话窗口名称
                                     "D:\\temp\\",//要保存的路径
                                    "TXT(*.txt)");//文件过滤器  
QFile file(path);  
file.open(QIODevice::WriteOnly | QIODevice::Text);  
QTextStream out(&file);  
QString str = "你好";  
out << str;  
file.close();

13.3 文件信息读取

        Qt提供了QFileInfo类,用于获取文件的元数据,包括文件大小后缀名、创建及最后修改时间等。

QString path = QFileDialog::getOpenFileName(this, //父窗口
                                      "打开文件",  //窗口名
                                   "D:\\temp\\");  //路径
QFileInfo file(path);  
qDebug() << "文件名" << file.fileName();  
qDebug() << "后缀名" << file.suffix();  
qDebug() << "文件大小" << file.size();  
qDebug() << "创建日期" << file.birthTime().toString("yyyy/MM/dd hh:mm:ss");  
qDebug() << "最后修改" << file.lastModified().toString("yyyy/MM/dd hh:mm:ss");

编码转换

        QString 转 QByteArray: 使用 QString.toUtf8()

QString qstr = "example";  
QByteArray byteArray = qstr.toUtf8();

        QByteArray 转 std::string: 使用 QByteArray.toStdString()

QByteArray byteArray = ...;  
std::string stdStr = byteArray.toStdString();

        std::string 转 char *: 使用 std::string.c_str()(注意:返回的是指向内部数据的常量指针,需确保std::string在指针使用期间不被修改或销毁)。

std::string stdStr = "example";  
const char* cStr = stdStr.c_str();  
// 若需要非const char*,可考虑复制一份数据:  
char* writableCStr = new char[stdStr.size() + 1];  
std::strcpy(writableCStr, stdStr.c_str());  
// 使用后需删除:  
delete[] writableCStr;

常用静态函数

        QFileDialog::getOpenFileName(): 弹出文件选择对话框,返回用户选择的文件路径

QString filePath = QFileDialog::getOpenFileName(this, "打开文件", "D:\\temp\\");

        QFileDialog::getExistingDirectory(): 弹出目录选择对话框,返回用户选择的目录路径

QString dirPath = QFileDialog::getExistingDirectory(this, "选择目录", "D:\\temp\\");

        QFileDialog::getSaveFileName(): 弹出文件保存对话框,返回用户指定的保存文件路径

QString savePath = QFileDialog::getSaveFileName(this,     //父窗口
                                           "保存文件",     //窗口名称
                                         "D:\\temp\\",     //打开的目录i
                                       "TXT (*.txt)");     //文件过滤,只显示.txt后缀

13.4 QT配置ini文件

13.4.1 ini文件介绍

        .ini 文件是初始化文件,用于配置应用软件以满足用户需求。

        它广泛存在于多个操作系统中,并可通过应用程序的图形界面进行操作,而无需直接编辑文件。.ini 文件可存储软件信息和注册表信息等。

13.4.2 ini文件格式

        ini 文件构成。

        方括号 [ ] 包围,如 [Section1 Name],用于区分不同用途的参数区

        通过等号 = 连接,如 KeyName1=value1。

        注解使用分号 ;,其后内容至行尾均为注解。

[Section1 Name]  
KeyName1=value1  
KeyName2=value2  
; 这是注解  
  
[Section2 Name]  
KeyName21=value21  
KeyName22=value22

13.4.3 Qt写ini文件

        在 Qt 中,可以使用 QSettings 类来读写 .ini 文件

#include <QApplication>  
#include <QSettings>  
  
int main(int argc, char *argv[]) {  
    QApplication a(argc, argv);  
  
    // 创建 QSettings 对象,指定 ini 文件路径和格式   
    QSettings *settings = new QSettings(  
        "hahaya.ini",         // .ini 文件名  
        QSettings::IniFormat  // 指定文件格式为 INI  
    );
  
    // 写入键值对到 ini 文件  
    settings->setValue("/ip/first", "192.168.0.1");  
    settings->setValue("ip/second", "127.0.0.1");  
    settings->setValue("port/open", "2222");  
  
    // 删除 QSettings 对象  
    delete settings;  
  
    return a.exec();  
}

13.4.4 Qt读ini文件

        在 Qt 框架中,我们利用 QSettings 类来读取 .ini 配置文件

#include <QApplication>  
#include <QSettings>  
#include <QDebug>  
  
int main(int argc, char *argv[]) {  
    QApplication a(argc, argv);  
  
    // 创建 QSettings 对象以读取 ini 文件  
    QSettings *settings = new QSettings("hahaya.ini", QSettings::IniFormat);  
  
    // 从 ini 文件中读取数据并转换为 QString  
    QString ipResult = settings->value("/ip/second").toString();  
    QString portResult = settings->value("/port/open").toString();  
  
    // 输出读取的数据  
    qDebug() << ipResult;  
    qDebug() << portResult;  
  
    // 读取完成后删除 QSettings 对象  
    delete settings;  
  
    return a.exec();  
}

13.4.5 QT读写ini文件

void saveSettings() {  
    // 开始设置组"MyAppSettings"  
    settings->beginGroup("MyAppSettings");  
  
    // 设置用户名和密码  
    settings->setValue("username", "exampleUser");  
    settings->setValue("password", "examplePassword");  
  
    // 结束设置组  
    settings->endGroup();  
  
    // 同步设置到持久存储  
    settings->sync();  
  
    // 输出保存并同步成功的消息  
    qDebug() << "Settings saved and synced.";  
}  
  
void loadSettings() {  
    // 开始读取组"MyAppSettings"  
    settings->beginGroup("MyAppSettings");  
  
    // 读取用户名和密码  
    QString username = settings->value("username").toString();  
    QString password = settings->value("password").toString();  
  
    // 结束读取组  
    settings->endGroup();  
  
    // 输出加载的设置信息  
    qDebug() << "Loaded settings:" << "Username:" << username << "Password:" << password;  
}

 

13.5 Qt对 Json 文件读写

13.5.1 Json文件介绍

        JSON(JavaScript Object Notation)是一种轻量级、语言无关的数据交换格式,用于存储和表示数据。它具有简洁清晰的层次结构,易于阅读和编写,同时也方便机器解析和生成,提高了网络传输效率。

        JSON主要处理两方面任务:数据序列化用于网络传输,以及写磁盘文件实现数据持久化存储(文件后缀通常为.json)。

        JSON包含两种基本数据格式:JSON数组JSON对象

        JSON数组:使用[ ]表示,内部元素用逗号分隔,支持多种数据类型混合,包括整形、浮点、字符串、布尔类型、JSON数组、JSON对象和空值null。

// 整形数组  
[1, 2, 3, 4, 5]  

// 混合类型数组  
[12, 13.34, true, false, "hello, world", null]  

// 数组嵌套  
[  
    ["cat", "dog", "panda"],  
    ["北京", "上海", "天津"],  
    ["luffy", "boy", 19]  
]  

// 数组和对象嵌套  
[  
    {  
        "luffy": {  
            "age": 19,  
            "father": "Monkey·D·Dragon"  
        }  
    }  
]

        JSON对象:使用{}表示,内部键值对用逗号分隔,键必须是字符串且唯一,值可以是多种数据类型。

{  
    "Name": "Ace",  
    "Sex": "man",  
    "Age": 20,  
    "Family": {  
        "Father": "Gol·D·Roger",  
        "Mother": "Portgas·D·Rouge",  
        "Brother": ["Sabo", "Monkey D. Luffy"]  
    },  
    "IsAlive": false,  
    "Comment": "yyds"  
}

        一个JSON文件只能有一个根节点(JSON对象或JSON数组),不允许有多个并列根节点。

/*正确示例,单个根节点*/
{  
    "userInfo": {  
        "name": "luffy",  
        "age": 19  
    },  
    "account": {  
        "user": "ace",  
        "passwd": "123456"  
    }  
}

13.5.2 Json在Qt中的使用

        从Qt 5.0起,Qt支持JSON,提供了四个主要类用于数据组织和解析。

Json类介绍
QJsonDocument封装JSON文档,支持UTF-8和Qt二进制格式的读写。
QJsonArray值列表,可插入和删除
QJsonObject键值对列表,键为唯一字符串,值为QJsonValue
QJsonValue封装JSON数据类型。

13.5.3 QJsonValue

        在Qt中,QJsonValue可封装六种基础数据类型:布尔、浮点(含整形)、字符串、JSON数组、JSON对象和空值。

QJsonValue jsonBool(true); // 布尔类型  
QJsonValue jsonDouble(3.14); // 浮点类型  
QJsonValue jsonString("Hello"); // 字符串类型  
// ... 其他类型的构造类似

        要判断QJsonValue内部封装的数据类型,可使用相应的判断函数:

bool isArray() const; // 判断是否为JSON数组  
bool isObject() const; // 判断是否为JSON对象  
// ... 其他判断函数类似

        在确定数据类型后,可将其转换为对应的基础数据类型:

QJsonArray toArray() const; // 转换为JSON数组  
bool toBool() const; // 转换为布尔类型  
double toDouble() const; // 转换为浮点类型  
// ... 其他转换函数类似  
QString toString() const; // 转换为字符串类型

13.5.4 QJsonObject

        QJsonObject用于封装JSON对象,可存储多个键值对,其中键为字符串,值为QJsonValue。

        以下是一些常用API函数的精简介绍及示例代码:

// 创建空的QJsonObject对象  
QJsonObject jsonObject;  
  
// 添加键值对到QJsonObject中  
jsonObject.insert("key1", QJsonValue(123)); // 添加整型值,键为"key1"  
jsonObject.insert("key2", QJsonValue("value2")); // 添加字符串值,键为"key2"  
  
// 获取QJsonObject中键值对的个数  
int count = jsonObject.size(); // 使用size()函数获取个数,count()和length()也是等效的  
  
// 通过键获取QJsonObject中的值  
QJsonValue value1 = jsonObject.value("key1"); // 使用value()函数,根据键"key1"获取值  
QJsonValue value2 = jsonObject["key2"];       // 使用operator[],根据键"key2"获取值  
  
// 删除QJsonObject中的键值对  
jsonObject.remove("key1");                       // 删除键"key1"对应的键值对  
QJsonValue takenValue = jsonObject.take("key2"); // 删除并返回键"key2"对应的值  
  
// 通过键在QJsonObject中查找  
auto it = jsonObject.find("key3"); // 查找键"key3",返回迭代器  
bool containsKey = jsonObject.contains("key4"); // 判断是否包含键"key4"  

        遍历键值对,

        1、使用迭代器

// 遍历QJsonObject中的键值对  
// 方法1:使用迭代器遍历  
for (auto it = jsonObject.begin(); it != jsonObject.end(); ++it) {  
    QString key = it.key();  
    QJsonValue value = it.value();  
    // 在此处处理每个键值对  
}  

        2、使用[ ]方式(不推荐,因为需要知道所有键):

// 方法2:先获取所有键,然后遍历键列表(推荐)  
QStringList keys = jsonObject.keys(); // 获取QJsonObject中所有键的列表  
for (const QString &key : keys) {  
    QJsonValue value = jsonObject.value(key); // 根据键获取值  
    // 在此处处理每个键值对  
}  
  
// 注意:方法2中也可以使用operator[]来获取值,但推荐使用value()函数,  
// 因为如果键不存在,operator[]可能会插入一个空值,而value()则不会。

13.5.5 QJsonArray

        QJsonArray用于封装JSON数组,可存储多个QJsonValue类型的元素。

//创建空数组
QJsonArray jsonArray;

//添加数据
jsonArray.append(QJsonValue(123));           // 在尾部追加整型值  
jsonArray.insert(1, QJsonValue("inserted")); // 在索引1之前插入字符串值  
jsonArray.prepend(QJsonValue(true));         // 在数组头部添加布尔值  

// push_back和push_front与append和prepend功能相同,但命名遵循STL风格  
jsonArray.push_back(QJsonValue(456));  
jsonArray.push_front(QJsonValue(false));

//计算数组元素个数
int count = jsonArray.size(); // 使用size()函数,count()也是等效的

//从数组中取出元素
QJsonValue valueAt0 = jsonArray.at(0); // 取出索引0的元素  
QJsonValue firstValue = jsonArray.first(); // 取出头部元素  
QJsonValue lastValue = jsonArray.last(); // 取出尾部元素  
QJsonValue valueAtIndex = jsonArray[2]; // 使用operator[]取出索引2的元素

//删除数组中的元素
auto it = jsonArray.begin(); // 获取迭代器  
it++; // 移动迭代器到第二个元素  
jsonArray.erase(it); // 删除迭代器指向的元素  
  
jsonArray.pop_back(); // 删除尾部元素  
jsonArray.pop_front(); // 删除头部元素  
  
jsonArray.removeAt(1); // 删除索引1的元素  
jsonArray.removeFirst(); // 删除头部元素  
jsonArray.removeLast(); // 删除尾部元素  
  
QJsonValue takenValue = jsonArray.takeAt(0); // 删除索引0的元素并返回其值

QJ遍历数组:

        使用迭代器遍历:

for (auto it = jsonArray.begin(); it != jsonArray.end(); ++it) {  
    QJsonValue value = *it;  
    // 处理每个元素  
}

        使用数组方式遍历:

for (int i = 0; i < jsonArray.size(); ++i) {  
    QJsonValue value = jsonArray.at(i);  
    // 处理每个元素  
}

13.5.6 QJsonDocument

        在Qt中,QJsonDocument类用于封装完整的JSON文档,并支持从UTF-8编码的文本表示以及Qt的二进制格式读取和写入该文档。

QJsonObject 或 QJsonArray 转换为字符串

1、创建QJsonDocument对象:

        用QJsonDocument构造函数,将QJsonObjectQJsonArray转换为QJsonDocument对象。

QJsonObject jsonObject;  
// ... 填充jsonObject数据  
QJsonDocument jsonDoc(jsonObject);  

QJsonArray jsonArray;  
// ... 填充jsonArray数据  
QJsonDocument jsonDocArray(jsonArray);

2、序列化数据:

        调用toBinaryData()toJson()方法,将QJsonDocument对象序列化为二进制格式或文本格式的JSON字符串。

QByteArray binaryData = jsonDoc.toBinaryData();  
QByteArray jsonString = jsonDoc.toJson(QJsonDocument::Indented); // 文本格式,带缩进

3、使用字符串进行数据传输或持久化:

        将得到的字符串通过网络传输或保存到磁盘文件中。

字符串 转换为 QJsonObject 或 QJsonArray

1、解析字符串为QJsonDocument对象:

        使用QJsonDocument的静态函数fromBinaryData()fromJson(),将JSON字符串解析为QJsonDocument对象

QByteArray jsonString = ... // 从网络或文件获取的JSON字符串  
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonString);

2、将文档对象转换为QJsonArray或QJsonObject:

        使用isArray()isObject()方法判断QJsonDocument对象中的数据类型,然后调用array()object()方法将其转换为相应的对象。

if (jsonDoc.isObject()) {  
    QJsonObject jsonObject = jsonDoc.object();  
    // ... 处理jsonObject  
} else if (jsonDoc.isArray()) {  
    QJsonArray jsonArray = jsonDoc.array();  
    // ... 处理jsonArray  
}

3、读取数据:

        使用QJsonArray或QJsonObject提供的API读取存储在对象中的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/892694.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙OS启动流程

启动流程(基于openharmony4.1) 系统上电加载内核后&#xff0c;按照以下流程完成系统各个服务和应用的启动&#xff1a; 内核加载init进程&#xff0c;一般在bootloader启动内核时通过设置内核的cmdline来指定init的位置。init进程启动后&#xff0c;会挂载tmpfs&#xff0c;…

bat脚本banenr

飞出个未来班得 echo off echo .-. echo ( ) echo - echo J L echo ^| ^| echo J L echo ^| ^| echo J L echo …

MySQL-表相关(DDL DML)

文章目录 表的基本操作表的创建表的删除 MySQL中的数据类型整数类型浮点数类型定点数类型日期和时间类型字符串类型charvarchartext 二进制类型 DDL语句查看建表语句修改表名新增字段修改字段(名类型)修改字段(仅类型)删除字段 DML语句insert 增delete 删truncate 语句update 改…

前端学习-CSS的三大特性(十七)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 层叠性 继承性 行高的继承性 优先级 优先级注意点 权重叠加 总结 前言 引入css特性的学习 CSS 有三个非常重要的三个特性:层叠性、继承性、优先级。 层叠…

Android 第5种启动模式:singleInstancePerTask

Android 第5种启动模式&#xff1a;singleInstancePerTask 随着 Android 版本的更新&#xff0c;应用启动模式逐渐丰富。在 Android 12 中&#xff0c;新增了一种启动模式——singleInstancePerTask。它是继 standard、singleTop、singleTask 和 singleInstance 之后的第五种启…

纯css 轮播图片,鼠标移入暂停 移除继续

核心 滚动&#xff1a; animation: 动画名称 20s linear infinite normal;停止&#xff1a; animation: 动画名称 20s linear infinite paused; 完整例子&#xff1a; html: <div class"carousel-wrapper"><div class"carousel"><div cl…

chrome浏览器映射端口

chrome://inspect/#devices 方法2

mysql主从复制及故障修复

一、主MySQL数据库的配置 分别在三台主机&#xff08;chen2/10.110、chen3/10.120、chen4/10.130)中安装mysql数据&#xff0c;其中chen2/10.110作为主MySQL服务器&#xff0c;其余两台作为从MySQL服务器。 1、在主机上部署mysql数据库 详细的请看上一篇&#xff1a;mysql数据…

NewStarCTF2024-Week2-Web-WP

目录 1、复读机 2、你能在一秒内打出八句英文吗 3、遗失的拉链 4、谢谢皮蛋 plus 5、PangBai 过家家&#xff08;2&#xff09; 1、复读机 测了下存在 ssti 没什么说的 fenjing 秒了 2、你能在一秒内打出八句英文吗 每次出来的需要提交的内容都不一样 exp&#xff1a; …

CUDA 全局内存

全局内存在片外。 特点是&#xff1a;容量最大、延迟最大、使用最多 全局内存中的数据是所有线程可见的&#xff0c;Host端可见&#xff0c;且具有与程序相同的生命周期 动态全局内存 主机代码使用CUDA运行时API &#xff1a; cudaMalloc 声明内存空间&#xff1b; cudaFree…

MySQL【知识改变命运】07

MySQL 1&#xff1a;Group by 分组查询1.1&#xff1a;语法&#xff1a;1.2&#xff1a;练习 2&#xff1a;having⼦句3回顾&#xff1a;3&#xff1a;内置函数3.1 :⽇期函数 1&#xff1a;Group by 分组查询 可以根据某列&#xff0c;进行分组查询&#xff0c;比如学校里面的…

基于cloudreve(Docker应用)搭建网盘服务,用于目录的分享和在线预览。

文章目录 I 基于cloudreve(Docker应用)搭建网盘服务安装主要功能设置角色最大容量II 知识扩展:网盘类的文件预览需求背景: iOS可以直接预览PDF等常见格式文件,但是Android浏览器需要先下载文件,才能查看文件内容,因此需要搭建支持目录的分享和在线预览的MinIO文件服务提供…

数据安全存储系统的概念与原理

数据安全存储系统是一种综合性的数据保护方案&#xff0c;旨在确保数据的完整性、保密性和可用性。以下是对数据安全存储系统的详细介绍&#xff1a; 一、概念与原理 数据安全存储系统通过硬件、软件和网络等多个层面的保护措施&#xff0c;防止未经授权的访问、避免数据丢失或…

【MySQL 保姆级教学】表结构的操作(4)

表结构的操作 1. 定义和语法2. 创建表 CREATE2.1 创建表的本质2.2 表的存储引擎2.3 表的字符集和校验规则2.4 创建表实例 3. 查看表结构 DESC3.1 作用3.2 示例 4. 修改表结构 ALTER4.1 添加列 ADD4.2 修改列 MODIFY4.3 删除列 DROP4.4 更改列名 CHANGE 5. 修改表名 RENAME6. 删…

一次性解决vue3引入@jiaminghi/data-view需要手动修改node_modules下文件

修改文件1&#xff1a;node_modules\jiaminghi\data-view\lib\components\decoration6\src\main.vue 修改文件2&#xff1a; node_modules\jiaminghi\data-view\lib\components\decoration3\src\main.vue 修改前&#xff1a; 修改后&#xff1a; 通过打补丁的方式对引用库进行…

【自动驾驶】控制算法(十二)横纵向综合控制 | 从理论到实战全面解析

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

Maven与Gradle的区别

Maven与Gradle是两种流行的构建工具&#xff0c;广泛用于Java项目的管理和构建。以下是它们的对比&#xff0c;包括官网、Windows 11配置环境、在IDEA中的相同点和不同点&#xff0c;以及它们各自的优缺点。 官网 Maven官网: https://maven.apache.orgGradle官网: https://gr…

将爱传递 将“服务好”延伸

从泰康客户,转身成为泰康人,她直言是因为亲身感受了泰康“服务好”的魅力。 入司已8年的泰康养老浙江分公司HWP何英英,是泰康“服务好”的受益者。她从朋友的理赔中见证了泰康服务好的温度与力量,又被泰康养老的职域模式所吸引选择加入泰康。如今,她全身心投入在服务的第一线,…

2024软考网络工程师笔记 - 第4章.局域网和城域网

文章目录 局域网基础1️⃣局域网和城域网体系架构 IEEE&#xff08;负责链路层&#xff09;2️⃣局域网拓扑结构 &#x1f551;CSMA/CD1️⃣CSMA/CD2️⃣CSMA/CD三种监听算法3️⃣冲突检测原理 &#x1f552;二进制指数退避算法1️⃣ 二进制指数退避算法 &#x1f553;最小帧长…

分库分表方式介绍

分库分表方式 分库分表包括分库和分表两个部分&#xff0c;在生产中通常包括&#xff1a;垂直分库、水平分库、垂直分表、水平分表四种方式&#xff1b; 1、垂直分表 1.1 垂直分表定义 垂直分表就是在同一数据库内将一张表按照指定字段分成若干表&#xff0c;每张表仅存储其…