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

停车场管理系统文件录入(C++版)

❤️作者主页:微凉秋意
✅作者简介:后端领域优质创作者🏆,CSDN内容合伙人🏆,阿里云专家博主🏆

文章目录

  • 一、案例需求描述
    • 1.1、汽车信息模块
    • 1.2、普通用户模块
    • 1.3、管理员用户模块
  • 二、案例分析
  • 三、案例代码实现
    • 3.1、汽车信息类及方法实现
    • 3.2、普通用户类及方法实现
    • 3.3、管理员用户类及方法实现
    • 3.4、主函数调用情况
  • 四、运行界面截图


之前写的停车场管理系统或者是通讯录管理系统都没有使用文件录入、保存数据,今天带来一个文件录入信息的C++版停车场管理系统。代码部分都会有详细注释,稍加思考都能够理解该程序的逻辑。

一、案例需求描述

  停车场管理系统就是模拟停车场进行车辆管理的系统,该系统分为汽车信息模块,用户使用模块和管理员用户模块,各模块功能如下所示:

1.1、汽车信息模块

  1. 添加汽车信息:添加汽车属性。
  2. 删除汽车信息:输入停车场中存在的车牌号,删除汽车信息。
  3. 查找汽车信息:输入停车场存在的车牌号,显示汽车详细信息。
  4. 修改汽车信息:输入停车场内存在的车牌号,修改汽车属性信息。
  5. 停车时长统计:显示汽车在停车场中停留的时间和车辆总数。
  6. 停车场信息显示:显示停车场所有汽车的属性信息。
  7. 汽车信息保存:将汽车信息保存到本地文件中。

1.2、普通用户模块

  可以查询、显示所有汽车信息及停车费信息,另外还包含停车时长统计与退出普通用户登录功能。由于是多次操作,因此需要有循环判断功能,这种情况多使用while嵌套switch case语句实现。

1.3、管理员用户模块

  此模块具有普通用户模块的所有功能,此外还应有增、删、改的功能。

二、案例分析

  通过案例描述我们得到了非常清晰的模块信息,因此在设计类时应该包含普通用户类、管理员用户类、汽车信息类。

大致思路:

  1. 在汽车信息类中实现基本功能并封装起来,以便后续调用。
  2. 在普通用户类中定义菜单功能,通过键入不同数字实现不同功能。
  3. 在管理员用户类中定义菜单功能,通过键入不同数字实现不同功能。

三、案例代码实现

  这里我采用分文件编写的方式,建立user.hadmin.hcar.h及对应的三个.cpp文件和main.cpp文件,在main里面循环调用useradmin的方法就能实现停车场管理系统。

3.1、汽车信息类及方法实现

car.h

#pragma once // 防止头文件被重复调用
#include<string>
#include<ctime>
using namespace std;class Car {
private:string carNum; // 汽车编号string carType; // 汽车型号string color; // 汽车颜色time_t inTime; // 汽车停车时间点
public:void addCar();  // 下面四行对应增删改查void delCar();void modCar();void findCar();void timeAmount(); // 计算停车时长并统计汽车总数void showInfor(); // 显示车辆信息(读文件)void saveInfor(); // 保存车辆信息(写文件)		
};

car.cpp

