C++学习之旅(二)运行四个小项目 (Ubuntu使用Vscode)
如果是c语言学的比较好的同学 可以直接跟着代码敲一遍,代码附有详细语法介绍,不可错过
一,猜数字游戏
#include <iostream>
#include <cstdlib>
#include <ctime>int main()
{srand(static_cast<unsigned int>(time(0)));int secretNumber = rand() % 100 + 1;int guess = 0;int tries = 0;const int MAX_TRIES = 7;std::cout << "Welcome to guess number game!\n";std::cout << "I have a number from 1 to 100, you have " << MAX_TRIES << " times to try it. ";while ( guess != secretNumber && tries < MAX_TRIES){std::cout << "guess what number is it: ";std::cin >> guess;tries ++;if (guess > secretNumber) {std::cout << "too hign\n";} else if (guess < secretNumber) {std::cout << "too low\n";} else {std::cout << "Congratulations!";}}if (guess != secretNumber) {std::cout << "Sorry, you die. the number is " << secretNumber << ". \n";}return 0;
}
写了一个猜数字的小游戏,首先要配置任务运行编译器:
- 按下
Ctrl + Shift + P打开命令面板,输入Configure Task,然后选择Tasks: Configure Task。 - 选择
C/C++: g++.exe build active file(可能会有轻微的名称差异)以自动生成一个tasks.json文件。这个文件定义了编译任务。 - 你可能需要根据需要修改
tasks.json中的命令,例如指定不同的编译器标志。 - 我使用的是g++,
tasks.json应该是类似于下面的代码: -
{"version": "2.0.0","tasks": [{"type": "cppbuild","label": "C/C++: g++ 生成活动文件","command": "/usr/bin/g++","args": ["-fdiagnostics-color=always","-g","${file}","-o","${fileDirname}/${fileBasenameNoExtension}"],"options": {"cwd": "${fileDirname}"},"problemMatcher": ["$gcc"],"group": {"kind": "build","isDefault": true},"detail": "编译器: /usr/bin/g++"}] } - 按下
Ctrl + Shift + D打开调试视图,然后点击“创建 launch.json 文件”链接。 - 选择“C++ (GDB/LLDB)”。
- 选择“g++ - 生成并调试活动文件”配置。
- 这将自动生成一个
launch.json文件,你可以根据需要调整这个文件。
在Vscode的终端中运行文件就可以正常运行你的代码了
![]()
由于本人长时间使用c语言,所以对C++的语法不大熟悉,下面来解释以下令我疑惑的代码片段:
srand(static_cast<unsigned int>(time(0)));
srand()用于设置随机数生成器的种子。time(0)获取当前时间作为种子。static_cast<unsigned int>将time(0)的返回值转换为unsigned int类型。
它在代码中的具体作用是:
-
time(0):time函数来自<ctime>或<time.h>库,它返回当前时间(从1970年1月1日到现在的秒数)。- 传递
0作为参数意味着请求当前的日历时间。
-
static_cast<unsigned int>(...):static_cast是C++中的类型转换操作符,用于显式地将一种类型转换为另一种类型。- 在这里,它将
time(0)返回的时间值转换为unsigned int类型。这是因为srand函数需要一个无符号整数(unsigned int)作为种子值。
-
srand(...):srand是 “set random” 的缩写,来自<cstdlib>或<stdlib.h>库。- 它用于设置随机数生成器的初始种子值。
- 种子决定了随机数生成器产生的伪随机数序列。不同的种子会产生不同的序列。
- 如果你每次运行程序时使用相同的种子,将会得到相同的随机数序列。这在某些情况下是有用的,比如在需要可重复测试的场景中。
因此,srand(static_cast<unsigned int>(time(0))); 这行代码的作用是使用当前时间作为种子来初始化随机数生成器,确保每次运行程序时都能产生不同的随机数序列。这对于任何需要随机性的程序,如游戏、模拟或安全相关的应用,都是非常重要的。
二,银行账户管理系统
项目概述
- 类名:
BankAccount - 属性:
accountNumber(账户号码)accountHolder(账户持有人名称)balance(账户余额)
- 方法:
- 构造函数 (用于创建账户)
deposit(存款)withdraw(取款)getBalance(查看余额)displayAccountDetails(显示账户详情)
代码实现
#include <iostream>
#include <string>class BankAccout {
private:std::string accountNumber;std::string accountHolder;double balance;public:BankAccout(std::string accountNumber, std::string accountHolder): accountNumber(accountNumber), accountHolder(accountHolder), balance(0) {}void deposit(double amount) {if (amount > 0) {balance += amount;}}void withdraw(double amount) {if (amount <= balance) {balance -= amount;}}double getBalance() const {return balance;}void displayAccountDetails() const {std::cout << "Account Number: " << accountNumber << "\n"<< "Account Holder: " << accountHolder << "\n"<< "balance: " << balance << "\n";}};int main() {BankAccout account("12345678", "John Doe");account.displayAccountDetails();account.deposit(1000);account.withdraw(500);account.displayAccountDetails();return 0;
}
项目解析
- 类定义:定义了一个名为
BankAccount的类,其中包含账户的基本信息和操作。 - 私有成员变量:
accountNumber,accountHolder, 和balance是类的属性,它们被设置为私有,以避免直接从类的外部访问和修改。 - 公有成员函数:包括构造函数、
deposit、withdraw、getBalance和displayAccountDetails,用于执行银行账户的各种操作。 - 主函数 (
main):在这里创建并操作BankAccount类的实例。
这个项目展示了C++的面向对象编程基础,包括类的定义、对象的创建、方法的调用等。您可以通过添加更多功能(如交易历史记录、多个账户管理、密码保护等)来扩展此项目,从而更深入地理解和实践C++编程。
部分代码片段详细介绍
BankAccount(std::string accountNumber, std::string accountHolder)
BankAccount是类名,这里用作构造函数的名称。构造函数用于初始化对象的新实例。- 括号内的
std::string accountNumber和std::string accountHolder是构造函数的参数。当创建BankAccount类的对象时,你需要提供这些参数。 -
: accountNumber(accountNumber), accountHolder(accountHolder), balance(0) - 成员初始化列表以冒号
:开始,后面紧跟类成员的初始化。 accountNumber(accountNumber)表示用构造函数接收的accountNumber参数来初始化类的accountNumber成员变量。accountHolder(accountHolder)同理,表示用参数accountHolder初始化类成员accountHolder。balance(0)表示类成员balance被初始化为0。
为什么使用成员初始化列表
成员初始化列表在构造函数体执行前初始化类的成员变量。这比在构造函数体内赋值更有效率,特别是对于复杂类型的成员变量(如对象)。在这个特定例子中,使用成员初始化列表初始化字符串成员变量和一个浮点数是一种标准做法。
完整的构造函数
将这些部分组合在一起,构造函数的意思是:当创建 BankAccount 类的对象时,需要提供账户号码和持有人姓名。这些值将被用来初始化对象的相应成员变量,同时账户余额被初始化为0。
三,学生信息管理系统
当然可以。让我们构建一个稍微复杂一些的C++项目,这次我们将实现一个简单的学生信息管理系统。在这个系统中,我们将创建两个类:一个是Student类,用来表示单个学生的信息;另一个是StudentManager类,用来管理多个学生的信息。
这个项目将展示如何使用C++来处理更复杂的数据结构,以及如何在类之间进行交互。
项目概述
-
类
Student:- 属性:
name(学生姓名)id(学生ID)grade(学生成绩)
- 方法:
- 构造函数
- 显示学生信息 (
displayInfo)
- 属性:
-
类
StudentManager:- 属性:
students(一个存储多个Student对象的容器)
- 方法:
- 添加学生 (
addStudent) - 显示所有学生信息 (
displayAllStudents)
- 添加学生 (
- 属性:
代码实现
#include <iostream>
#include <vector>
#include <string>class Student {
private:std::string name;std::string id;double grade;public:Student(std::string name, std::string id, double grade): name(name), id(id), grade(grade) {}void displayInfo() const {std::cout << "Student Name: " << name<< ", ID: " << id<< ", Grade: " << grade << "\n";}
};class StudentManager {
private:std::vector<Student> students;public:void addStudent(const Student& student) {students.push_back(student);}void displayAllStudent() const {for (const auto& student : students) {student.displayInfo();}}
};int main() {StudentManager manager;manager.addStudent(Student("Alice", "A001", 91.5));manager.addStudent(Student("Bob", "B002", 88.5));manager.addStudent(Student("Charlie", "C003", 79.5));manager.displayAllStudent();return 0;}
部分代码片段分析
class StudentManager {
private:std::vector<Student> students;public:void addStudent(const Student& student) {students.push_back(student);}void displayAllStudent() const {for (const auto& student : students) {student.displayInfo();}}
};
private:std::vector<Student> students;
private关键字指明紧随其后的成员是私有的,只能被StudentManager类的成员函数访问。std::vector<Student> students;声明了一个std::vector,这是C++标准库中的一个动态数组,用来存储Student对象。students是此向量的名称。
public:void addStudent(const Student& student) {students.push_back(student);}
public关键字指明紧随其后的成员是公有的,可以被任何访问StudentManager对象的代码访问。addStudent函数接收一个对Student类型的引用(const Student& student)作为参数。使用引用可以避免复制整个Student对象,而const确保传递的Student对象不会在这个函数中被修改。引用 (&):在 C++ 中,引用相当于是另一个变量的别名。使用引用可以避免在函数调用时复制数据,从而提高效率。当你用引用作为函数参数时,实际上是传递了对原始数据的直接访问权,而不是其副本。students.push_back(student);将传入的Student对象添加到students向量的末尾。
void displayAllStudents() const {for (const auto& student : students) {student.displayInfo();}}
displayAllStudents函数用于显示所有学生的信息。const关键字表示这个函数不会修改StudentManager对象。for (const auto& student : students)是一个范围基于的for循环,用于遍历students向量中的每个Student对象。这里使用auto关键字让编译器自动推断student的类型。- 在循环内部,
student.displayInfo();调用了每个Student对象的displayInfo函数,以显示其信息。
这个类的设计展示了C++面向对象编程的一些关键概念,如封装、数据隐藏和接口公开。通过 StudentManager 类的公有接口,外部代码可以向管理器添加学生对象和显示所有学生的信息,而无需直接操作内部的 students 向量。这是一种良好的设计实践,因为它保持了类的内部状态的完整性和安全性。
四,小型天气预报应用
这个项目将涉及自定义数据结构、文件输入输出以及一些基本的字符串操作。在这个项目中,我们将创建一个 WeatherReport 类来处理和存储关于特定城市的天气数据,并从文件中读取数据,然后生成报告。
项目概述
-
类
WeatherData:- 属性:
cityName(城市名称)temperature(温度)humidity(湿度)
- 方法:
- 构造函数
- 显示天气信息 (
display)
- 属性:
-
类
WeatherReport:- 属性:
weatherData(存储多个WeatherData对象的容器)
- 方法:
- 从文件加载天气数据 (
loadDataFromFile) - 显示所有天气报告 (
displayReport)
- 从文件加载天气数据 (
- 属性:
代码实现
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>class WeatherData {
private:std::string cityName;double temperature;double humidity;public:WeatherData(std::string cityName, double temperature, double humidity): cityName(cityName), temperature(temperature), humidity(humidity) {}void display() const {std::cout << "City: " << cityName<< "Temperature: " << temperature<< "`C, Humidity: " << humidity << "%\n";}
};class WeatherReport {
private:std::vector<WeatherData> weatherData;public:bool loadDataFromFile(const std::string& filename) {std::ifstream file(filename);if (!file.is_open()) return false;std::string line, city;double temp, hum;while (getline(file, line)) {std::istringstream iss(line);if (!(iss >> city >> temp >> hum)) break;weatherData.emplace_back(city, temp, hum);}file.close();return true;}void displayReport() const {for (const auto& data : weatherData) {data.display();}}};int main() {WeatherReport report;if (report.loadDataFromFile("weather_data.txt")) {report.displayReport();} else {std::cout << "Failed to load data. \n";}return 0;
}
文件 weather_data.txt
创建一个文本文件 weather_data.txt,格式如下:
London 15.5 60
NewYork 22.3 55
Paris 18.9 65
项目解析
WeatherData类 存储单个城市的天气信息,包括城市名称、温度和湿度,并提供一个方法来显示这些信息。WeatherReport类 用于从文件中读取多个城市的天气数据,并存储在一个WeatherData对象的向量中。它还提供了一个方法来显示所有加载的天气数据。- 在
main函数中,我们创建了一个WeatherReport对象,尝试从文件中加载数据,如果成功,就显示天气报告。
这个项目展示了文件输入输出的处理,字符串流的使用(std::istringstream),以及如何使用STL容器来存储和管理数据。这些是在C++编程中经常会用到的重要概念和技术。通过实现这样的项目,你可以更好地理解如何在C++中处理更复杂的数据流和数据结构。
部分代码片段分析
public:bool loadDataFromFile(const std::string& filename) {std::ifstream file(filename);if (!file.is_open()) return false;std::string line, city;double temp, hum;while (getline(file, line)) {std::istringstream iss(line);if (!(iss >> city >> temp >> hum)) break;weatherData.emplace_back(city, temp, hum);}file.close();return true;}void displayReport() const {for (const auto& data : weatherData) {data.display();}}
};
-
bool loadDataFromFile(const std::string& filename)定义了一个名为loadDataFromFile的成员函数,它接受一个字符串引用作为参数,这个字符串代表要加载数据的文件名。该函数返回一个布尔值,表示数据加载是否成功。 -
std::ifstream file(filename);使用给定的文件名创建了一个输入文件流file。这个流用于读取文件内容。‘std::ifstream 类‘:这是 C++ 标准库中的一个类,专门用于处理文件输入。它是 istream 类的子类,专门用于从文件读取数据。ifstream 代表 "input file stream",即输入文件流。 -
if (!file.is_open()) return false;检查文件是否成功打开。如果没有,函数返回false。 -
std::string line, city; double temp, hum;定义了一些变量来存储从文件中读取的数据。line用于存储文件中的每一行,city用于存储城市名称,temp和hum分别用于存储温度和湿度。 -
while (getline(file, line)) { ... }是一个循环,它一行一行地读取文件。每次循环,它读取文件的下一行到line变量中。 -
std::istringstream iss(line);创建了一个字符串输入流,它从line变量中读取数据。std::istringstream 类: std::istringstream 属于 C++ 标准库中的 <sstream> 头文件。它提供了基于字符串的输入流功能。简单来说,std::istringstream 允许你像处理输入文件流(如 std::ifstream)那样处理一个 std::string 对象。通过 std::istringstream iss 语句,你创建了一个名为 iss 的 std::istringstream 类型的对象。这个对象用于读取和解析字符串中的数据。一旦 iss 被初始化,它就可以像任何其他输入流一样使用,允许你从中读取和解析数据。例如,你可以使用 >> 运算符从 iss 中提取基本数据类型的值,或者使用 getline 函数从中读取字符串。 -
if (!(iss >> city >> temp >> hum)) break;使用字符串流从line中提取城市名、温度和湿度。如果提取失败,循环将中断。 -
weatherData.emplace_back(city, temp, hum);将读取的数据作为新WeatherData对象添加到weatherData向量中。emplace_back是vector的一个方法,用于在容器末尾添加新元素。 -
file.close();在读取完所有数据后关闭文件。 -
return true;数据加载成功后返回true。
好了,今天的小项目就到此为止辣,欢迎继续关注小白的C++成长之旅。之前我有试过学习C++,在外网的一个学习网站,但是每次都是重新开始,不是从新开始,昨晚和学长聊天,他建议我一段时间内注重一个知识的学习,所以接下来我可能都会发布关于C++的项目,希望大家也能给我一点关于学习的经验💌💌谢谢了
相关文章:
C++学习之旅(二)运行四个小项目 (Ubuntu使用Vscode)
如果是c语言学的比较好的同学 可以直接跟着代码敲一遍,代码附有详细语法介绍,不可错过 一,猜数字游戏 #include <iostream> #include <cstdlib> #include <ctime>int main() {srand(static_cast<unsigned int>(tim…...
数据分析与挖掘
数据起源: 规模庞大,结构复杂,难以通过现有商业工具和技术在可容忍的时间内获取、管理和处理的数据集。具有5V特性:数量(Volume):数据量大、多样性(Variety):…...
Maxwell监听mysql的binlog日志变化写入kafka消费者
一. 环境: maxwell:v1.29.2 (从1.30开始maxwell停止了对java8的使用,改为为11) maxwell1.29.2这个版本对mysql8.0以后的缺少utf8mb3字符的解码问题,需要对原码中加上一个部分内容 :具体也给大家做了总结 : 关于v1.…...
Kafka系列之:Kafka Connect REST API
Kafka系列之:Kafka Connect REST API 由于 Kafka Connect 旨在作为服务运行,因此它还提供了用于管理连接器的 REST API。此 REST API 可在独立模式和分布式模式下使用。可以使用侦听器配置选项来配置 REST API 服务器。该字段应包含以下格式的侦听器列表: protocol://host:p…...
DC-4靶机
一.环境搭建 1.下载地址 靶场下载地址:https://download.vulnhub.com/dc/DC-4.zip 下载不下来用迅雷下载 2.虚拟机配置 切换为nat模式 开启靶机,遇到所有的错误直接点重试或者是,开启后呈现为下图即可 二.开始渗透 1.信息收集 老规矩,…...
ideaSSM 高校公寓交流员管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目
一、源码特点 idea 开发 SSM 高校公寓交流管理系统是一套完善的信息管理系统,结合SSM框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码和数据库&…...
Android studio添加阿里云仓库
在工程的settings.gradle中添加 repositories { google() jcenter() mavenCentral() maven { url https://jitpack.io } //阿里云镜像 maven { url https://maven.aliyun.com/repository/google } maven { url https:…...
每天一个数据分析题(二百二十)
在集成学习的GBDT算法中,每次训练新的决策树的目的是( )? A. 预测原始数据的标签 B. 预测上一个模型的残差 C. 降低模型的偏差 D. 降低模型的方差 题目来源于CDA模拟题库 点击此处获取答案...
Centos上安装Harbor并使用
harbor的安装与使用 Harbor介绍安装前的准备工作为Harbor自签发证书安装Harbor安装docker开启包转发功能和修改内核参数安装harbor扩展 Harbor 图像化界面使用说明测试使用harbor私有镜像仓库从harbor仓库下载镜像 Harbor介绍 容器应用的开发和运行离不开可靠的 镜像管理&…...
工作需求,Vue实现登录
加油,新时代打工人! vue 2.x Element UI <template><div class"body" :style"{background-image: url(${require(/assets/images/login.png)})}"><el-form :rules"rules" ref"loginForm" :mode…...
【生产力】Mac 窗口布局工具 Magnet
Magnet 是一款为Mac操作系统设计的实用工具,旨在帮助用户更加方便地管理和组织他们的窗口布局。通过使用Magnet,用户可以轻松地将应用程序窗口拖放到屏幕的各个部分,从而实现窗口的自动排列和大小调整。这款工具特别适合需要同时处理多个应用…...
Linux的相关指令总结
Linux的基本命令 Linux指令是Linux操作系统的核心组成部分,它们为用户和管理员提供了与系统进行交互和管理的强大工具。这些指令涵盖了从基本的文件操作到复杂的系统配置和管理的各个方面。 ls指令 功能:用于列出指定目录中的文件和子目录名称。语法&am…...
HTTPS 加密原理
HTTPS 加密原理 HTTPS 加密原理常见的加密方法单向加密对称加密非对称加密 为什么需要加密?加密流程演变对称加密非对称加密非对称加密对称加密 存在问题解决方式数字证书生成方式 整体流程 HTTPS 加密原理 常见的加密方法 单向加密 也称为不可逆加密,…...
【数据挖掘】实验4:数据探索
实验4:数据探索 一:实验目的与要求 1:熟悉和掌握数据探索,学习数据质量分类、数据特征分析和R语言的主要数据探索函数。 二:实验内容 1:数据质量分析 2:统计量分析 3:贡献度分析…...
PTA后缀式求值(整型版)
作者 周强 单位 青岛大学 我们人类习惯于书写“中缀式”,如 3 5 * 2 ,其值为13。 (p.s. 为什么人类习惯中缀式呢?是因为中缀式比后缀式好用么?) 而计算机更加习惯“后缀式”(也叫“逆波兰式”ÿ…...
FPGA与以太网相关接口知识
一:一般硬件架构;(对于1000m网一般都使用普通io口,普通管脚能跑800M(正点技术说的))) 1:FPGA普通管脚——phy芯片(pcspma)——rg45 2:FPGA(GT)光口(利用fpga的GT,直接节约了phy芯片…...
使用git+ssh访问github,避免下载资源失败
一、创建github账户之后,记住注册邮箱和账户名 我的邮箱:yuanyan23mails.ucas.ac.cn 账户名:thekingofjumpshoot 下边的相关位置需要用自己的邮箱和用户名替代 二、输入本地生成秘钥和公钥命令,并且生成公私钥对 ssh-keygen …...
cookie、session和token的区别
引言 在当今的互联网时代,Web 应用程序的安全性和用户体验至关重要。身份验证和状态管理是构建安全、可靠的 Web 应用的核心部分。cookie、session、token都是常用的身份验证和状态管理机制。 Cookie 什么是 Cookie? Cookie 是存储在用户浏览器中的小…...
如何解决Layui后台接口返回数据,但是table.render不渲染表格数据的问题
我这边进行了pareData数据格式转换,response重新定义了layui的参数格式规范 接口正常返回了数据 但是就是不渲染,我这个郁闷啊!! 忽然,我把后台重新定义的layui规定的格式参数,有个参数名叫data࿰…...
matlab 将矩阵写入文件
目录 一、概述1、算法概述2、主要函数二、将矩阵写入到文本文件三、将矩阵写入电子表格文件四、将矩阵写入指定的工作表和范围五、将数据追加到电子表格六、将矩阵数据追加到文本文件七、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...
