当前位置: 首页 > news >正文

十四天学会C++之第八天:文件操作

1. 文件的打开和关闭

  • 文件操作的基本概念。
  • 打开文件:使用fstream库打开文件以供读写。
  • 关闭文件:确保文件在使用完毕后正确关闭。

文件的打开和关闭:C++ 文件操作入门

在C++编程中,文件操作是一项重要的任务,可以读取和写入数据到文件中。这对于数据的永久性存储和检索至关重要。

文件操作的基本概念

在进行文件操作之前,让我们先了解一些基本概念:

  • 文件:文件是数据的持久性存储方式。它可以是文本文件(包含文本信息)或二进制文件(包含二进制数据)。

  • 文件流:在C++中,文件被视为数据流。流是一个抽象的概念,用于表示数据的顺序传递。文件流分为输入流(用于读取文件)和输出流(用于写入文件)。

打开文件

要打开文件以供读取或写入,我们需要使用C++的fstream库,它提供了fstream、ifstream和ofstream三个类,分别用于文件的读取、写入和同时读写。

以下是打开文件的一般步骤:

  1. 包含头文件:首先,您需要包含 <fstream> 头文件以使用文件流类。

  2. 创建文件流对象:根据需求,创建一个输入流对象(ifstream)、输出流对象(ofstream)或输入/输出流对象(fstream)。

  3. 打开文件:使用流对象的 open 方法来打开文件。在打开文件时,需要指定文件的名称和打开模式。例如,要打开一个文本文件以供读取,使用 ifstream 并指定打开模式为 ios::in

#include <fstream>int main() {// 创建输入流对象std::ifstream inputFile;// 打开文件以供读取inputFile.open("example.txt", std::ios::in);if (!inputFile) {// 处理文件打开失败的情况std::cerr << "无法打开文件" << std::endl;return 1;}// 文件已成功打开,可以进行读取操作// 关闭文件inputFile.close();return 0;
}

关闭文件

在文件操作完成后,为了确保文件被正确关闭,我们应该使用流对象的 close 方法关闭文件。这个步骤很重要,因为它确保文件在程序执行后不会被修改或损坏。

// 关闭文件
inputFile.close();

请注意,如果不关闭文件而直接退出程序,文件可能会被操作系统保持打开状态,这可能导致其他问题。

#include <iostream>
#include <fstream>int main() {// 创建输出流对象std::ofstream outputFile;// 打开文件以供写入,如果文件不存在将创建新文件outputFile.open("example.txt", std::ios::out);if (!outputFile) {// 处理文件打开失败的情况std::cerr << "无法打开文件" << std::endl;return 1;}// 写入数据到文件outputFile << "这是一个示例文本文件。" << std::endl;// 关闭文件outputFile.close();return 0;
}

2. 文件读写

  • 读取文件:使用ifstream类读取文本文件。
  • 写入文件:使用ofstream类将数据写入文本文件。
  • 二进制文件:介绍如何读写二进制文件。

读取文件

读取文本文件

要读取文本文件,我们可以使用ifstream类,它是C++标准库中用于输入文件流的类。以下是读取文本文件的基本步骤:

  1. 包括头文件:首先,您需要包括 <fstream> 头文件以使用文件流类。

  2. 创建ifstream对象:创建一个ifstream对象,并将文件名作为参数传递给其构造函数。

  3. 打开文件:使用ifstream对象的 open 方法打开文件。

  4. 读取数据:使用输入运算符 >> 从文件中读取数据。

  5. 关闭文件:使用ifstream对象的 close 方法关闭文件。

#include <iostream>
#include <fstream>
#include <string>int main() {// 创建输入文件流对象std::ifstream inputFile;// 打开文本文件以供读取inputFile.open("example.txt", std::ios::in);if (!inputFile) {std::cerr << "无法打开文件" << std::endl;return 1;}// 读取文件中的数据std::string line;while (std::getline(inputFile, line)) {std::cout << line << std::endl;}// 关闭文件inputFile.close();return 0;
}
写入文件

要写入数据到文本文件,我们可以使用ofstream类,它是C++标准库中用于输出文件流的类。以下是写入文本文件的基本步骤:

  1. 包括头文件:首先,您需要包括 <fstream> 头文件以使用文件流类。

  2. 创建ofstream对象:创建一个ofstream对象,并将文件名作为参数传递给其构造函数。

  3. 打开文件:使用ofstream对象的 open 方法打开文件。

  4. 写入数据:使用输出运算符 << 向文件中写入数据。

  5. 关闭文件:使用ofstream对象的 close 方法关闭文件。

