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

【C++】<知识点> 标准和文件的输入输出

目录

        一、输入输出操作

                1. 相关的类

                2. 标准流对象

                3. istream类的成员函数

二、流操纵算子

        1. 整数流的基数

        2. 浮点数精度的流操纵算子

        3. 域宽的流操纵算子

        4. 其他的流操纵算子

        5. 用户自定义流操纵算子

三、文件读写

        1. 文本文件的读写

        2. 二进制文件的读写

        3. 文件读写指针

        4. 文本文件和二进制文件区别


一、输入输出操作

1. 相关的类

  • ios基类派生出istream和ostream。
  • istream派生出ifstream,ostream派生出ofstream。
  • iostream继承自istream和ostream。
  • fstream继承自iostream。

注意:cin就是istream类的对象,cout就是istream类的对象。

2. 标准流对象

(1) 输入流对象:cin与标准输入设备相连(从键盘获取数据)。也可以被重定向为从文件中读取数据。

(2) 输出流对象:

  • cout与标准输出设备相连(在屏幕上打印数据)。也可以被重定向为向文件写入数据(freopen函数)。
  • cerr与标准错误输出设备相连。
  • clog与标准错误输出设备相连。
  • cerr和clog的区别在于cerr不使用缓冲区,直接向显示器输出信息;而clog采用缓冲区,只有缓冲区满或者刷新时才会输出到屏幕上。

(3) 代码示例:

【1】输出重定向

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;int main()
{double x, y;cin >> x >> y;//freopen函数:输出重定向到文件//原型:FILE *freopen(const char *path, const char *mode, FILE * stream);//path是目标文件//mode为文件打开模式"r"或"w"//stream为标准流文件,例如stdin标准输入流, stdout标准输出流, stderr标准错误流freopen("cout.txt", "w", stdout);if (y == 0) {cerr << "error!" << endl;}else {cout << x / y;//输出到文件cout.txt中}return 0;
}

  

显然,屏幕上并没有输出计算结果0.5,该结果输出到cout.txt文件中。

【2】输入重定向

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;int main()
{int n1 = 0, n2 = 0;//freopen函数:输入重定向freopen("input.txt", "r", stdin);cin >> n1 >> n2;//由于重定向了,不会在终端等用户输入cout << "结果:" << n1 << ", " << n2 << endl;return 0;
}

【3】判断输入流结束

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;int main()
{int x;freopen("test.txt", "r", stdin);while (cin >> x) {cout << "读入:" << x << endl;}return 0;
}

注意:①这里将cin重定向为从文件读取数据,那么读到文件末尾即结束。若未重定向,从键盘中输入则需要单独一行输入Ctrl+Z代表输入流结束。cin >> x返回值为istream&,而istream会有对象的重载,将其转换成bool类型,因此可以作为循环条件。

3. istream类的成员函数

(1) getline函数:

  • 原型:①istream& getline(char* buf, int bufSize); ②istream& getline(char* buf, int bufSize, char delim);
  • 对于第一个原型:从输入流中读取bufSize-1个字符到缓冲区buf,或读到'\n'为止(哪个先到算哪个)。
  • 对于第二个原型:从输入流中读取bufSize-1个字符到缓冲区buf,或读到delim字符为止(哪个先到算哪个)。
  •  注意:
    • 两个函数都会自动在buf中读入数据的结尾添加'\0'。
    • ‘\0’和delim都不会被读入buf,但会被输入流中取走。
    • 如果输入流中'\n'或delim之前的字符个数达到或超过了bufSize个,就导致读入错误,即虽然本次读入已经完成,但是之后的读入就都失败了。
    • 可以用if (!cin.getline(...))判断输入是否结束。

(2) bool eof(); 用于判断输入流是否结束。

(3) int peek(); 返回下一个字符,但不从流中去除。

(4) istream& putback(char c); 将字符ch放回输入流的头部。

(5) istream& ignore(int nCount = 1, int delim = EOF); 从流中删掉最多nCount个字符,遇到EOF结束。

(6) getline函数代码示例:

#include <iostream>
using namespace std;int main()
{int x;char buf[90];cin >> x;cin.getline(buf, 90, '\n');cout << buf << endl;return 0;
}


