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

[C++]:IO流

1. IO 流

1.1 流的概念

在C++中,存在一种被称为“流”的概念,它描述的是信息流动的过程,具体来说就是信息从外部输入设备(比如常见的键盘)传输到计算机内部(像内存区域),以及信息从内存向外部输出设备(例如显示器)传输的过程,因其类似水流一样的连续性,所以被形象地比喻成“流”。

C++的“流”具备两个重要特性:

  • 有序连续:意味着信息在流动过程中是按照一定顺序依次进行传输的,就好像水流沿着固定的河道依次流淌那样,不会出现无序混乱的情况。
  • 具有方向性:流的传输是有明确方向的,要么是从外部输入设备到内存的输入方向,要么是从内存到外部输出设备的输出方向,不能随意反向或者混淆。

为了能够实现这种信息的流动过程,C++专门定义了I/O标准类库。在这个类库当中包含了多个类,每一个这样的类都被称作“流”或者“流类”,它们各自承担着完成某一方面相关功能的任务,共同协作来保障信息在计算机内外设备之间顺利地实现输入和输出操作。

1.1 C++ IO 流

C++ 系统实现了一个庞大的类库,其中 ios 为基类,其他类都是直接或间接派生自 ios 类。

1.2 iostream

其中 iostream它主要用于标准输入输出操作。其中,std::cin 用于从标准输入设备(通常是键盘)读取数据。std::cout 用于向标准输出设备(一般是显示器)输出数据,就能在屏幕上显示指定的字符串。

比如说下面一个简单的示例,首先用 cout打印提示信息,然后用 cin读入,最后再用 cout打印来验证你输入是否正确。

#include <iostream>
using namespace std;int main() {int num;cout << "请输入一个整数: ";cin >> num;  // 从键盘读取用户输入的整数cout << "你输入的整数是: " << num << endl;return 0;
}

我们同样可以使用 cerr来打印错误信息,比如下面这段代码:

当用户输入的除数为 0 时,程序使用 cerr 输出错误信息,告知用户除数不能为 0,需要重新输入。因为 cerr 是无缓冲的,所以这个错误提示会马上显示在屏幕上,方便用户及时察觉错误情况并进行相应处理。