#include <iostream>
#include <fstream>int main() {// 创建输出文件流对象std::ofstream outputFile;// 打开文本文件以供写入,如果文件不存在将创建新文件outputFile.open("example.txt", std::ios::out);if (!outputFile) {std::cerr << "无法打开文件" << std::endl;return 1;}// 写入数据到文件outputFile << "这是一个示例文本文件。" << std::endl;// 关闭文件outputFile.close();return 0;
}

二进制文件

读写二进制文件,可以使用相同的ifstream和ofstream类,但要注意文件模式。打开二进制文件时,您需要将文件模式设置为std::ios::binary

#include <iostream>
#include <fstream>int main() {// 创建二进制输出文件流对象std::ofstream binaryOutputFile;// 打开二进制文件以供写入,如果文件不存在将创建新文件binaryOutputFile.open("binary_data.bin", std::ios::out | std::ios::binary);if (!binaryOutputFile) {std::cerr << "无法打开文件" << std::endl;return 1;}// 写入二进制数据到文件int data[] = {1, 2, 3, 4, 5};binaryOutputFile.write(reinterpret_cast<char*>(data), sizeof(data));// 关闭文件binaryOutputFile.close();// 创建二进制输入文件流对象std::ifstream binaryInputFile;// 打开二进制文件以供读取binaryInputFile.open("binary_data.bin", std::ios::in | std::ios::binary);if (!binaryInputFile) {std::cerr << "无法打开文件" << std::endl;return 1;}// 读取二进制数据int readData[5];binaryInputFile.read(reinterpret_cast<char*>(readData), sizeof(readData));// 关闭文件binaryInputFile.close();// 输出读取的数据for (int i = 0; i < 5; ++i) {std::cout << readData[i] << " ";}std::cout << std::endl;return 0;
}

演示如何将整数数组写入二进制文件,然后再次读取并显示。请注意,使用reinterpret_cast将整数数组的地址转换为char*,以便正确读写二进制数据。

3. 文本文件和二进制文件的处理

  • 文本文件 vs. 二进制文件:区别和适用场景。
  • 读写文本文件:如何逐行读取和写入文本文件。
  • 读写二进制文件:如何以二进制方式读写文件。

文本文件 vs. 二进制文件

文本文件通常包含可读的字符数据,如文本文档、配置文件等。它们使用普通的字符编码(如ASCII或UTF-8)来表示文本内容。文本文件易于阅读和编辑,但不适合存储非文本数据,如图像或音频。

二进制文件包含的是原始的二进制数据,没有字符编码。它们通常用于存储非文本数据,如图像、音频、视频、数据库文件等。二进制文件可以存储任何类型的数据,但不易于人类阅读或编辑。

读写文本文件

读取文本文件
#include <iostream>
#include <fstream>
#include <string>int main() {std::ifstream inputFile("textfile.txt"); // 打开文本文件以供读取if (!inputFile) {std::cerr << "无法打开文件" << std::endl;return 1;}std::string line;while (std::getline(inputFile, line)) { // 逐行读取std::cout << line << std::endl; // 处理每行数据}inputFile.close(); // 关闭文件return 0;
}
写入文本文件
#include <iostream>
#include <fstream>int main() {std::ofstream outputFile("output.txt"); // 打开文本文件以供写入if (!outputFile) {std::cerr << "无法打开文件" << std::endl;return 1;}outputFile << "写入文本文件的内容" << std::endl; // 写入数据outputFile.close(); // 关闭文件return 0;
}

读写二进制文件

读写二进制文件需要更小心,必须确保数据以正确的格式进行存储和读取。

读取二进制文件
#include <iostream>
#include <fstream>int main() {std::ifstream inputFile("binaryfile.bin", std::ios::binary); // 打开二进制文件以供读取if (!inputFile) {std::cerr << "无法打开文件" << std::endl;return 1;}int data;while (inputFile.read(reinterpret_cast<char*>(&data), sizeof(int))) { // 逐块读取std::cout << data << " "; // 处理每个数据块}inputFile.close(); // 关闭文件return 0;
}
写入二进制文件
#include <iostream>
#include <fstream>int main() {std::ofstream outputFile("binaryfile.bin", std::ios::binary); // 打开二进制文件以供写入if (!outputFile) {std::cerr << "无法打开文件" << std::endl;return 1;}int data[] = {1, 2, 3, 4, 5};for (int i = 0; i < 5; ++i) {outputFile.write(reinterpret_cast<char*>(&data[i]), sizeof(int)); // 写入数据块}outputFile.close(); // 关闭文件return 0;
}