二、流操纵算子

1. 整数流的基数

(1) 说明:在cout时,可以指定输出的整数的进制:dec(十进制)、oct(八进制)、hex(十六进制)。

(2) 注意:①使用流操纵算子,需要添加头文件iomanip。②一旦设置,就会持续有效直到新的操纵算子出现。

(3) 代码示例:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <iomanip>
using namespace std;int main()
{int n = 10;cout << dec << n << endl;//十进制显示ncout << oct << n << endl;//八进制显示ncout << hex << n << endl;//十六进制显示n//一旦设置dec、oct或者hex,就会持续有效直到写新操纵算子。cout << n << endl;return 0;
}

2. 浮点数精度的流操纵算子

(1) precision:是ostream的成员函数,调用方式为:cout.precision(5); 用于指定浮点数的有效位数(非定点方式)系统默认是非定点方式。

(2) setprecision:流操纵算子,调用方式为:cout << setprecision(5); 用于指定浮点数的有效位数(非定点方式)和指定浮点数的小数后的有效位数(非定点方式)定点方式:小数点必须出现在个位数后面。

(3) 注意:

  • 当位数超过精度时会四舍五入。
  • setprecision方式会持续有效,直到设置新的精确度。
  • setprecision操纵算子也需要添加头文件iomanip。
  • 在非定点方式下,setprecision可能会使用科学计数法来表示。

(4) setiosflags(ios::fixed):以小数点位置固定的方式来输出(可以简单用cout << fixed;)。另外,cout << scientific表示采用科学计数法。

(5) resetiosflags(ios::fixed):取消以小数点位置固定的方式来输出。

(6) 代码示例:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <iomanip>
using namespace std;int main()
{float f = 1234567.89;int n = 123456;//默认是非定点方式cout << "*****非定点******" << endl;cout << setprecision(6);//设置浮点数有效位数为6cout << f << endl;//由于非定点方式且规定只能有6位,因此用科学计数法显示cout << n << endl;//浮点数的操纵算子不影响整数//修改为定点方式cout << "*****定点********" << endl;cout << setiosflags(ios::fixed);cout << f << endl;//小数点后有6位,不够就补0//修改为非定点方式cout << "*****非定点******" << endl;cout << resetiosflags(ios::fixed);cout << f << endl;//由于非定点方式且规定只能有6位,因此用科学计数法显示return 0;
}

3. 域宽的流操纵算子

(1) setw:流操纵算子,用于设置域宽。调用方式:cout << setw(5)或cin >> setw(5)。

(2) width:成员函数,用于设置域宽。调用方式:cout.width(5)或cin.width(5)。

(3) 注意:域宽的流操纵算子是一次性的,每次输入输出前都需要指定宽度。

(4) 代码示例:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <iomanip>
using namespace std;int main()
{int m = 4;char string[10];cin >> setw(5);//设置输入宽度while (cin >> string) {cout << setw(m++);//设置输出宽度cout << string << endl;cin >> setw(5);}return 0;
}

(5) 结果解释:

  • 第一行是我们输入的数据1234567890.
  • 第二行输出1234。首先,设置输入宽度为5(实际上只接收4个字符,最后自动加'\0'),那么string里就是1234‘\0’。其次,设置输出宽度为4(设置完后m自增为5),那么输出4个字符即1234.
  • 第三行输出" 5678"。首先,设置输入宽度为5(实际上只接收4个字符,最后自动加'\0'),那么string里就是5678‘\0’。其次,设置输出宽度为5(设置完后m自增为6),那么输出5个字符即空格+5678.
  • 第四行输出"    90"。首先,设置输入宽度为5(实际上只接收4个字符,最后自动加'\0'),那么string里就是90‘\0’。其次,设置输出宽度为6(设置完后m自增为7),那么输出6个字符即4个空格+90.

4. 其他的流操纵算子

(1) cout << showpos; 非负数显示正号。

(2) cout << noshowpos; 非负数不显示正号。

(3) cout << setfill(*); 宽度不足用*填补。

(4) cout << right; 右对齐,宽度不足则左边填充。