#include <iostream>
using namespace std;int main() {int dividend, divisor;cout << "请输入被除数: ";cin >> dividend;cout << "请输入除数: ";cin >> divisor;if (divisor == 0) {cerr << "错误: 除数不能为 0,请重新输入!" << endl;  // 使用 cerr 输出错误提示,无缓冲,会立即显示return 1;  // 结束程序,返回错误码}int result = dividend / divisor;cout << "除法运算的结果是: " << result << endl;return 0;
}

并且我们有时候也可以使用 clog打印日志信息:

#include <iostream>
#include <ctime>  // 引入时间相关头文件,用于获取当前时间
using namespace std;int main() {time_t now = time(0);  // 获取当前时间的时间戳char* dt = ctime(&now);  // 将时间戳转换为字符串形式的日期时间clog << "程序开始运行,当前时间是: " << dt;  // 使用 clog 记录程序开始运行的日志信息,有缓冲int num;cout << "请输入一个整数: ";cin >> num;cout << "你输入的整数是: " << num << endl;clog << "用户输入了整数 " << num << endl;  // 继续使用 clog 记录用户输入的相关日志信息return 0;
}

在这里:

  • 首先通过 clog 输出程序开始运行时的日志信息,记录下当前的时间,由于 clog 是有缓冲的,它会先将这些日志信息暂存起来(通常在缓冲区满了或者程序正常结束等情况下才会输出到屏幕对应的标准错误输出处)。
  • 之后在用户输入整数后,又使用 clog 记录用户输入的具体数值相关的日志内容,展示了如何利用 clog 在程序运行过程中对一些关键信息进行日志记录,便于后续查看程序执行情况等分析工作。

我们使用 cincout 可以直接输入和输出 内置类型数据,原因就是标准库已经将所有内置类型的输入和输出全部重载了。

如果我们想使用 cincout输入输出自定义类型,就需要进行流插入与流提取重载。比如下面我们实现一个日期类的流提取与流插入。

inline ostream& operator<<(ostream& out, const Date& d)//流插入
{out << d._year << "/" << d._month << "/" << d._day <<endl;return out;
}inline istream& operator>>(istream& in, Date& d)//流提取
{in >> d._year >> d._month >> d._day;return in;
}

并且我们一般在刷 OJ 练习题时,可能会使用一些这样的做法:

// 单个元素循环输入
while(cin>>a)
{// ...
}
// 多个元素循环输入
while(cin>>a>>b>>c)
{// ...
}
// 整行接收
while(cin>>str)
{// ...
}

但是你可能会提出这样的疑问:就是 while语句的判断条件一般是 布尔类型,而 cin 返回的 istream对象怎么能够做 while的判断条件呢?

其实就是 istream实现了 bool 类型转换运算符重载:

1.3 fstream

fstream 需要包含头文件<fstream>。其用于文件的输入输出操作。它包含了 ifstream(用于从文件中读取数据,即文件输入流)、ofstream(用于向文件中写入数据,即文件输出流)以及 fstream(既可以读又可以写文件的流对象)这几个类。

首先我们来介绍一下常见的文件操作函数:

函数名功能
getline常用于从输入流(比如std::cin或者文件输入流ifstream等)中读取一行字符串,它可以处理包含空格等空白字符的整行文本内容,参数一般是输入流对象和用于存储读取字符串的字符串变量。例如从文件中逐行读取文本内容进行后续处理时经常会用到它。
put向输出流写入单个字符,例如可以用于向文件输出流(ofstream)或者标准输出流(cout)写入特定的字符。
write用于将一段指定长度的字符数组(或可看作字节序列)写入到输出流中,常用于文件输出操作,可按照设定的字节数将内存中的数据准确地写入到文件等输出目标中。
read从输入流中读取指定长度的字节数据到字符数组(或其他合适的内存区域)中,常用于文件输入操作,比如从文件里读取一定字节数的数据进行后续解析等处理。
open用于打开文件,是文件流类(ifstreamofstreamfstream)的成员函数,通过传入文件名等参数,按照指定的模式(如只读、只写、读写等)打开文件,为后续的文件输入输出操作做准备。
close对应文件流的 open 操作,用于关闭已经打开的文件,释放相关的系统资源,保证文件操作的正常结束和资源合理利用。
is_open文件流类的成员函数,用于判断文件是否已经成功打开,返回 bool 类型的值,在进行文件输入输出操作前,通常先通过这个函数检查文件打开情况,避免后续对未成功打开的文件进行无效操作。
seekg主要用于文件输入流(ifstream)或者可读写的文件流(fstream 在读取模式下),可以设置文件读取指针的位置,实现从文件的指定位置开始读取数据,比如可以跳到文件中间某个位置读取后续内容。
seekp针对文件输出流(ofstream)或者可读写的文件流(fstream 在写入模式下),用于设置文件写入指针的位置,决定后续向文件中写入数据的起始位置,例如可以覆盖文件中某个特定位置的原有内容等。
tellg用于获取文件输入流(ifstream)或者可读写的文件流(fstream 在读取模式下)当前读取指针的位置,返回值通常是一个表示位置的偏移量,便于记录或者后续根据该位置进行相关操作。
tellp对应文件输出流(ofstream)或者可读写的文件流(fstream 在写入模式下),可获取当前写入指针的位置,同样返回表示位置偏移量的值,方便对文件写入操作进行定位和管理。
1.3.1 ifstream

首先我们可以使用 ifstream对文件进行对取。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;int main() {ifstream ifile("input.txt");  // 尝试打开名为input.txt的文件if (ifile.is_open()) {  // 判断文件是否成功打开string line;while (getline(ifile, line)) {  // 逐行读取文件内容cout << line << endl;  // 将读取到的每行内容输出到屏幕显示}ifile.close();  // 读取完成后关闭文件} else {cerr << "无法打开文件 input.txt" << endl;}return 0;
}

上述代码尝试打开 input.txt 文件,若成功打开,则逐行读取文件内容并输出到屏幕,最后关闭文件;若打开失败,会输出错误提示信息。

1.3.2 ofstream

然后我们也可以使用 ofstream对文件进行写入:

#include <iostream>
#include <fstream>
using namespace std;int main() {ofstream ofile("output.txt");  // 创建并打开名为output.txt的文件if (ofile.is_open()) {ofile << "这是写入文件的一些内容" << endl;  // 向文件写入内容ofile.close();  // 写完后关闭文件} else {cerr << "无法打开文件 output.txt" << endl;}return 0;
}

此示例创建 output.txt 文件(若不存在)并向其写入一行文字,操作结束后关闭文件;若文件打开失败会输出相应错误提示。

1.3.3 fstream

fstream 它兼具输入和输出的功能,既可以读取文件里的数据,也能往文件里写入数据,灵活性更高。一般会与常见的文件打开方式标志结合使用:

打开方式标志含义
ios::in以输入(读取)模式打开文件。用于 ifstream 时,表示从已存在的文件中读取数据;用于 fstream 时,使文件可用于读取操作。如果文件不存在,使用 ifstream 打开会失败。
ios::out以输出(写入)模式打开文件。对于 ofstream ,会创建新文件(若文件不存在)或者截断(覆盖)已有文件内容来写入数据;用于 fstream 时,使文件可用于写入操作。
ios::app以追加模式打开文件,即写入的数据总是添加在文件末尾,不会覆盖原有文件内容。常用于 ofstream 或者 fstream 在写入相关操作时,确保每次新写入的内容接续在已有内容之后。
ios::ate打开文件后立即将文件指针定位到文件末尾(“ate”表示“at the end”),可以用于后续的读写操作。常用于 fstream 这样既能读又能写的流,后续可以从文件末尾往前读取内容或者继续往文件末尾添加内容等。
ios::binary以二进制模式打开文件,用于处理二进制数据文件,区别于默认的文本模式。在进行文件读写操作时,不会对数据进行文本格式相关的转换(比如换行符的转换等),适用于读写非文本格式的文件,像图片、音频等文件或者自定义二进制格式的数据文件,可与其他打开方式标志组合使用,如 `ios::in

这些打开方式标志可以通过逻辑或(|)运算符进行组合使用,以满足不同的文件操作需求。例如,ios::in | ios::out | ios::binary 表示以二进制模式打开文件,并且这个文件既可以进行读取操作也可以进行写入操作。

比如下面代码,我们先读取文件内容,再向文件中写入相关数据。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;int main() {fstream iofile("test.txt", ios::in | ios::out);  // 以可读可写模式打开test.txt文件if (iofile.is_open()) {string line;// 先读取文件已有的内容并输出到屏幕while (getline(iofile, line)) {  cout << line << endl;}// 将新内容写入文件iofile << "新添加的一行内容" << endl;iofile.close();} else {cerr << "无法打开文件 test.txt" << endl;}return 0;
}

代码中以可读可写模式打开 test.txt 文件,先读取文件原有的内容并显示出来,然后往文件里写入新的内容,最后关闭文件;若打开失败则输出错误提示。

最后我们可以将相关的文件操作封装成类,再进行使用:

#include<iostream>
#include<string>
#include<fstream>// 定义结构体ServerInfo,用于存储服务器相关信息,包含IP地址(用字符数组表示)和端口号
struct ServerInfo
{char _ip[32];int _port;
};// ConfigManager类用于管理配置文件的读写操作
class ConfigManager
{
public:// 构造函数,默认配置文件名是"liren.config",可传入其他文件名来指定ConfigManager(const char* configfile = "liren.config"):_configfile(configfile){}// 将ServerInfo结构体信息以二进制形式写入配置文件void WriteBin(const ServerInfo& info){// 以二进制写模式打开指定的配置文件std::ofstream ofs(_configfile, std::ofstream::out | std::ofstream::binary);if (ofs.is_open()){// 将整个ServerInfo结构体数据写入文件,这里强制转换为const char*类型以适配write函数的参数要求ofs.write((const char*)&info, sizeof(ServerInfo));}else{// 如果文件打开失败,输出错误提示信息到标准错误输出std::cerr << "无法打开文件" << std::endl;}// 关闭文件流,释放相关资源ofs.close();}// 从配置文件中以二进制形式读取数据到ServerInfo结构体中void ReadBin(const ServerInfo& info){// 以二进制读模式打开配置文件std::ifstream ifs(_configfile, std::ifstream::in | std::ifstream::binary);if (ifs.is_open()){// 从文件中读取sizeof(ServerInfo)字节的数据到ServerInfo结构体对应的内存空间,这里强制转换为char*类型以适配read函数的参数要求ifs.read((char*)&info, sizeof(ServerInfo));}else{// 文件打开失败时输出错误提示信息std::cerr << "无法打开文件" << std::endl;}// 关闭文件流ifs.close();}// 将ServerInfo结构体信息以文本形式写入配置文件(每行分别写IP和端口号)void WriteText(const ServerInfo& info){// 以文本模式打开配置文件(默认会覆盖原有内容)std::ofstream ofs(_configfile);if (ofs.is_open()){// 先写入IP地址,然后换行,再写入端口号,再换行ofs << info._ip << std::endl << info._port << std::endl;}else{// 文件打开失败输出提示信息std::cerr << "无法打开文件" << std::endl;}// 关闭文件流ofs.close();}// 从配置文件中以文本形式读取数据到ServerInfo结构体中(按顺序读取IP和端口号)void ReadText(ServerInfo& info){// 以文本模式打开配置文件std::ifstream ifs(_configfile);if (ifs.is_open()){// 从文件中依次读取IP地址和端口号到ServerInfo结构体对应的成员变量中ifs >> info._ip >> info._port;}else{// 文件打开失败输出错误提示std::cerr << "无法打开文件" << std::endl;}// 关闭文件流ifs.close();}private:std::string _configfile;
};int main()
{// 创建ConfigManager类的实例,使用默认配置文件名ConfigManager cfgMgr;// 初始化一个ServerInfo结构体实例,设置IP和端口号ServerInfo winfo = { "192.0.0.1", 80 };ServerInfo rdinfo;// 二进制读写操作cfgMgr.WriteBin(winfo);cfgMgr.ReadBin(rdinfo);// 输出读取到的IP地址信息std::cout << rdinfo._ip << std::endl;// 输出读取到的端口号信息std::cout << rdinfo._port << std::endl;// 文本读写操作cfgMgr.WriteText(winfo);cfgMgr.ReadText(rdinfo);// 输出读取到的IP地址信息std::cout << rdinfo._ip << std::endl;// 输出读取到的端口号信息std::cout << rdinfo._port << std::endl;return 0;
}

1.4 sstream

在 C++ 中,sstream 是一个非常实用的输入输出流相关的头文件,它提供了对字符串进行类似流操作的功能,主要涉及 stringstreamistringstreamostringstream 这几个类,以下为你详细介绍:

要使用 sstream 相关功能,需在代码中包含 <sstream> 头文件。

1.4.1 ostringstream

ostringstream 类的功能侧重于向一个字符串中写入数据,它可以将不同类型的数据按照指定的格式转换为字符串并存储起来,方便后续对生成的字符串进行统一的使用或处理,常用于动态生成字符串内容,比如根据程序运行中的各种变量值拼凑出特定格式的字符串等场景。

以下示例展示了如何使用 ostringstream 生成一个包含特定格式信息的字符串:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;int main() {ostringstream oss;int age = 25;string name = "Alice";oss << "姓名: " << name << ", 年龄: " << age;string result = oss.str();  // 获取ostringstream对象中存储的字符串cout << result << endl;return 0;
}

在上述代码中:

  • 先创建了 ostringstream 对象 oss
  • 接着通过流插入操作符 << 将一个字符串 "姓名: "、变量 name 的值、字符串 ", 年龄: " 和变量 age 的值依次写入到 oss 中,此时 oss 内部就根据这些写入的内容拼凑出了一个符合特定格式的字符串。
  • 最后通过调用 ossstr() 方法获取存储在 oss 中的字符串,并将其赋值给变量 result 后输出显示在屏幕上。
1.4.2 istringstream

istringstream 类主要用于从字符串中提取数据,也就是将一个字符串当作输入流来解析其中的内容,按照特定的格式和数据类型规则读取相应的值,常被用于对已经存在的字符串进行信息提取和数据拆分等操作。

假设我们有一个包含多个用空格隔开的整数的字符串,想要把这些整数提取出来分别处理,示例代码如下:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;int main() {string inputStr = "1 2 3 4 5";istringstream iss(inputStr);int num;while (iss >> num) {  // 从istringstream对象中不断提取整数,直到读完所有整数cout << num << " ";}cout << endl;return 0;
}

在这个示例中:

  • 首先定义了一个包含多个整数(用空格隔开)的字符串 inputStr
  • 然后创建了 istringstream 对象 iss,并将 inputStr 作为参数传入,这样 iss 就可以把这个字符串当作输入流来处理了。
  • 通过 while 循环和流提取操作符 >>,不断从 iss 中读取整数并输出显示,直到读完字符串中所有的整数。
1.4.3 stringstream

首先stringstream 类兼具输入和输出的功能,它可以基于一个字符串对象创建流,然后在这个流上进行数据的读取(类似从输入流提取数据)和写入(类似向输出流插入数据)操作,使得字符串能够像普通的输入输出流(如 iostream 中的标准输入输出流、fstream 中的文件输入输出流)一样被灵活操作。

以下是创建 stringstream 对象并进行简单操作的示例代码:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;int main() {stringstream ss;int num = 10;double d = 3.14;string str = "Hello, World!";// 将不同类型的数据插入到stringstream对象中,相当于写入操作ss << num << " " << d << " " << str;// 从stringstream对象中提取数据,还原出原来插入的数据类型和值int extractedNum;double extractedD;string extractedStr;ss >> extractedNum >> extractedD >> extractedStr;cout << "提取出的整数: " << extractedNum << endl;cout << "提取出的小数: " << extractedD << endl;cout << "提取出的字符串: " << extractedStr << endl;return 0;
}

在上述代码中:

  • 首先创建了一个 stringstream 对象 ss
  • 接着通过流插入操作符 << 将一个整数 num、一个双精度浮点数 d 和一个字符串 str 依次写入到 ss 中,此时这些不同类型的数据被组合到了同一个字符串流里,以特定的格式(这里是用空格隔开)暂存起来。
  • 然后使用流提取操作符 >>ss 中依次读取数据,将读取到的值赋给相应的变量 extractedNumextractedDextractedStr

相关文章:

[C++]:IO流

1. IO 流 1.1 流的概念 在C中&#xff0c;存在一种被称为“流”的概念&#xff0c;它描述的是信息流动的过程&#xff0c;具体来说就是信息从外部输入设备&#xff08;比如常见的键盘&#xff09;传输到计算机内部&#xff08;像内存区域&#xff09;&#xff0c;以及信息从内…...

Excel如何批量导入图片

这篇文章将介绍在Excel中如何根据某列数据&#xff0c;批量的导入与之匹配的图片。 准备工作 如图&#xff0c;我们准备了一张员工信息表以及几张员工的照片 可以看到&#xff0c;照片名称是每个人的名字&#xff0c;与Excel表中的B列&#xff08;姓名&#xff09;对应 的卢易…...

TCP socket api详解

文章目录 netstat -nltpaccept简单客户端工具 telnet 指定服务连接connect异常处理version 1 单进程版version 2 多进程版version 3 -- 多线程版本version 4 ---- 线程池版本 应用-简单的翻译系统服务器细节write 返回值 客户端守护进程化前台和后台进程的原理Linux的进程间关系…...

《C++搭建神经网络基石:开启智能编程新征程》

在人工智能的璀璨星空中&#xff0c;神经网络无疑是最为耀眼的星座之一。而 C以其卓越的性能和高效的执行效率&#xff0c;成为构建神经网络模型的有力武器。今天&#xff0c;就让我们一同探索如何使用 C构建一个基础的神经网络模型&#xff0c;踏上智能编程的奇妙旅程。 一、…...

if (条件) { return true; } return false; 简写为 return 条件 详解

在 Java 中&#xff0c;将以下代码&#xff1a; if (条件) {return true; } return false;简写为&#xff1a; return 条件;原理 在 Java 中&#xff0c;条件 是一个布尔表达式&#xff0c;它直接返回 true 或 false。所以&#xff0c;if-else 结构中的逻辑判断和返回值的逻…...

Pytorch使用手册-Datasets DataLoaders(专题三)

数据集与数据加载器(Datasets & DataLoaders) 在 PyTorch 中,torch.utils.data.Dataset 和 torch.utils.data.DataLoader 是数据处理的两种核心工具。它们通过模块化的方式,将数据加载与模型训练分离,提高代码的可读性和可维护性。 1. 加载数据集 以 Fashion-MNIST …...

【数据结构】双向链表、单向循环链表、双向循环链表、栈、链栈

目录 一、双向链表 定义类和封装函数以及测试样例如下&#xff1a; 注意事项&#xff1a; 二、循环链表 单循环列表的类和函数封装如下&#xff1a; 注意事项&#xff1a; 三、双向循环链表 结点类和双循环链表的定义部分 函数封装之判空和尾插 双循环链表遍历 双循…...

(动画)Qt控件 QProgressBar

文章目录 QProgressBar1. 介绍一、基本特性二、核心属性 2. 代码实现3. 动画效果 QProgressBar 1. 介绍 QProgressBar是Qt框架中的一个控件&#xff0c;主要用于显示进度条&#xff0c;以图形化的方式表示任务的完成进度或操作的进度。 一、基本特性 显示方向&#xff1a;…...

【AI】基础原理

文章目录 前言1. AI 是如何学习的&#xff1f;2. AI 怎么做决定&#xff1f;3. AI 的“大脑”是什么样的&#xff1f;4. AI 为什么会犯错&#xff1f;5. AI 的不同类型总结&#xff1a;AI 的本质是什么&#xff1f; 前言 人工智能&#xff08;AI&#xff09;这个词对很多人来说…...

多模态大型语言模型(MLLM)综述

目录 多模态大语言模型的基础 长短期网络结构(LSTM) 自注意力机制 基于Transformer架构的自然语言处理模型 多模态嵌入概述 多模态嵌入关键步骤 多模态嵌入现状 TF-IDF TF-IDF的概念 TF-IDF的计算公式 TF-IDF的主要思路 TF-IDF的案例 训练和微调多模态大语言模…...

计算机的错误计算(一百六十六)

摘要 探讨 MATLAB 关于算式 的计算误差。 例1. 已知 计算 直接贴图吧&#xff1a; 然而&#xff0c;16位的正确结果为 -0.9765626220703239e-21&#xff08;ISRealsoft 提供&#xff09;。这样&#xff0c;MATLAB输出的有效数字的错误率为 (16-2)/16 87.5% . 注&…...

typeof 和 as 关键字

在编程语言中&#xff0c;类型系统是确保代码正确性和可维护性的关键。JavaScript和TypeScript作为现代前端开发的两大支柱&#xff0c;它们在处理类型方面有着不同的机制。本文将探讨typeof和as这两个关键字在JavaScript和TypeScript中的应用&#xff0c;帮助开发者更好地理解…...

Python酷库之旅-第三方库Pandas(237)

目录 一、用法精讲 1116、pandas.tseries.offsets.BusinessHour.is_year_end方法 1116-1、语法 1116-2、参数 1116-3、功能 1116-4、返回值 1116-5、说明 1116-6、用法 1116-6-1、数据准备 1116-6-2、代码示例 1116-6-3、结果输出 1117、pandas.tseries.offsets.Cu…...

git提交到远程仓库如何撤回?

git提交到远程仓库如何撤回? 要撤回已经提交到远程仓库的更改&#xff0c;你可以使用以下步骤&#xff1a; 首先&#xff0c;确保你的本地仓库是最新状态。如果不是&#xff0c;请先执行 git pull 来更新你的本地仓库。 使用 git log 查看提交历史&#xff0c;找到你想要撤回…...

微信小程序常用全局配置项及窗口组成部分详解

微信小程序常用全局配置项及窗口组成部分详解 引言 微信小程序作为一种新兴的应用形态,凭借其轻量级、便捷性和丰富的功能,已成为开发者和用户的热门选择。在开发小程序的过程中,了解全局配置项和窗口组成部分是至关重要的。本文将详细介绍微信小程序的常用全局配置项及窗…...

ThingsBoard规则链节点:Azure IoT Hub 节点详解

目录 引言 1. Azure IoT Hub 节点简介 2. 节点配置 2.1 基本配置示例 3. 使用场景 3.1 数据传输 3.2 数据分析 3.3 设备管理 4. 实际项目中的应用 4.1 项目背景 4.2 项目需求 4.3 实现步骤 5. 总结 引言 ThingsBoard 是一个开源的物联网平台&#xff0c;提供了设备…...

「Mac玩转仓颉内测版32」基础篇12 - Cangjie中的变量操作与类型管理

本篇将深入探讨 Cangjie 编程语言中的变量操作与类型管理&#xff0c;涵盖变量的定义、作用域、类型推断、常量、变量遮蔽、类型转换等方面的知识。通过这些概念的学习&#xff0c;开发者将更好地理解和灵活掌握变量的使用与管理技巧。 关键词 变量定义类型推断常量变量作用域…...

【Android】RecyclerView回收复用机制

概述 RecyclerView 是 Android 中用于高效显示大量数据的视图组件&#xff0c;它是 ListView 的升级版本&#xff0c;支持更灵活的布局和功能。 我们创建一个RecyclerView的Adapter&#xff1a; public class MyRecyclerView extends RecyclerView.Adapter<MyRecyclerVie…...

麒麟系统性能瓶颈分析

1.使用率&#xff0c;表示资源用于服务的时间或容量百分比。100% 的使用率&#xff0c;表示容量已经用尽或者全部时 间都用于服务。 2. 饱和度&#xff0c;表示资源的繁忙程度&#xff0c;通常与等待队列的长度相关。100% 的饱和度&#xff0c;表示资源无法接受 更多的请求。 3…...

Java二分查找+冒泡排序

二分查找在编程中是用来查找目标元素在有序数组中的位置,并返回目标元素的索引 先给定一个有序数组,在创建一个方法来进行二分 主要思想是:根据数组具有下标的特点来分别计算,最左边的索引,以及最右边的索引,在判断目标元素与中间元素的大小,如果目标元素小于中间元素,我们可…...

(三)手势识别——动作识别应用【代码+数据集+python环境(免安装)+GUI系统】

&#xff08;三&#xff09;手势识别——动作识别应用【代码数据集python环境&#xff08;免安装&#xff09;GUI系统】 &#xff08;三&#xff09;手势识别——动作识别【代码数据集python环境GUI系统】 背景意义 随着互联网的普及和机器学习技术的进一步发展&#xff0c;手…...

大数据实战——MapReduce案例实践

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 大数据实战——MapReduce案例实践 一&#xff0e;过程分析&#xff08;截图&#xff09;1. 确定Hadoop处于启动状态2. 在/usr/local/filecotent…...

OpenCV基础(3)

1.图像直方图 1.1.像素统计 计算图像均值&#xff1a; Scalar cv::mean(InputArray src,InputArray masknoArray()); src&#xff1a;输入图像mask&#xff1a;掩膜层过滤 返回值是对输入图像通道数计算均值后的Scalar对象 计算图像均值与方差&#xff1a; void cv::meanSt…...

大语言模型---RewardBench 介绍;RewardBench 的主要功能;适用场景

文章目录 1. RewardBench 介绍2. RewardBench 的主要功能3. 适用场景 1. RewardBench 介绍 RewardBench: Evaluating Reward Models是一个专门用于评估 Reward Models&#xff08;奖励模型&#xff09; 的公开平台&#xff0c;旨在衡量模型在多种任务上的性能&#xff0c;包括…...

泷羽sec-linux

基础之linux 声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团…...

栈、队列、链表

一、栈 1. 定义 栈是一种线性数据结构&#xff0c;遵循后进先出&#xff08;LIFO, Last In First Out&#xff09;的原则。这意味着最后被添加到栈中的元素将会是最先被移除的元素。 2. 基本操作 Push&#xff1a;将一个元素添加到栈顶。Pop&#xff1a;移除并返回栈顶的元…...

【maven】配置下载私有仓库的快照版本

1、setting.xml配置 <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/SETTINGS/1.0.0https://maven.apache.org/xsd/settings-1.0.0.…...

LabVIEW引用类型转换问题

一、问题描述 在LabVIEW中&#xff0c;refnum&#xff08;引用编号&#xff09;用于引用各种资源&#xff0c;如文件、队列、控件等。这些引用是与具体类型相关的&#xff0c;通常情况下&#xff0c;LabVIEW会根据引用的类型自动进行处理。然而&#xff0c;当不同类型的引用需…...

GUI智能代理:用AI代理玩米哈游游戏《崩坏》

项目名称:The Dawn of GUI Agent研究对象:Claude 3.5 Computer Use特点:首个公测版GUI智能代理系统 技术创新 首创性:这是首个提供公测版图形界面控制功能的前沿AI模型。交互方式:实现了从自然语言到桌面操作的端到端控制,用户可以通过简单的自然语言指令完成复杂的桌面…...

系统思考—环路图的好处

每次内部学习&#xff0c;我们都会用系统环路图拆解那些动态性复杂的议题。这不仅仅是我们教学的工具&#xff0c;更是我们在实践中不断应用和打磨的利器。 我常在课程中和大家分享&#xff0c;什么原因要持续使用系统环路图&#xff1f; &#x1f3af; 1. 落地全局思维 环路图…...