c++学习 文件操作,模板
文件操作
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
//文本操作
//程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放
//通过文件可以数据持久化
//c++中对文件操作包含头文件<fstream>
//文件类型分为两种:
//1.文本文件 -文件以文本的ASCLL码形式存储在计算机中
//2.二进制文件 - 文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们
//操作文件的三大类
//1.ofstream:写操作
//2.ifstream:读操作
//3.fstream: 读写操作
//写文件
//1.包含头文件
//#include<fstream>
//2.创建流对象
//ofstream ofs;
//3.打开文件
//ofs.open("文件路径",打开方式);
//文件打开方式:
//ios::in 读文件方式打开
//ios::out 写文件方式打开
//ios::ate 初始位置:文件尾
//ios::app 追加文件方式打开
//ios::trunc 如果文件存在先删除,再创建
//ios::binary 二进制方式
//文件打开方式可以配合使用,利用|操作符
//4.写数据
//ofs<<"写入的数据";
//5.关闭文件
//ofs.close();
void test(){//1.包含头文件//2.创建流对象 ofstream ofs;//3.指定打开方式ofs.open("text.txt",ios::out);//4.写内容ofs<<"姓名:张三"<<endl;ofs<<"性别:男"<<endl;ofs<<"年龄:25"<<endl; //5.关闭文件 ofs.close();
}
//读文件
//1.包含头文件
//#include<fstream>
//2.创建流对象
//ifstream ifs;
//3.打开文件并判断文件是否打开
//ifs.open("文件路径",打开方式);
//4.读数据
//四种方式读取
//5.关闭文件
//ifs.close()
void test1(){//1、包含头文件//2、创建流对象ifstream ifs; //3、打开文件并判断文件是否打开ifs.open("text.txt",ios::in);if(!ifs.is_open()){cout<<"文件打开失败"<<endl;return;}//4、读数据//第一种 char buf[1023] = {0};while(ifs >> buf) {cout<<buf<<endl;}
// //第二种
// char buf[1024] = {0};
// while(ifs.getline(buf,sizeof(buf))) {
// cout<<buf<<endl;
// }
// //第三种
// string buf;
// while(getline(ifs,buf)){
// cout<<buf<<endl;
// } //第四种
// char c;
// while((c = ifs.get()) != EOF){ //EOF end of file
// cout<<c;
// } //5、关闭文件 ifs.close();
}
//二进制文件
//以二进制的方式对文件进行读写操作
//打开方式要指定为ios::binary
//二进制文件写文件
//二进制方式写文件主要利用流对象调用成员函数write
//函数原型:ostream&write(const char *buffer,int len);
//参数解释:字符指针buffer指向内存中一段存储空间。len是读写的字节数
class Person{public:char m_Name[64];int m_Age;
};
void test2(){//1.包含头文件//2.创建流对象ofstream ofs; //3.打开文件ofs.open("person.txt",ios::out|ios::binary);//创建流对象和打开文件一起
// ofstream ofs("person.txt",ios::out|ios::binary);//4.写文件Person p = {"张三",18} ;ofs.write((const char *)&p, sizeof(p));//5.关闭文件 ofs.close();}
//二进制文件读文件
//函数原型:istream&read(char *buffer,int len);
class Person1{
public: char m_Name[64];int m_Age;
};
void test3(){//1.包含头文件//2.创建流对象ifstream ifs; //3.打开文件 判断文件是否打开成功 ifs.open("person.txt",ios::in|ios::binary);if(! ifs.is_open()){cout<<"文件打开失败"<<endl; return;}//创建流对象和打开文件一起
// ifstream ofs("person.txt",ios::out|ios::binary);//4.读文件Person1 p;ifs.read((char *)&p, sizeof(Person1));cout<<"姓名:"<<p.m_Name<<" 年龄:"<<p.m_Age<<endl; //5.关闭文件 ifs.close();
}
int main(){//文本文件写 test();//文本文件读 test1();//二进制文件写 test2();//二进制文件读test3();
}
模板:
#include<iostream>
#include<string>
using namespace std;//1.2函数模板语句
//c++另一种编程思想称为泛型编程,主要利用的技术就是模板
//c++提供两种模板机制:函数模板和类模板
//1.2.1函数模板作用:
//建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表
//语法: template<typename T>
// 函数声明或定义
//template --- 声明创建模板
//typename --- 表明其后面的符号是一种数据类型,可以用class代替
//T --- 通用的数据类型,名称可以替换,通常为大写字母 //函数模板
template<typename T> void mySwap(T &a,T &b)
{T temp = a;a = b;b = temp;
}
两个整型交换函数
//void swapInt(int &a,int &b)
//{
// int temp = a;
// a = b;
// b = temp;
//}
交换两个浮点型函数
//void swapDouble(double &a,double &b)
//{
// double temp = a;
// a = b;
// b = temp;
// } void test01(){cout<<"************test01**********"<<endl<<"***********函数模板*********"<<endl; int a = 10;int b = 20;
// swapInt(a,b);
// cout<<"a = "<<a<<" b = "<<b<<endl;
//
// double c = 1.1;
// double d = 2.2;
// swapDouble(c,d);
// cout<<"c = "<<c<<" d = "<<d<<endl;//函数模板两种使用方法 //1、自动类型推导mySwap(a,b);cout<<"a = "<<a<<" b = "<<b<<endl;//2、显示指定类型mySwap<int>(a,b); cout<<"a = "<<a<<" b = "<<b<<endl;}//1.2.2 函数模板注意事项//注意事项://1、自动类型推导,必须导出一致的数据类型T,才可以使用//2、模板必须要确定出T的数据类型,才可以使用//template <class T>//void func()
// {
// cout<<"func 调用"<<endl;
// }
//调用func()是错误的,必须明确func的数据类型 //1.2.3 函数模板案例
//案例描述:
//利用函数模板封装一个排序的函数。可以对不同类型数组进行排序
//排序规则从大到小,排序算法为选择排序
//分别利用char数组和int数组进行测试 //排序算法
template <typename T>
void mySort(T arr[], int len)
{for(int i = 0;i < len;i++){int max = i;for(int j = i+1; j<len; j++){if(arr[max]<arr[j]) // 此处是max 不是 i,需要实时更新max的值 {max = j;}}if(max!=i){mySwap(arr[i],arr[max]);}}} // 6,432,432,32,32
// i = 0; max = 0 j = 1 32
// i = 1; max = 1 j = 2 432
// i = 2; max = 2 j = 3 432
// i = 3; max = 3 j = 4 max = 4 2
// i = 4; max = 4 j = 5 max = 4 1//打印 template <typename T>void show(T arr[],int len){for(int i = 0; i < len;i++){cout<<arr[i]<<" "; }cout<<endl; }void test02()
{cout<<"************test02**********"<<endl<<"********函数模板测试排序*******"<<endl;char charArr[] = "fdacbeg";int intArr[] = {6,432,432,32,32};int len = sizeof(charArr)/sizeof(charArr[0]);int size = sizeof(intArr)/sizeof(intArr[0]);show(charArr,len);mySort(charArr,len); show(charArr,len); show(intArr,size);mySort(intArr,size); show(intArr,size);
}
//1.2.4 普通函数与函数模板的区别
//普通函数与函数模板区别
//普通函数调用时可以发生自动类型转换(隐式类型转换)
//函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换
//int myAadd(int a, int b)
//{
// return a + b;
// }
// myAadd(10,"c");//不会报错,隐式类型转换,转为ACI码相加
//template<typename T>
//T myAdd02(T a, T b)
//{
// return a + b;
//}
// myAadd02(10,"c");//会报错,隐式类型不能转换
//1.2.5普通函数与函数模板的调用规则
//调用规则如下:
//1.如果函数模板和普通函数都可以实现,优先调用普通函数
//2.可通过空模板参数列表来强调调用函数模板
//3.函数模板也可以发生重载
//4.如果函数模板可以产生更好的匹配,优先调用函数模板 //void myPrint(int a,int b)
//{
// cout<<"调用的模板"<<endl;
// }
//
//template<class T>
//void myPrint(T a,T b)
//{
// cout<<"调用的模板"<<endl;
//}
//template<class T>
//void myPrint(T a,T b , T c)
//{
// cout<<"调用的重载的模板"<<endl;
//
//void test01()
//{
// int a = 10;
// int b = 20;
//
// myPrint(a,b);//优先调用普通函数
//通过空模板参数列表,强制调用函数模板
// myprint<>(a,b);
// myprint(a,b,c); 函数模板也可以发生重载 //如果函数模板产生更好的匹配,优先调用函数模板
// char c1 = "a";
// char c2 = "b";
// myprint(c1,c2); // 调用的是模板
//}
//1.2.6模板的局限性
//模板的通用并不是万能的
//例如
//如果传入的 a 和 b 是一个数组,就无法实现了
//template<class T>
//void f(T a,T b)
//{
// a = b;
//}
//再例如:
//template<class T>
//void f(T a, T b)
//{
// if(a > b){
//
// }
//}
//在上述代码中,如果T的数据类型传入的是像Person这样的自定义数据类型,也无法正常运行
class person{
public:person(string name,int age){this->myname = name;this->myage = age;}string myname;int myage;
};
template<class T>
bool equals (T &a,T &b)
{if(a == b){return true ;}else{return false;}
}
//利用具体化person的版本实现代码,具体化优先调用
template<>bool equals(person &p1,person &p2){if(p1.myname == p2.myname && p1.myage == p2.myage){return true;}else{return false;}
} void test03()
{cout<<"************test03**********"<<endl<<"********模板的局限性*******"<<endl;int a = 10;int b = 10;int ret = equals (a,b);if(ret){cout<<"a等于b"<<endl; }else{cout<<"a不等于b"<<endl;}
}void test04()
{cout<<"************test04**********"<<endl<<"********模板的局限性*******"<<endl;person p1("tom",10);person p2("tom",10);bool ret = equals(p1,p2);if(ret){cout<<"p1 等于 p2"<<endl; }else{cout<<"p1 不等于 p2"<<endl; }
}
//1.3类模板
//1.3.1类模板语法
//类模板作用:
//建立一个通用类,类中成员 数据类型可以不具体制定,用一个虚拟的类型来代表
//语法:
template<class NameType,class AgeType>
//类
class Person1{public:Person1(NameType name,AgeType age){this->m_Name = name;this->m_age = age;}void showPerson(){cout<<"name:"<<this->m_Name<<" age: "<<this->m_age<<endl;} NameType m_Name;AgeType m_age;
}; void test05()
{cout<<"************test05**********"<<endl<<"************类模板************"<<endl;Person1<string, int>p1("孙悟空",999);p1.showPerson();}
//1.3.2类模板与函数模板区别
//类模板与函数模板主要有两点
//1.类模板没有自动类型推导的使用方式
//Person1 p1("孙悟空",999);//错误无法自动类型推导
//2.类模板在模板参数列表中可以有默认参数
//template<class NameType,class AgeType = int>
//Person1<string>p1("孙悟空",999); // 不会报错,有默认参数
//1.3.3类模板中成员函数创建时机
//类模板中成员函数和普通类中成员函数创建时机是有区别的:
//类模板中的成员函数在调用时才创建
class Person2
{public:void showPerson2(){cout<<"person2 show"<<endl; }}; class Person3
{public:void showPerson3(){cout<<"person3 show"<<endl;}
};template<class T>
class Myclass
{public:T obj;void fun1(){obj.showPerson2();}void fun2(){obj.showPerson3();}
};
void test06()
{cout<<"************test06**********"<<endl<<"********类模板的创建时机*******"<<endl;Myclass<Person2> m;m.fun1();//m.fun2(); fun2 报错 ,Person2类只能使用fun1函数 }
//1.3.4类模板对象做函数参数
//三种传入方式:
//1.指定传入的类型 --- 直接显示对象的数据类型
template<class T1,class T2>
class Person4
{public:Person4(T1 name, T2 age){this->m_name = name;this->m_age = age;} void showPerson(){cout<<"姓名:"<<m_name<<" 年龄:"<<m_age<<endl; }T1 m_name;T2 m_age;
}; void printPerson4_0(Person4<string, int>&p) //指定传入的类型
{p.showPerson();
}
//2.参数模板化 ---将对象中的参数变为模板进行传递
template<class T1,class T2>
void printPerson4_1(Person4<T1, T2>&p)
{p.showPerson();
// cout<<"T1的类型为:"<<typeid(T1).name()<<endl; // 查看T1的数据类型
}
//3.整个类模板化 ---将这个对象类型模板化进行传递
template<class T>
void printPerson4_2(T &p)
{p.showPerson();
// cout<<"T1的类型为:"<<typeid(T1).name()<<endl; // 查看T1的数据类型
}
void test07()
{cout<<"************test07**********"<<endl<<"********类模板对象做函数参数*******"<<endl;Person4<string, int>p("天蓬元帅",1999);printPerson4_0(p);printPerson4_1(p);printPerson4_2(p);
}
//1.3.5类模板与继承
//当子类继承的父类是一个类模板时,子类在声明的时候,要指出父类中T的类型
//如果不指定,编译器无法给子类分配内存
//如果想灵活指定出父类中T的类型,子类也需变为类模板
//
//template<class T>
//class Base
//{
// T m;
//};
class Son:public Base //错误,必须要知道父类中的T类型,才能继承给子类
//
//class Son:public Base<int>
//{
//
//};
//
//template<class T1,class T2>
//class Son1:public Base<T2>
//{
// T1 obj;
//};
//Son1<int,char> s; // 调用
//1.3.6 类模板成员函数类外实现
template<class T1,class T2>
class Person5
{public:Person5(T1 name, T2 age);
// {
// this->m_name = name;
// this->m_age = age;
// } void showPerson();
// {
// cout<<"姓名:"<<m_name<<" 年龄:"<<m_age<<endl;
// }T1 m_name;T2 m_age;
};//构造函数内外实现
template<class T1,class T2>
Person5<T1,T2>::Person5(T1 name, T2 age)
{this->m_name = name;this->m_age = age;
}
//成员函数类外实现
template<class T1,class T2>
void Person5<T1,T2>::showPerson()
{cout<<"姓名:"<<m_name<<" 年龄:"<<m_age<<endl;
}
void test08()
{cout<<"************test08**********"<<endl<<"********类模板成员函数类外实现*******"<<endl;Person5<string, int>p("白骨精",999);p.showPerson();
}
//1.3.7类模板分文件编写
//问题:
//类模板中成员函数创建时机是在调用阶段,导致分文件编写时链接不到
//解决:
//解决1.直接包含.cpp源文件
//解决2.将声明和实现写到同一个文件中,并更改后缀名.hpp..hpp是约定的名称,不是特定
//1.3.8类模板与友元
//全局函数类内实现-直接在类内声明友元即可
//全局函数类外实现-需要提前让编译器知道全局函数的存在//类外实现
template<class T1,class T2>
class Person6;template<class T1,class T2>
void printPerson2(Person6<T1,T2>p)
{cout<<"类外实现--姓名:"<<p.m_name<<" 类外实现--年龄:"<<p.m_age<<endl;
} template<class T1,class T2>
class Person6
{//全局函数,类内实现friend void printPerson(Person6<T1,T2>p){cout<<"类内实现--姓名:"<<p.m_name<<" 类内实现--年龄:"<<p.m_age<<endl;;} //全局函数 类外实现//加空模板参数列表//如果全局函数是类外实现,需要让编译器提前知道这个函数的存在 friend void printPerson2<>(Person6<T1, T2> p);
public:Person6(T1 name,T2 age){this->m_name = name;this->m_age = age;}
private:T1 m_name;T2 m_age; }; void test09(){cout<<"************test09**********"<<endl<<"********全局函数类内实现*******"<<endl;Person6<string, int>p("张飞",456);printPerson(p);Person6<string, int>p1("曹操",736);printPerson2<>(p1); }int main(){test01();cout<<endl;test02(); cout<<endl;test03();cout<<endl;test04();cout<<endl;test05();cout<<endl;test06();cout<<endl;test07();cout<<endl;test08();cout<<endl;test09();cout<<endl;system("pause");return 0;}
相关文章:
c++学习 文件操作,模板
文件操作 #include<iostream> #include<string> #include<fstream> using namespace std; //文本操作 //程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放 //通过文件可以数据持久化 //c中对文件操作包含头文件<fstream> /…...
开源与在线 M3U8 Downloader 项目介绍及使用指南
M3U8 是一种用于播放列表格式的文件类型,广泛应用于流媒体服务中,特别是 HLS(HTTP Live Streaming)协议。它包含了一系列的 TS(Transport Stream)视频片段地址,使得视频能够分段加载,…...
正则表达式与文本处理器
正则表达式 基础正大表达式 查看特定字符 grep grep-n the test.txt grep-in the test.txt-n 显示行号 -i 不区分大小写 -v 反转查找 [] :中括号里可以写元素,内容符合任意元素,就会过滤出来 ^ :写在中括号里,代表取反。以^开头&…...
RedisTemplate方法一览表
数据类型RedisTemplate 方法Redis命令解释应用场景stringopsForValue().set(key, value)SET设置存储在指定 key 下的值存储简单数据,如用户的设置、配置项opsForValue().get(key)GET获取存储在指定 key 下的值读取存储的数据,如用户信息、配置参数opsFor…...
个人对devops的一点见解
DevOps 是一种将开发(Development)和运维(Operations)相结合的理念和实践方法。 它强调打破开发团队和运维团队之间的传统壁垒,促进两个团队之间更紧密的协作和沟通,以实现更高效、更快速、更可靠的软件交付…...
HarmonyOS鸿蒙应用开发基础知识
参考 HarmonyOS鸿蒙应用开发 (二、应用程序包结构理解及Ability的跳转,与Android的对比)_hap(harmonyos ability package)包的开发-CSDN博客 HarmonyOS NEXT下一代编程语言仓颉介绍及入门-CSDN博客...
Halcon 根据霍夫变换在图像中寻找直线
一 霍夫变换 1 定义 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一.几何形状包括圆,椭圆,直线等等. 2 直线方程 直线的方程可以用yk*xb 来表示,其中k和b是参数,分别是斜率和截距; 3 霍夫变换原理: 设…...
基于Openmv的追小球的云台
介绍 在这篇文章,我会先介绍需要用到且需要注意的函数,之后再给出整体代码 在追小球的云台中,比较重要的部分就是云台(实质上就是舵机)的控制以及对识别的色块位置进行处理得到相应信息后控制云台进行运动 1、舵机模…...
关于scrapy模块中setting.py文件的介绍
作用 在Scrapy框架中,settings.py 文件起着非常重要的作用,它用于配置和控制整个Scrapy爬虫项目的行为、性能和功能。 setting.py文件的介绍 # Scrapy settings for haodaifu project # # For simplicity, this file contains only settings consider…...
laravel Blade 指令的趣味性
首先,我们通过几个要点来解释 Blade 引擎的工作原理。 您选择一个 Blade 模板进行渲染。引擎使用一系列正则表达式来解析和编译模板。该引擎生成一个普通的 PHP 文件并将其写入磁盘(以便将其缓存以供将来渲染)。包含 PHP 文件并使用输出缓冲…...
【面试题】等保(等级保护)的工作流程
等保(等级保护)的工作流程主要包括以下几个步骤,以下将详细分点介绍: 系统定级: 确定定级对象:根据《信息系统等级保护管理办法》和《信息系统等级保护定级指南》的要求,确定需要进行等级保护的…...
python调用麦克风和扬声器,并调用阿里云实时语音转文字
import time import queue import sounddevice as sd import numpy as np import nls import sys# 阿里云配置信息 URL "wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1" TOKEN "XXXX" # 参考https://help.aliyun.com/document_detail/450255.html获…...
描述在React中集成第三方库(如Redux或React Router)的常见模式。
在React中集成第三方库,如状态管理库Redux或路由库React Router,通常遵循一些常见的模式和最佳实践。下面是一些集成这些库的步骤和模式: 集成Redux 安装Redux及相关包: 安装Redux及其中间件(如redux-thunk或redux-saga…...
JavaScript语法特性篇-空值合并运算符(??)
1、基本使用 空值合并运算符(??)英文名称为 Nullish coalescing operator,是一个逻辑运算符。 特性:当左侧的操作数为 null 或者 undefined 时,返回其右侧操作数,否则返回左侧操作数。 const foo nul…...
rancher快照备份至S3
巧用rancher的S3快照备份功能,快速实现集群复制、集群转移、完全崩溃后的极限修复 1.进入集群管理,在对应的集群菜单后,点击编辑配置 2.选择ETCD,启用,Backup Snapshots to S3选项 并填入你的minio 3 配置成功后 手…...
ChatGPT API教程在线对接OpenAI APIKey技术教程
一、OpenAI基本库介绍 您可以通过 HTTP 请求与 API 进行交互,这可以通过任何编程语言实现。我们提供官方的 Python 绑定、官方的 Node.js 库,以及由社区维护的库。 要安装官方的 Python 绑定,请运行以下命令: pip install open…...
随心而遇,跟着感觉走
分数限制下,选好专业还是选好学校? 24年高考结束,很多学生犹豫选择专业还是好学校,我的建议是,选择好学校。 本人体验来说,电子,工地,计科,数学,工科相关的…...
LeetCode题练习与总结:只出现一次的数字--136
一、题目描述 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 示例 1 : …...
常见的中间件都在解决什么问题?
常见的中间件都在解决什么问题 RocketMQ RocketMQ 是一款功能强大的分布式消息系统。 RocketMQ 源码地址:https://github.com/apache/rocketmq(opens new window) RocketMQ 官方网站:https://rocketmq.apache.org 什么场景下用 RocketMQ?…...
微信小程序-scroll-view实现上拉加载和下拉刷新
一.scroll-view实现上拉加载 scroll-view组件通过自身一些属性实现上拉加载的功能。 lower-threshold“100"属性表示距离底部多少px就会实现触发下拉加载的事件。 类似于在.json文件里面配置"onReachBottomDistance”: 100 bindscrolltolower"getMore"属…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