(5) cout << left; 左对齐,宽度不足则右边填充。

(6) cout << internal; 在负号和数字之间填充。

(7) 综合案例:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <iomanip>
using namespace std;int main()
{int i = 141;double x = 1234567.89, y = 12.34567;//1) 8d 141 215cout << "1) " << hex << i << " " << dec << i << " " << oct << i << endl;//2) 1.2346e+006 12.346cout << "2) " << setprecision(5) << x << " " << y << endl;//3) 1234567.89000 12.34567cout << "3) " << fixed << setprecision(5) << x << " " << y << endl;//4) 1.23457e+006 1.23457e+001cout << "4) " << scientific << setprecision(5) << x << " " << y << endl;//5) ***+12.10000cout << "5) " << showpos << right << fixed << setprecision(5) << setfill('*') << setw(12) << 12.1 << endl;//6) 12.10000****cout << "6) " << noshowpos << left << fixed << setprecision(5) << setfill('*') << setw(12) << 12.1 << endl;//7) ****12.10000cout << "7) " << noshowpos << right << fixed << setprecision(5) << setfill('*') << setw(12) << 12.1 << endl;//8) -***12.10000cout << "8) " << showpos << right << fixed << setprecision(5) << internal << setfill('*') << setw(12) << -12.1 << endl;//9) 12.10000cout << "9) " << noshowpos << fixed << setprecision(5) << 12.1 << endl;return 0;
}

5. 用户自定义流操纵算子

(1) 格式:

ostream& 函数名(ostream& cout) {//执行的操作return cout;
}

(2) 代码示例:定义tab流操纵算子。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;ostream& tab(ostream& output) {return output << '\t';
}int main()
{cout << "a" << tab << "b" << endl;return 0;
}

(3) 底层解释:由于iostream里对<<进行了重载(使用成员函数方式),即ostream& operator << (ostream& (*p) (ostream&)); 其中ostream& (*p) (ostream&)是函数指针,能够根据函数名找到对应的函数并执行函数体,同时内部还返回了*this就是对象本身。因此,在上述示例中,tab就是一个函数名,会执行tab的函数体。


三、文件读写

1. 文本文件的读写

(1) 创建读文件对象:ifstream srcFile("in.txt", ios::in);

(2) 创建写文件对象:ofstream destFile("out.txt", ios::out);

(3) 从文件中读取字符:srcFile >> x;

(4) 将字符写入文件:destFile << x;

(5) 注意:

  • 写文件对象中ios::out选项:删除原有内容,写入新内容。
  • 写文件对象中ios::app选项:在原内容后面追加新内容。
  • 读写文件对象中ios::binary选项:以二进制方式写入/读取。
  • ifstream和ofstream换成fstream也行。

(6) 代码示例:将in.txt中的内容1 234 9 45 6 879排序,并存到out.txt中。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;int main()
{//1.打开文件in.txtifstream srcFile("./in.txt", ios::in);if (!srcFile) {cout << "srcFile文件打开失败!" << endl;return -1;}//2.读取文本字符并加入vector中int readInt;vector<int> v;while (srcFile >> readInt) {v.push_back(readInt);}//3.对vector中元素排序sort(v.begin(), v.end());//4.将排序结果写入out.txtofstream outFile("./out.txt", ios::out);if (!outFile) {cout << "outFile文件打开失败!" << endl;return -1;}for (int i = 0; i < v.size(); i++) {outFile << v[i] << " ";}//5.关闭文件srcFile.close();outFile.close();return 0;
}

         

2. 二进制文件的读写

(1) 创建读写对象:方式与文本文件相同,但是选项要或(|)上ios::binary选项!

(2) 读文件:使用ifstream和fstream中的成员函数read函数。

  • 函数原型:istream& read(char* s, long n);
  • 功能:将文件读指针指向的地方的n个字节内容,读取到内存地址s,然后读指针向后移动n字节。

(3) 写文件:使用ofstream和fstream中的成员函数write函数。

  • 函数原型:istream& write(const char* s, long n);
  • 功能:将内存地址s处的n个字节内容,写入到写指针指向的位置,然后写指针向后移动n字节。