请注意,二进制文件的读写中使用std::ios::binary标志,以确保以二进制模式打开文件。

4. 示例和练习

示例1:文本文件读取和写入

#include <iostream>
#include <fstream>
#include <string>int main() {// 示例1: 从input.txt读取文本内容,写入output.txtstd::ifstream inputFile("input.txt");std::ofstream outputFile("output.txt");if (!inputFile || !outputFile) {std::cerr << "无法打开文件" << std::endl;return 1;}std::string line;while (std::getline(inputFile, line)) {// 处理文本行outputFile << line << std::endl;}inputFile.close();outputFile.close();return 0;
}

示例2:二进制文件读取和写入

#include <iostream>
#include <fstream>int main() {// 示例2: 读取和写入二进制文件int data[] = {1, 2, 3, 4, 5};std::ofstream binaryOutputFile("data.bin", std::ios::binary);if (!binaryOutputFile) {std::cerr << "无法打开文件" << std::endl;return 1;}binaryOutputFile.write(reinterpret_cast<char*>(data), sizeof(data));binaryOutputFile.close();std::ifstream binaryInputFile("data.bin", std::ios::binary);if (!binaryInputFile) {std::cerr << "无法打开文件" << std::endl;return 1;}int readData[5];binaryInputFile.read(reinterpret_cast<char*>(readData), sizeof(readData));for (int i = 0; i < 5; ++i) {std::cout << readData[i] << " ";}binaryInputFile.close();return 0;
}

练习题

问题1:创建一个程序,从用户输入中读取文本,并将其写入名为user_input.txt的文本文件。

#include <iostream>
#include <fstream>
#include <string>int main() {std::string userInput;// 从用户输入读取文本std::cout << "请输入文本内容:" << std::endl;std::getline(std::cin, userInput);// 打开文件以写入内容std::ofstream outputFile("user_input.txt");if (!outputFile) {std::cerr << "无法打开文件" << std::endl;return 1;}// 写入用户输入的文本到文件outputFile << userInput << std::endl;// 关闭文件outputFile.close();std::cout << "文本已写入 user_input.txt 文件。" << std::endl;return 0;
}

运行结果:

在这里插入图片描述

问题2:创建一个程序,读取名为numbers.txt的文本文件中的数字,计算它们的总和并显示在屏幕上。

#include <iostream>
#include <fstream>int main() {// 打开包含数字的文本文件std::ifstream inputFile("numbers.txt");if (!inputFile) {std::cerr << "无法打开文件" << std::endl;return 1;}int number;int sum = 0;// 逐行读取数字并计算总和while (inputFile >> number) {sum += number;}// 关闭文件inputFile.close();// 显示总和std::cout << "数字的总和为: " << sum << std::endl;return 0;
}

运行结果:

在这里插入图片描述

问题3:创建一个程序,使用二进制文件存储学生成绩数据,并编写函数来查找特定学生的分数。

#include <iostream>
#include <fstream>
#include <string>struct Student {std::string name;int score;
};void writeStudentData(const std::string& filename, const Student& student) {std::ofstream outputFile(filename, std::ios::binary | std::ios::app);if (!outputFile) {std::cerr << "无法打开文件" << std::endl;return;}outputFile.write(reinterpret_cast<const char*>(&student), sizeof(Student));outputFile.close();
}Student findStudentData(const std::string& filename, const std::string& targetName) {Student student;std::ifstream inputFile(filename, std::ios::binary);if (!inputFile) {std::cerr << "无法打开文件" << std::endl;return student;}while (inputFile.read(reinterpret_cast<char*>(&student), sizeof(Student))) {if (student.name == targetName) {inputFile.close();return student;}}inputFile.close();student.name = "未找到";student.score = -1;return student;
}int main() {// 写入学生数据到二进制文件Student student1 = { "Alice", 90 };Student student2 = { "Bob", 85 };writeStudentData("student_data.bin", student1);writeStudentData("student_data.bin", student2);// 查找特定学生的分数std::string targetName = "Alice";Student foundStudent = findStudentData("student_data.bin", targetName);if (foundStudent.name == "未找到") {std::cout << "找不到学生:" << targetName << std::endl;} else {std::cout << "学生姓名:" << foundStudent.name << ",分数:" << foundStudent.score << std::endl;}return 0;
}

运行结果:

在这里插入图片描述

问题4:创建一个程序,将两个文本文件合并成一个新文件。