#include"car.h"
#include<fstream> // 读写操作
#include<iostream>
#include<iomanip> // IO流控制头文件,类似C里的格式化输出
using namespace std;void Car::addCar() {time_t _time; // 定义时间变量,秒数,调用time()获取while (1) {AA:		cout << "请输入车牌号:";cin >> carNum;// 判断文件中是否已存在相同车牌号ifstream ifs("carData.txt", ios::in); // 读文件if (ifs) {char buf[1024];string strs[20];int index = 0; // 标识数组索引while (!ifs.eof()) { // 读取文件直到末尾ifs.getline(buf, 100); // 每次读取一行数据,放入buf数组 注:第二个参数为字符数,缓冲区尽量大,否则循环会异常结束strs[index++] = buf[0]; // buf[0]为车牌号,存入strs数组,索引自增}// 遍历strs数组,auto 自动推导数据类型,这里等价于 stringfor (auto& num : strs) {// 判断输入车牌号是否与文件里重复if (num == carNum) {cout << "车牌号重复!" << endl;goto AA; // 重复后重新输入车牌号}}}// 车牌号不重复继续加下来的输入cout << "请输入车的种类:";cin >> carType;cout << "请出入车的颜色:";cin >> color;inTime = time(&_time); // 记录停车时间// 保存新增车辆信息saveInfor();char ch; cout << "\t是否继续?(y/n)"; // 判断是否继续输入,\t 制表符,通常八个空格cin >> ch;if (ch == 'n' || ch == 'N') {break;}}
}
void Car::delCar() {// 读文件ifstream carData("carData.txt", ios::in); // 创建文件写入流,缓冲文件ofstream outData("tempCarData.txt", ios::out);if (!outData || !carData) {cout << "文件打开失败!" << endl;return;}string carId, name, str;bool flag = true;cout << "请输入要删除的车牌号:";cin >> carId;// 读取文件第一个字段(车牌号) >> 遇空格结束读取while (carData >> name) {getline(carData,str); // 将该行数据读取到 str// 如果相同,输出要删除的车辆信息:颜色,型号,停车时间if (name == carId) {cout << "要删除的车辆信息:" << endl << str << endl;flag = false;break;}// 如果不相同,将车辆信息写入到temp,否则舍弃该行outData << name << " " << str << endl;}if (flag) cout << "该车牌号不存在" << endl;else {while (getline(carData, str)) { // 继续按行读取,此时第一行outData << str << endl; // 写入到temp}carData.close();outData.close();// 读取 temp,写入 carDataifstream in("tempCarData.txt", ios::in);ofstream out("carData.txt", ios::out);if (!in || !out) {cout << "文件读取失败!" << endl;return;}else {while (getline(in, str)) { // 按行读取,写入out << str << endl;}}in.close();out.close();}
}
void Car::modCar() {string chepai1, chepai2, str;time_t  time1;int i = 1;cout << "请输入你要修改的车辆的车牌号" << endl;cin >> chepai1;ifstream indata("carData.txt", ios::in);ofstream outdata("tempCarData.txt", ios::out);if (!indata || !outdata){cerr << "文件打开错误" << endl;exit(1);}while (indata >> chepai2){indata >> carType >> color >> inTime; // 读取该行剩余元素if (chepai1 == chepai2){i = 0;cout << "已找到所要修改的车辆" << endl;cout << "修改后的车牌号" << endl;cin >> carNum;cout << "修改后的车辆型号" << endl;cin >> carType;cout << "修改后的车辆颜色" << endl;cin >> color;inTime = time(&time1);// 写入carData.txtoutdata << carNum << " " << carType << "  " << color << "  " << inTime << endl;break;}// 车牌号不同,将车辆信息存到tempoutdata << chepai2 << " " << carType << "  " << color << "  " << inTime << endl;}if (i) { cout << "停车场中没有找到要修改的车辆" << endl; }outdata.close();indata.close();ifstream in("tempCarData.txt", ios::in);ofstream out("carData.txt", ios::out);if (!in || !out){cout << "文件打开错误" << endl;exit(1);}while (getline(in, str)){out << str << endl;}in.close();out.close();
}
void Car::findCar() {ifstream carData("carData.txt", ios::in);if (!carData){cout << "文件打开失败" << endl;return;}else {string carId;time_t _time, t1;bool flag = true;cout << "请输入要查找的车牌号" << endl;cin >> carId;while (carData >> carNum) // 读取车牌号{carData >> carType >> color >> inTime;t1 = time(&_time); // 获取系统当前时间if (carId == carNum){flag = false;break;}}if (flag) {cout << "未找到该车辆信息!" << endl;}else {cout << "车牌号" << carNum <<" "<<"车的型号:" << carType <<" " <<" 车的颜色:" << color << " "<<"停车时长:" << (t1 - inTime) << "秒" <<" "<< "停车费 " << (t1 - inTime) * 0.05 << "元" << endl;}carData.close();}
}
void Car::timeAmount() {time_t it, time1;int c1 = 0, c2 = 0;ifstream indata("carData.txt", ios::in);if (!indata){cerr << "文件打开失败" << endl;exit(1);}while (indata >> carNum){indata >> carType >> color >> inTime;it = time(&time1);if ((it - inTime) / (60 * 60 * 24) >= 24){c1++;}else c2++;}cout << "车辆总数是:" << c1 + c2 << endl;cout << "其中停放超过24小时的有" << c1 << "辆" << endl;cout << "其中停放不超过24小时的有" << c2 << "辆" << endl;indata.close();
}
void Car::showInfor() {int i = 1;string chepai;time_t it, time1;ifstream indata("carData.txt", ios::in);if (!indata){cerr << "文件打开错误" << endl;exit(1);}cout << "停车场中所有汽车信息如下所示:" << endl;cout << "-----------------------------" << endl;while (indata >> chepai){indata >> carType >> color >> inTime;it = time(&time1);cout << "第" << i << "辆车信息如下" << endl;cout << "车牌号" << chepai << "  车的型号:" << carType << "  车的颜色:" << color << "  停车时间" << (it - inTime) << "秒" << "  停车费 " << (it - inTime) * 0.05 << "元" << endl;i++;}indata.close();
}
void Car::saveInfor() {ofstream outData("carData.txt", ios::app); // app 追加方式写文件,即在文件末尾添加if (!outData) {cout << "文件打开失败!" << endl;return;}else {// 将新增车辆信息写入carDataoutData << carNum << " " << carType << " " << color << " " << inTime << endl;}outData.close();
}

3.2、普通用户类及方法实现

user.h

#pragma once
#include<string>
using namespace std;// 普通用户类,只能查看、统计、显示车辆,无法实现增删改
class User {
public:void checkCar(); // 普通用户登录菜单
};

user.cpp

#include<iostream>
#include<Windows.h>
#include"user.h"
#include"car.h"
using namespace std;
void User::checkCar() {Car car;while (1) {system("cls"); // 清空屏幕cout << "1.显示车辆状况" << endl;cout << "2.查询车辆信息" << endl;cout << "3.统计车辆" << endl;cout << "4.退出普通用户" << endl;int c;cout << "输入要执行的操作:";cin >> c;switch (c) {case 1: car.showInfor(); break;case 2: car.findCar(); break;case 3: car.timeAmount(); break;case 4: return;default: cout << "请输入正确的操作" << endl;}system("pause");}
}

3.3、管理员用户类及方法实现

admin.h

#pragma once // 避免同一个头文件被包含多次
#include<string>
#include"user.h"
using namespace std;// 管理员类,公有继承普通用户类,可以添加,修改,删除class Admin:public User {
public:void Manager(); // 显示管理员登录的菜单
};

admin.cpp

#include"admin.h"
#include"car.h"
#include<iostream>
#include<fstream>
#include<string>
using namespace std;void Admin::Manager() {Car car;while (1) {system("cls"); // 清空屏幕cout << "1.增加车辆" << endl;cout << "2.显示所有车辆信息" << endl;cout << "3.查询" << endl;cout << "4.修改" << endl;cout << "5.删除" << endl;cout << "6.统计" << endl;cout << "7.退出管理用户" << endl;int choice;cout << "请输入要执行的操作:";cin >> choice;switch (choice) {case 1: car.addCar(); break;case 2: car.showInfor(); break;case 3: car.findCar(); break;case 4: car.modCar(); break;case 5: car.delCar(); break;case 6: car.timeAmount(); break;case 7: return;default: cout << "输入错误!" << endl; }system("pause");}
}

3.4、主函数调用情况

#include"user.h"
#include"admin.h"
#include<iostream>
using namespace std;
int main() {User user; // 普通用户对象Admin admin; // 管理员对象int choice;while (1) {system("cls");cout << "1.普通用户登录" << endl;cout << "2.管理员登录" << endl;cout << "3.退出系统" << endl;cout << "请输入要执行的操作:" << endl;cin >> choice;switch (choice) {case 1: user.checkCar(); break;case 2: admin.Manager(); break;case 3: exit(0); // 退出系统default: cout << "请输入正确的操作" << endl;}system("pause");}return 0;
}

四、运行界面截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述剩下的就不展示了。。。


  这个停车场管理系统最需要掌握的便是程序设计的思想以及文件操作,像分文件编写或是文件操作我也写过文章总结,就在《C++面向对象部分》专栏里,感兴趣的朋友可以订阅学习。

相关文章:

停车场管理系统文件录入(C++版)

❤️作者主页&#xff1a;微凉秋意 ✅作者简介&#xff1a;后端领域优质创作者&#x1f3c6;&#xff0c;CSDN内容合伙人&#x1f3c6;&#xff0c;阿里云专家博主&#x1f3c6; 文章目录一、案例需求描述1.1、汽车信息模块1.2、普通用户模块1.3、管理员用户模块二、案例分析三…...

线程(Thread)的三种等待唤醒机制详解

1、为什么需要线程的等待和唤醒 线程的等待唤醒机制是一种经典的“生产者和消费者”模型。例如食品加工厂&#xff0c;食品加工人员和原料补给人员&#xff0c;在有充足原料时&#xff0c;补给人员是在等待&#xff0c;等到原料不够时&#xff0c;食品加工人员通知补给人员&am…...

从零学习python - 13模块的导入与使用(实现单例模式)

模块基础知识 # 项目 > 包 > 模块 > 变量\方法\类 # 在python中,模块是代码组织的一种方式,把功能相近的函数或类放到一个文件中,一个文件(.py)就是一个模块,模块名就是文件名去掉py后缀. # 好处:提高代码可复用性和可维护性,一个模块编写完成后,很方便在其他项目中导…...

国产SSD、内存卷哭国外大厂,三星宣布减产涨价在路上了

PC 圈有一句话是这么说的&#xff1a;论价格屠夫还得看国产品牌&#xff01; 可不是嘛&#xff0c;国产长鑫、长江算是彻底将全球存储芯片市场搅局者这一「骂名」坐实了&#xff01; 不说特别早期&#xff0c;前几年吧&#xff0c;普通单条 8G DDR4 内存都能卖到六七百元&…...

数据库管理-第六十六期 SQL Domain(20230413)

数据库管理 2023-04-13第六十六期 SQL Domain1 基本介绍2 Domain的表达式和条件3 语法4 语义5 示例总结第六十六期 SQL Domain 上一期一笔带过了部分Oracle 23c的新特性&#xff0c;这一期重点讲一下SQL Domain新特性。 【https://docs.oracle.com/en/database/oracle/oracle-…...

《Vue3实战》 第一章 nods/npm安装、配置

1、nods.js安装&#xff08;Windows&#xff09; 1.1、下载并安装node https://nodejs.org/en/ , 安装到d盘nodejs目录 1.2、配置环境变量 path配置 1.3、配置全局包存放目录和缓存目录 在根目录下创建node_global&#xff08;全局包存放目录&#xff09;和node_cache&…...

JAVA练习104-四数相加 II

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、题目-四数相加 II 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 4月10日练…...

【C++基础】引用(引用的概念;引用的特性;常引用;使用场景:做输出型参数、大对象传参、做输出型返回值、返回大对象的引用);引用和指针的区别)

六、引用 6.1 引用的概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。&#xff08;语法上&#xff09; 格式&#xff1a;类型& 引用变量名(对象名) …...

Redis只用来做缓存?来认识一下它其他强大的能力吧。

当今互联网应用中&#xff0c;随着业务的发展&#xff0c;数据量越来越大&#xff0c;查询效率越来越高&#xff0c;对于时序数据的存储、查询和分析需求也越来越强烈&#xff0c;这时候 Redis 就成为了首选的方案之一。 Redis 提供了多种数据结构&#xff0c;如字符串、哈希表…...

【ES】数据同步集群

【ES】数据同步&集群3.数据同步3.1.思路分析3.1.1.同步调用3.1.2.异步通知3.1.3.监听binlog3.1.4.选择3.2.实现数据同步3.2.1.思路3.2.2.导入demo3.2.3.声明交换机、队列1&#xff09;引入依赖2&#xff09;声明队列交换机名称3&#xff09;声明队列交换机3.2.4.发送MQ消息…...

37岁男子不愿熬夜,回乡养鸡每天准时下班,青山绿水中养鸡,直播间里卖鸡蛋...

37岁男子不愿熬夜&#xff0c;回乡养鸡每天准时下班&#xff0c;青山绿水中养鸡&#xff0c;直播间里卖鸡蛋。今天和大家分享一个创业案例&#xff0c;他叫胡铭浩&#xff0c;来自安徽省旌德县&#xff0c;今年37岁&#xff0c;曾做过车床操作工&#xff0c;开过婚纱摄影店&…...

深度学习和人工智能之间是什么样的关系?

深度学习与人工智能概念的潜在联系&#xff0c;我们依然借助维恩图来说明&#xff0c;如图4.1所示。 1、人工智能 “人工智能”这个概念新鲜时髦但又含混模糊&#xff0c;同时包罗万象。尽管如此,我们仍尝试对 人工智能进行定义:用一台机器处理来自其周围环境的信息,然后将这些…...

实战打靶集锦-016-lampiao

提示&#xff1a;本文记录了博主打靶过程中一次曲折的提权经历 文章1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 80端口探查4.2 1898端口探查4.3 EXP搜索4.3.1 exploit/unix/webapp/drupal_coder_exec4.3.2 exploit/unix/webapp/drupal_drupalgeddon25. 提权5.1 系统信息…...

《Web前端应用开发》考试试卷(模拟题)

一、产品搜索页面 打开“考试文件夹”中的input.html&#xff0c;完成以下步骤&#xff1a; 注意&#xff1a;本题仅能在input.html的&#xff08;1&#xff09;为产品名称所在的div添加样式属性&#xff0c;使得产品名称保持在文本框的左边&#xff1b; &#xff08;2&#xf…...

【react全家桶学习】react简介

react是什么&#xff1f; react是用于构建用户界面的JS库&#xff0c;是一个将数据渲染为HTML视图的开源JS库 谁开发的&#xff1f; 由Facebook开发&#xff0c;且开源 为什么要学&#xff1f; 原生JavaScript操作DOM繁琐、效率低 ( DOM-API操作 UI)使用JavaScript直接操作…...

此战成硕,我成功上岸西南交通大学了~~~

友友们&#xff0c;好久不见&#xff0c;很长时间没有更一个正式点的文章了&#xff01; 是因为我在去年年底忙着准备初试&#xff0c;今年年初在准备复试&#xff0c;直到3月底拟录取后&#xff0c;终于可以写下这篇上岸贴&#xff0c;和大家分享一下考研至上岸的一个过程 文章…...

光耦继电器工作原理及优点概述

光耦继电器是一种电子元器件&#xff0c;也是固态继电器的一种&#xff0c;其主要作用是隔离输入与输出电路&#xff0c;用于保护或者控制电路的正常工作。 光耦继电器工作原理是利用光电转换器将外界信号转化为光信号&#xff0c;通过光纤传输到另一端&#xff0c;再由另一端的…...

【Mysql】mysql8.0.26解压包部署方式

版本背景&#xff1a; 操作系统&#xff1a;centos7.3 mysql版本&#xff1a;mysql-8.0.26-linux-glibc2.12-x86_64.tar 一、前期准备 1、检测操作系统自带安装的mysql和mariadb服务&#xff0c;如存在&#xff0c;需卸载 rpm -qa | grep mysql rpm -qa | grep mariadb 卸载…...

进销存管理系统能为企业带来哪些实际效益?

随着互联网的不断发展&#xff0c;如今的商业世界已经越来越向数字化转型。拥有一套完整的数字化的进销存管理能够极大地提升公司货物进出库存情况的效率和准确性&#xff0c;避免过程中出现不必要的错误和漏洞&#xff0c;从而帮助企业更加稳健地自我发展。那么&#xff0c;一…...

图片怎么转换成pdf格式?这几个方法帮你一键转换

现今电子书籍越来越受到欢迎&#xff0c;其中PDF格式也成为了一种常用的电子书籍格式。无论是工作还是学习&#xff0c;我们都可能会遇到需要将图片转换成PDF格式的情况&#xff0c;例如保存一些资料证明、公文公告、学习资料等。在这篇文章中&#xff0c;我们将为大家介绍三种…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...