(4) 代码示例:将整数120写入二进制文件,再从该二进制文件中读取整数。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
using namespace std;int main()
{//写入ret于二进制文件out.dat中int ret = 120;ofstream outFile("./out.dat", ios::out | ios::binary);outFile.write((const char*)(&ret), sizeof(int));outFile.close();//从out.dat中读取一个整数int readInt;ifstream inFile("./out.dat", ios::in | ios::binary);inFile.read((char*)(&readInt), sizeof(int));inFile.close();//显示读取的整数cout << readInt << endl;return 0;
}

3. 文件读写指针

(1) 介绍:

  • 对于输入文件,有一个读指针。
  • 对于输出文件,有一个写指针。
  • 对于输入输出文件,有一个读写指针。
  • 读/写指针标识文件操作的当前位置。

(2) 读指针相关操作:

  • tellg():获取读指针的位置。调用方式:"输出对象.tellg()"。
  • seekg(int i):移动读指针至第i个字节处。调用方式:"输出对象.seekg(i)"。
  • seekg(int i, ios::beg):移动至距文件开始的第i个位置。
  • seekg(int i, ios::cur):移动至当前位置后的第i位置。
  • seekg(int i, ios::end):移动至距文件末尾的第i个位置。(常用于统计文本的字符数)

(3) 写指针相关操作:

  • tellp():获取写指针的位置。调用方式:"输出对象.tellp()"。
  • seekp(int i):移动写指针至第i个字节处。调用方式:"输出对象.seekp(i)"。
  • seekp(int i, ios::beg):移动至距文件开始的第i个位置。
  • seekp(int i, ios::cur):移动至当前位置后的第i位置。
  • seekp(int i, ios::end):移动至距文件末尾的第i个位置。