#include <iostream>
#include <fstream>
#include <string>int main() {// 打开第一个文本文件以读取内容std::ifstream inputFile1("file1.txt");if (!inputFile1) {std::cerr << "无法打开文件1" << std::endl;return 1;}// 打开第二个文本文件std::ifstream inputFile2("file2.txt");if (!inputFile2) {std::cerr << "无法打开文件2" << std::endl;return 1;}// 创建新文件以写入合并内容std::ofstream outputFile("merged_file.txt");if (!outputFile) {std::cerr << "无法创建新文件" << std::endl;return 1;}// 从文件1读取并写入到新文件std::string line;while (std::getline(inputFile1, line)) {outputFile << line << std::endl;}// 从文件2读取并写入到新文件while (std::getline(inputFile2, line)) {outputFile << line << std::endl;}// 关闭文件inputFile1.close();inputFile2.close();outputFile.close();std::cout << "文件已成功合并为 merged_file.txt" << std::endl;return 0;
}

运行结果:

在这里插入图片描述

相关文章:

十四天学会C++之第八天:文件操作

1. 文件的打开和关闭 文件操作的基本概念。打开文件&#xff1a;使用fstream库打开文件以供读写。关闭文件&#xff1a;确保文件在使用完毕后正确关闭。 文件的打开和关闭&#xff1a;C 文件操作入门 在C编程中&#xff0c;文件操作是一项重要的任务&#xff0c;可以读取和写…...

基于(N-1)×(N-1)棋盘的解的情况推出N×N棋盘的解的情况的N皇后问题

N皇后问题是一个比较经典的问题&#xff0c;其主要目标是在NN的棋盘上&#xff0c;放置N个皇后&#xff0c;要求所有皇后之间不能互相攻击&#xff0c;即任意两个皇后不能处在同一行、同一列或同一对角线上。解决该问题可以采用递归的方式&#xff0c;基于(N-1)棋盘的解的情况推…...

Vue mixin混入

可以把多个组件中共有的配置提取出来构成一个混入。 一、配置混入 &#xff08;一&#xff09; 创建mixin.js 这里的名字可以自定义&#xff0c;但是为了方便识别&#xff0c;多数场景下都写mixin。 mixin.js 要创建在src目录下&#xff0c;与main.js平级&#xff1a; &…...

基于 FFmpeg 的跨平台视频播放器简明教程(十):在 Android 运行 FFmpeg

系列文章目录 基于 FFmpeg 的跨平台视频播放器简明教程&#xff08;一&#xff09;&#xff1a;FFMPEG Conan 环境集成基于 FFmpeg 的跨平台视频播放器简明教程&#xff08;二&#xff09;&#xff1a;基础知识和解封装&#xff08;demux&#xff09;基于 FFmpeg 的跨平台视频…...

正点原子嵌入式linux驱动开发——Linux LCD驱动

LCD是很常用的一个外设&#xff0c;通过LCD可以显示绚丽的图片、界面等&#xff0c;提交人机交互的效率。STM32MP1提供了一个LTDC接口用于连接RGB接口的液晶屏。本章就来学校一下如何在Linux下驱动LCD屏。 LCD和LTDC简介 LCD简介 这里在当时学习stm32裸机开发的时候就学过了…...

2-Java进阶知识总结-6-多线程

文章目录 多线程--基本概念并发和并行进程和线程多线程 多线程--实现方式一&#xff0c;继承Thread类方法介绍实现步骤注意事项 方式二&#xff0c;实现Runnable接口Thread构造方法实现步骤 方式三&#xff0c;实现Callable接口方法介绍实现步骤 三种多线程实现方法对比 多线程…...

openwrt下游设备在校园网(DLUT-LingShui)中使用ipv6网络

背景&#xff1a;校园网最多支持6台设备的无感认证&#xff0c;需要使用路由器(本人使用openwrt系统)为更多的设备提供网络&#xff0c;但校园网分配的ipv6地址子网为/128&#xff0c;不能为路由器下的设备分配全球ipv6地址&#xff0c;因此需要使用nat6转发下游设备的局域网ip…...

10个基于.Net开发的Windows开源软件项目

1、基于.NET的强大软件开发工具 一个基于.Net Core构建的简单、跨平台快速开发框架。JNPF开发平台前后端封装了上千个常用类&#xff0c;方便扩展&#xff1b;集成了代码生成器&#xff0c;支持前后端业务代码生成&#xff0c;满足快速开发&#xff0c;提升工作效率&#xff1b…...

Java多线程秘籍,掌握这5种方法,让你的代码优化升级

介绍5种多线程方法&#xff0c;助您提高编码效率&#xff01; 如果您的应用程序与那些能够同时处理多个任务的应用程序相比表现不佳&#xff0c;很可能是因为它是单线程的。解决这个问题的方法之一是采用多线程技术。 以下是一些可以考虑的方法&#xff1a; 线程&#xff08;…...