(4) 代码示例:输出A~Z于test.txt中,并且每两个字符间空两格。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
using namespace std;int main()
{ofstream outFile("./test.txt", ios::out);/* 输出A~Z于test.txt中,并且每两个字符间空两格*/for (char i = 'A'; i <= 'Z'; i++) {//获取写文件指针位置int location = outFile.tellp();//写入字符outFile << i;//文件指针会自动+1,再使用seekp跳到后两个位置outFile.seekp(2, ios::cur);//打印测试信息cout << location << endl;}//关闭文件outFile.close();return 0;
}

4. 文本文件和二进制文件区别

(1) 不同操作系统下换行符号区别:

  • Linux下的换行:'\n'(ASCII:0x0a)
  • Windows下的换行:'\r\n'(ASCII:0x0d0a)
  • MacOS下的换行:'\r'(ASCII:0x0d)
  • 由于ASCII码不同,Linux和MacOS的文本文件在Windows中的记事本打开时不换行。

(2) 文本文件和二进制文件区别:

  • Linux下打开文件,用不用ios::binary没区别。
  • Windows下打开文件,如果不用ios::binary,则会造成①读取文件时,所有的'\r\n'都会被当作'\n'处理,因此会少读了一个字符'\r'。②写入文件时,写入单独的'\n'时,系统会自动加'\r',因此多写了一个字符'\r'。
  • 一般来说,使用二进制文件更加节省空间。例如,保存123456,若保存于文本文件则需要6个字节,而保存于二进制文件用一个int的字节就行了。

相关文章:

【C++】<知识点> 标准和文件的输入输出

目录 一、输入输出操作 1. 相关的类 2. 标准流对象 3. istream类的成员函数 二、流操纵算子 1. 整数流的基数 2. 浮点数精度的流操纵算子 3. 域宽的流操纵算子 4. 其他的流操纵算子 5. 用户自定义流操纵算子 三、文件读写 1. 文本文件的读写 2. 二进制文件的读写 3. 文件读写…...

在阿里Anolis OS 8.9龙蜥操作系统安装docker

在Anolis OS 8系统安装docker 1.更新系统 sudo dnf update -y2.安装依赖包 sudo dnf install -y yum-utils device-mapper-persistent-data lvm23.添加Docker的官方仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo4.安装…...

短剧APP开发,短剧行业发展下的财富密码

今年以来&#xff0c;短剧市场展现出了繁荣发展的态势&#xff0c;成为了一个风口赛道。 短剧具有不拖沓、时长短、剧情紧凑等优势&#xff0c;顺应了当代人的生活&#xff0c;是当代人的“电子榨菜”。 短剧的快速发展同时也带动了新业态新模式的发展&#xff0c;短剧APP就是…...

简述分代垃圾回收器是怎么工作的?

分代垃圾回收器是一种用于管理和回收内存中垃圾对象的技术。它根据对象的存活时间将内存分为不同的代&#xff0c;并针对每个代应用不同的垃圾回收策略。 分代垃圾回收器的工作过程如下&#xff1a; 内存分代&#xff1a;首先&#xff0c;将内存分为不同的代&#xff0c;通常是…...

Qt 自定义代理类

一.使用步骤 继承QStyledItemDelegate类&#xff1a;首先创建一个新的类并继承自QStyledItemDelegate类&#xff0c;作为您的自定义代理类。 实现代理类的构造函数&#xff1a;在代理类中实现构造函数&#xff0c;并在构造函数中调用基类的构造函数&#xff0c;可以选择传入一…...

android GridLayout 布局详解,并举例

GridLayout 是 Android 中的一个布局容器&#xff0c;它允许你在一个二维网格中排列子视图。你可以指定网格的行数和列数&#xff0c;或者让 GridLayout 自动计算它们。每个子视图都可以占据一个或多个网格单元格。GridLayout 非常适合在需要创建规则网格的应用中使用&#xff…...

el-transfer和el-tree进行结合搞一个树形穿梭框

由于业务需求需要在穿梭框里使用树形结构&#xff0c;但是本身element里并不支持&#xff0c;于是参考了别的大佬发的文章作为思路及后续自己新增了一些处理功能。 目录 1.拷贝代码放到自己的项目目录中 2.改造el-transfer的源码 3.修改tree-transfer-panel.vue文件 4.修改…...

编一个自己的万年历

编一个自己的万年历 前阶段突然想查一下某一天是星期几&#xff0c;于是自己编了一个[小程序][https://blog.csdn.net/weixin_41905135/article/details/138972055?spm1001.2014.3001.5501]&#xff0c;但是功能很单一&#xff0c;就是单纯的查是星期几。&#xff08;虽然用网…...

Golang gin框架中间件c.JSON返回结果后终止返回

gin框架中间件c.JSON返回结果后还是会继续执行之后的方法&#xff0c;我们可以用c.Abort()来终止后续的处理 func MiddlewareFunction(c *gin.Context) {// 假设有某种条件下需要返回错误if someCondition {c.JSON(http.StatusBadRequest, gin.H{"error": "som…...

码蹄集部分题目(2024OJ赛16期;单调栈集训+差分集训)

&#x1f9c0;&#x1f9c0;&#x1f9c0;单调栈集训 &#x1f96a;单调栈 单调递增栈伪代码&#xff1a; stack<int> st; for(遍历数组) {while(栈不为空&&栈顶元素大于当前元素)//单调递减栈就是把后方判断条件变为小于等于即可{栈顶元素出栈;//同时进行其他…...

安卓玩机搞机技巧综合资源----自己手机制作证件照的几种方法 免费制作证件照

接上篇 安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】 安卓玩机搞机技巧综合资源------开机英文提示解决dm-verity corruption your device is corrupt. 设备内部报错 AB分区等等【二】 安卓玩机搞机技巧综合资源------EROFS分区格式 小米红…...

揭秘循环购模式:消费返利新玩法,引领电商新潮流

在当今的消费市场中&#xff0c;有一种商业模式引起了广大消费者的热烈讨论——那就是循环购模式。你可能会想&#xff0c;消费满千元就能得到两千元的福利&#xff0c;每天还能领取现金&#xff0c;这怎么可能呢&#xff1f;商家难道真的在“慷慨解囊”&#xff1f;今天&#…...

【制作100个unity游戏之26】unity2d横版卷轴动作类游13(附带项目源码)

最终效果 系列导航 文章目录 最终效果系列导航前言存储点灯光后处理存储位置信息存储更多数据存储场景信息持久化存储数据引入Unity 的可序列化字典类调用 游戏结束源码完结 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各…...

Golang使用HTTP框架zdpgo_resty实现文件下载

核心代码 代码解析&#xff1a; client.SetOutputDirectory("Downloads") 设置下载目录client.R().SetOutput("test.go").Get("http://127.0.0.1:3333/download 指定下载文件名并进行下载 // 设置输出目录路径&#xff0c;如果目录不存在&#xff…...

提取COCO 数据集的部分类

1.python提取COCO数据集中特定的类 安装pycocotools github地址&#xff1a;https://github.com/philferriere/cocoapi pip install githttps://github.com/philferriere/cocoapi.git#subdirectoryPythonAPI若报错&#xff0c;pip install githttps://github.com/philferriere…...

高刚性滚柱直线导轨有哪些优势?

滚柱导轨是机械传动系统中用于支持和引导滑块或导轨的装置&#xff0c;承载能力较高、刚性强及高精度等特点。特别适用于大负载和高刚性的工业设备&#xff0c;如机床、数控机床等设备&#xff0c;这些优势使其在工业生产和机械设备中得到了广泛的应用。 1、高精度&#xff1a;…...

KNN及降维预处理方法LDA|PCA|MDS

文章目录 基本原理模型介绍模型分析 python代码实现降维处理维数灾难 curse of dimensionality线性变换 Linear TransformationLDA - 线性判别分析LDA python 实现PCA - 主成分分析PCA最近重构性PCA最大可分性PCA求解及说明PCA python实现 多维缩放 Multiple Dimensional Scali…...

论文精读-SwinIR Image Restoration Using Swin Transformer

论文精读-SwinIR: Image Restoration Using Swin Transformer SwinIR:使用 Swin Transformer进行图像恢复 参数量&#xff1a;SR 11.8M、JPEG压缩伪影 11.5M、去噪 12.0M 优点&#xff1a;1、提出了新的网络结构。它采用分块设计。包括浅层特征提取&#xff1a;cnn提取&#…...

解释Spring Bean的生命周期

Spring Bean的生命周期涉及到Bean的创建、配置、使用和销毁的各个阶段。理解这个生命周期对于编写高效的Spring应用和充分利用框架的功能非常重要。下面是Spring Bean生命周期的主要步骤&#xff1a; 1. 实例化Bean Spring容器首先将使用Bean的定义&#xff08;无论是XML、注…...

CTF网络安全大赛web题目:字符?正则?

题目来源于&#xff1a;bugku 题目难度&#xff1a;难 题目描  述: 字符&#xff1f;正则&#xff1f; 题目htmnl源代码&#xff1a; <code><span style"color: #000000"> <span style"color: #0000BB"><?php <br />highl…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...

Java数组Arrays操作全攻略

Arrays类的概述 Java中的Arrays类位于java.util包中&#xff0c;提供了一系列静态方法用于操作数组&#xff08;如排序、搜索、填充、比较等&#xff09;。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序&#xff08;sort&#xff09; 对数组进行升序…...

如何通过git命令查看项目连接的仓库地址?

要通过 Git 命令查看项目连接的仓库地址&#xff0c;您可以使用以下几种方法&#xff1a; 1. 查看所有远程仓库地址 使用 git remote -v 命令&#xff0c;它会显示项目中配置的所有远程仓库及其对应的 URL&#xff1a; git remote -v输出示例&#xff1a; origin https://…...

SQL进阶之旅 Day 22:批处理与游标优化

【SQL进阶之旅 Day 22】批处理与游标优化 文章简述&#xff08;300字左右&#xff09; 在数据库开发中&#xff0c;面对大量数据的处理任务时&#xff0c;单条SQL语句往往无法满足性能需求。本篇文章聚焦“批处理与游标优化”&#xff0c;深入探讨如何通过批量操作和游标技术提…...

k8s从入门到放弃之Pod的容器探针检测

k8s从入门到放弃之Pod的容器探针检测 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;容器探测是指kubelet对容器执行定期诊断的过程&#xff0c;以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...