npm install报错 缺少python

报错信息&#xff1a; Building:E:tolsnvmnodesnodeexe : ode emos ant-desig-we-eos odemodules node-gypbintnode-gp.s rebld -verbose -Libsass_ext --Libsas_cflags- lags --libsass_librarygyp info it worked if it ends with ok gyp verb cli [ gyp verb cliE: toolsnv…...

达梦:开启sql日志记录

前言 开启sql日志记录&#xff0c;可协助排查定位数据库问题。生产开启会有一定的性能消耗&#xff0c;建议打开 SQL 日志异步刷盘功能 1.配置sqllog.ini文件 sqllog.ini 用于 SQL 日志的配置&#xff0c;当且仅当 INI 参数 SVR_LOG1 时使用。 运行中的数据库实例&#xff0c;可…...

C语言开发,指针进阶,字符串查找,包含,拼接

文章目录 C语言开发&#xff0c;指针进阶。1.字符串与指针的关系2.指针获取字符串具体内容3.字符串比较&#xff0c;查找&#xff0c;包含&#xff0c;拼接4.字符串大小写 C语言开发&#xff0c;指针进阶。 1.字符串与指针的关系 // // Created by MagicBook on 2023-10-22. …...

PyCharm中文使用详解

PyCharm是一个Python IDE&#xff0c;可以帮助程序员节省时间&#xff0c;提高生产力。那么具体怎么用呢&#xff1f;本文介绍了PyCharm的安装、插件、外部工具、专业功能等&#xff0c;希望对大家有所帮助。 之前没有系统介绍过PyCharm。如何配置环境&#xff0c;如何DeBug&a…...

一键同步,无处不在的书签体验:探索多电脑Chrome书签同步插件

说在前面 平时大家都是怎么管理自己的浏览器书签数据的呢&#xff1f;有没有过公司和家里的电脑浏览器书签不同步的情况&#xff1f;有没有过电脑突然坏了但书签数据没有导出&#xff0c;导致书签数据丢失了&#xff1f;解决这些问题的方法有很多&#xff0c;我选择自己写个chr…...

在Go项目中二次封装Kafka客户端功能

1.摘要 在上一章节中,我利用Docker快速搭建了一个Kafka服务,并测试成功Kafka生产者和消费者功能,本章内容尝试在Go项目中对Kafka服务进行封装调用, 实现从Kafka自动接收消息并消费。 在本文中使用了Kafka的一个高性能开源库Sarama, Sarama是一个遵循MIT许可协议的Apache Kafk…...

CVE-2021-44228 Apache log4j 远程命令执行漏洞

一、漏洞原理 log4j(log for java)是由Java编写的可靠、灵活的日志框架&#xff0c;是Apache旗下的一个开源项目&#xff0c;使用Log4j&#xff0c;我们更加方便的记录了日志信息&#xff0c;它不但能控制日志输出的目的地&#xff0c;也能控制日志输出的内容格式&#xff1b;…...

前端跨域相关

注&#xff1a;前端配置跨域后服务器端&#xff08;Nginx&#xff09;也需要配置&#xff0c;否则接口无法访问 vue跨域 配置文件 /vue.config.js devServer: { port: 7100, proxy: { /api: { target: http://域名, changeOrigin: true, logLevel: debug, pathRewrite: { ^/…...

HTML笔记-狂神

1. 初识HTML 什么是HTML&#xff1f; Hyper Text Markup Language : 超文本标记语言 超文本包括&#xff1a;文字、图片、音频、视频、动画等 目前使用的是HTML5&#xff0c;使用 W3C标准 W3C标准包括&#xff1a; 结构化标准语言&#xff08;HTML、XML&#xff09; 表现标…...

python自动化测试工具selenium

概述 selenium是网页应用中最流行的自动化测试工具&#xff0c;可以用来做自动化测试或者浏览器爬虫等。官网地址为&#xff1a;Selenium。相对于另外一款web自动化测试工具QTP来说有如下优点&#xff1a; 免费开源轻量级&#xff0c;不同语言只需要一个体积很小的依赖包支持…...

输入/输出应用程序接口和设备驱动程序接口

文章目录 1.输入/输出应用程序接口1.字符设备接口2.块设备接口3.网络设备接口1.网络设备套接字通信 4.阻塞/非阻塞I/O 2.设备驱动程序接口1.统一标准的设备驱动程序接口 1.输入/输出应用程序接口 1.字符设备接口 get/put系统调用:向字符设备读/写一个字符 2.块设备接口 read/wr…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...