【C++】IO流
目录
- 一、C语言的输入与输出
- 二、流是什么
- 三、C++IO流
- 3.1 C++标准IO流
- 3.2 C++文件IO流
- 3.2.1 二进制读写
- 3.2.2 文本读写
- 四、stringstream的简单介绍
- 结尾
一、C语言的输入与输出
C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据,并将值存放在变量中。printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。注意宽度输出和精度输出控制。C语言借助了相应的缓冲区来进行输入与输出。如下图所示:
对输入输出缓冲区的理解:
1.可以屏蔽掉低级I/O的实现,低级I/O的实现依赖操作系统本身内核的实现,所以如果能够屏蔽这部分的差异,可以很容易写出可移植的程序。
2.可以使用这部分的内容实现“行”读取的行为,对于计算机而言是没有“行”这个概念,有了这部分,就可以定义“行”的概念,然后解析缓冲区的内容,返回一个“行”。
二、流是什么
“流”即是流动的意思,是物质从一处向另一处流动的过程,是对一种有序连续且具有方向性的数据( 其单位可以是bit,byte,packet )的抽象描述。
C++流是指信息从外部输入设备(如键盘)向计算机内部(如内存)输入和从内存向外部输出设备(显示器)输出的过程。这种输入输出的过程被形象的比喻为“流”。
它的特性是:有序连续、具有方向性
为了实现这种流动,C++定义了I/O标准类库,这些每个类都称为流/流类,用以完成某方面的功能
三、C++IO流
C++系统实现了一个庞大的类库,其中ios为基类,其他类都是直接或间接派生自ios类
3.1 C++标准IO流
C++标准库提供了4个全局流对象cin、cout、cerr、clog,使用cout进行标准输出,即数据从内存流向控制台(显示器)。使用cin进行标准输入即数据通过键盘输入到程序中,同时C++标准库还提供了cerr用来进行标准错误的输出,以及clog进行日志的输出,从上图可以看出,cout、cerr、clog是ostream类的三个不同的对象,因此这三个对象现在基本没有区别,只是应用场景不同。
在使用时候必须要包含文件并引入std标准命名空间。
注意:
- cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢用,如果输入错了,必须在回车之前修改,如果回车键按下就无法挽回了。只有把输入缓冲区中的数据取完后,才要求输入新的数据。
- 输入的数据类型必须与要提取的数据类型一致,否则出错。出错只是在流的状态字state中对应位置位,程序继续。
- 空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输入。但如果是字符型和字符串,则空格(ASCII码为32)无法用cin输入,字符串中也不能有空格。回车符也无法读入。
- cin和cout可以直接输入和输出内置类型数据,原因:标准库已经将所有内置类型的输入和输出全部重载了:
- 对于自定义类型,如果要支持cin和cout的标准输入输出,需要对<<和>>进行重载。
- 在线OJ中的输入和输出:
- 对于IO类型的算法,一般都需要循环输入:
- 输出:严格按照题目的要求进行,多一个少一个空格都不行。
- 连续输入时,vs系列编译器下在输入ctrl+Z时结束
#include<iostream>
#include<string>using namespace std;int main()
{// 单个元素循环输入int x = 0;while (cin >> x){// ...}// 多个元素循环输入int a = 0, b = 0, c = 0;while (cin >> a >> b >> c){// ...}// 整行输入string s;while (cin >> s){// ...}return 0;
}
那么为什么这里是什么作为判断条件进行循环的呢?
以前我们学习过能作为循环判断条件的只有 bool值、整形和指针类型,而这里cin的返回值是istream并不属于他们其中的一种,那是因为什么原因呢?
原因是C++设计了一个函数 operator bool 函数,istream的对象调用了operator bool,operator bool调用时如果接收流失败,或者有结束标志,则返回false,所以这里可以做逻辑条件值。
-
istream类型对象转换为逻辑条件判断值
istream& operator>> (int& val); explicit operator bool() const;
https://legacy.cplusplus.com/reference/ios/ios/operator_bool/
下面写一个Date类,并且在类中实现operator bool,如果Date类成员作为判断条件,那么Date类成员会调用operator boo l转换为 bool。
class Date
{
public:friend istream& operator>>(istream& in, Date& date);friend ostream& operator<<(ostream& out, const Date& date);public:Date(int year = 2000, int month = 1 , int day = 1):_year(year),_month(month),_day(day){}Date(const Date& date){if (this != &date){_year = date._year;_month = date._month;_day = date._day;}}// 这里认为year<2000作为循环判断失败条件operator bool(){if (_year < 2000)return false;elsereturn true;}private:int _year;int _month;int _day;
};istream& operator>>(istream& in, Date& date)
{in >> date._year >> date._month >> date._day;return in;
}ostream& operator<<(ostream& out, const Date& date)
{out << date._year << " " << date._month << " " << date._day << endl;return out;
}int main()
{Date date;// 由于Date类中定义了operator bool// 那么作为循环判断条件时,date可以调用operator bool转换为boolwhile (date){cin >> date;cout << date;}return 0;
}
既然上面提到了类对象可以通过operator bool函数将类对象转化为bool类型,那么下面整体讲一下类型转换。
类型转换:
-
内置类型之间,相近类型可以相互转换
int main() {int i = 520;double d = 13.14;cout << "i:" << i << " d:" << d << endl;i = d;cout << "i:" << i << " d:" << d << endl;d = i;cout << "i:" << i << " d:" << d << endl;return 0; }
-
构造函数,若有其他类型想转换为当前自定义类型可以通过构造函数实现。
自定义类型 <-- 内置类型
自定义类型 <-- 自定义类型
class A { public:A(int i){// ...} };class B { public:B(const A& a){// ...} };int main() {// 自定义类型 <-- 内置类型int i = 520;A a = 1;string s = "I Love Y";// 自定义类型 <-- 自定义类型B b = b;string ss;string::const_iterator it = ss.begin();return 0; }
-
operator type() 可以实现
内置类型 <-- 自定义类型
class Convert { public:operator int(){// ...return 520;} };int main() {// 内置类型 <-- 自定义类型Convert con;int i = con;return 0; }
3.2 C++文件IO流
C++根据文件内容的数据格式分为二进制文件和文本文件。采用文件流对象操作文件的一般步骤:
- 定义一个文件流对象
ifstream ifile(只输入用)
ofstream ofile(只输出用)
fstream iofile(既输入又输出用) - 使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系
- 使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写
- 关闭文件
3.2.1 二进制读写
class Date
{
public:friend istream& operator>>(istream& in, Date& date);friend ostream& operator<<(ostream& out, const Date& date);public:Date(int year = 2000, int month = 1 , int day = 1):_year(year),_month(month),_day(day){}Date(const Date& date){if (this != &date){_year = date._year;_month = date._month;_day = date._day;}}// 这里认为year<2000作为循环判断失败条件operator bool(){if (_year < 2000)return false;elsereturn true;}private:int _year;int _month;int _day;
};istream& operator>>(istream& in, Date& date)
{in >> date._year >> date._month >> date._day;return in;
}ostream& operator<<(ostream& out, const Date& date)
{out << date._year << " " << date._month << " " << date._day << endl;return out;
}struct ServerInfo
{char _address[32];double _x;Date _date;
};// 二进制读写
class BinIO
{
public:BinIO(const char* filename = "info.txt"):_filename(filename){}void Write(const ServerInfo& winfo){ofstream ofs(_filename, ofstream::out | ofstream::binary);ofs.write((char*)&winfo,sizeof(winfo));}void Read(ServerInfo& rinfo){ifstream ifs(_filename, ifstream::in | ifstream::binary);ifs.read((char*)&rinfo, sizeof(rinfo));}
private:string _filename;
};// 写
int main()
{ServerInfo sinfo = { "192.128.64.32", 3.14, { 1949,10,1 } };BinIO BIO;BIO.Write(sinfo);return 0;
} 读
//int main()
//{
// ServerInfo sinfo;
//
// BinIO BIO;
//
// BIO.Read(sinfo);
//
// return 0;
//}
这里提一个很多初学者可能犯的错误,那就是在结构体 ServerInfo 中,不使用char*
而使用string
,会出现什么问题呢?我们使用代码展示一下。
我们会发现写入文件时没有问题,但是读入内存中访问时程序崩溃了,其他的都读进去了,只有string读入有问题,为什么呢?从string的底层和操作系统的内存管理入手,string是如何存字符串的呢?
string中存储的_str,_capacity和_size,当把string以二进制的方式写进文件时,是将_str,_capacity和_size写入文件,而并未将string存储的字符串写入文件,那么以二进制读的方式读进内存中时,也是直接将_str,_capacity和_size读进内存,而写和读是两个进程,当写结束时,string中_str指向的内容会被销毁,当读时会将原来的_str读进来,而原来的空间已经被销毁了,那么这里的_str就是野指针,访问就会使程序崩溃。
上面是将读和写分为两个进程,那么将读和写写入一个进程会怎么样呢?
通过上面的图片可以发现,string的读写没什么问题,但是程序还是崩溃了,为什么呢?因为这里存在string浅拷贝的问题,析构时析构了两次导致了程序的崩溃。但是我们一般在使用的时候,读写不会在同一个进程。
在使用二进制读写时,不要使用容器,如果要使用容器就要使用下面的文本读写。
二进制读写有一个很大的问题,就是写进去的内容看不见可能是乱码。
3.2.2 文本读写
文本读写与二进制读写相比的难在将所有需要写入的数据转换为字节流,字节流可以通过字符串转换而来,那么这里的问题可以转化为将所有需要写入的数据转换为字符串。还是以结构体 ServerInfo 举例,ServerInfo中的string类型的数据可以使用c_str直接取到字符串,ServerInfo中的double类型的数据可以使用to_string转换为字符串,那么ServerInfo中的Date类型怎么处理呢?我们可以自己设计一个函数,将Date类型中的数据全部使用to_string转换为字符串再组合返回。
但是C++中有更为方便的方法,那就是使用ostream对象调用operator<<函数将数据写入到文件中,而这里的operator<<
只有参数为内置类型时才能使用,如果有自定义类型应该怎么办呢?我们可以在自定义类型的类中重载一个operator<<
,那么在写自定义类型数据时就可以调用它的operator<<
将数据写入文件中了。同理,如果想要将文件中的内容读出来,就使用operator>>函数将数据读出,若有自定义类型,在自定义类型的类中重载一个operator<<
函数。
顺便提一下,如果在纯C语言的情况下,也需要将数据转换为字节流,也可以说是转换为字符串,C语言中int类型可以使用itoa函数将int类型转换为字符串,那么如果是double类型呢?可能会有人想不到如何转换为double,其实很简单,C语言中有这么一个函数sprintf函数,可以将任意内置类型的数据转化为字符串,相比于itoa函数,使用sprintf函数会更好用一些。
class Date
{
public:friend istream& operator>>(istream& in, Date& date);friend ostream& operator<<(ostream& out, const Date& date);public:Date(int year = 2000, int month = 1, int day = 1):_year(year), _month(month), _day(day){}Date(const Date& date){if (this != &date){_year = date._year;_month = date._month;_day = date._day;}}// 这里认为year<2000作为循环判断失败条件operator bool(){if (_year < 2000)return false;elsereturn true;}private:int _year;int _month;int _day;
};istream& operator>>(istream& in, Date& date)
{in >> date._year >> date._month >> date._day;return in;
}ostream& operator<<(ostream& out, const Date& date)
{out << date._year << " " << date._month << " " << date._day << endl;return out;
}struct ServerInfo
{string _address;double _x;Date _date;
};// 文本读写
class TestIO
{
public:TestIO(const char* filename = "info2.txt"):_filename(filename){}void Write(const ServerInfo& winfo){// 覆盖写ofstream ofs(_filename);ofs << winfo._address << endl;ofs << winfo._x << endl;ofs << winfo._date << endl;}void Read(ServerInfo& rinfo){ifstream ifs(_filename);ifs >> rinfo._address;ifs >> rinfo._x;ifs >> rinfo._date;}
private:string _filename;
}; 写
//int main()
//{
// ServerInfo sinfo = { "https://blog.csdn.net/qq_55401402?spm=1011.2415.3001.5343",
// 3.14, { 1949,10,1 } };
//
// TestIO TIO;
//
// TIO.Write(sinfo);
//
// return 0;
//}// 读
int main()
{ServerInfo sinfo;TestIO TIO;TIO.Read(sinfo);cout << sinfo._address << endl;cout << sinfo._x << endl;cout << sinfo._date << endl;return 0;
}
四、stringstream的简单介绍
在C语言中,如果想要将一个整形变量的数据转化为字符串格式,如何去做?
- 使用itoa()函数
- 使用sprintf()函数
但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。
在C++中,可以使用stringstream类对象来避开此问题。
在程序中如果想要使用stringstream,必须要包含头文件。在该头文件下,标准库三个类:istringstream、ostringstream 和 stringstream,分别用来进行流的输入、输出和输入输出操作,本文主要介绍stringstream。
stringstream主要可以用来:
- 将数值类型数据格式化为字符串
#include<sstream>using namespace std;int main()
{int a = 12345678;string s;// 将一个整形变量转化为字符串,存储到string类对象中stringstream ss;ss << a;ss >> s;cout << ss.str() << endl;// clear()// 注意多次转换时,必须使用clear将上次转换状态清空掉// stringstreams在转换结尾时(即最后一个转换后),会将其内部状态设置为badbit// 因此下一次转换是必须调用clear()将状态重置为goodbit才可以转换// 但是clear()不会将stringstreams底层字符串清空掉// s.str("");// 将stringstream底层管理string对象设置成"",// 否则多次转换时,会将结果全部累积在底层stringss.clear(); // 清空s, 不清空会转化失败ss.str("");double d = 12.34;ss << d;ss >> a;string sValue;sValue = ss.str(); // str()方法:返回stringsteam中管理的string类型cout << sValue << endl;return 0;
}
- 字符串拼接
int main()
{stringstream sstream;// 将多个字符串放入 sstream 中sstream << "first" << " " << "string,";sstream << " second string";cout << "strResult is: " << sstream.str() << endl;// 清空 sstreamsstream.str("");sstream << "third string";cout << "After clear, strResult is: " << sstream.str() << endl;return 0;
}
- 序列化和反序列化结构数据
序列化:将各种信息转换成字符串
反序列化:将字符串中的信息提取出来转换为内存数据
#include<sstream>using namespace std;class Date
{
public:friend istream& operator>>(istream& in, Date& date);friend ostream& operator<<(ostream& out, const Date& date);public:Date(int year = 2000, int month = 1, int day = 1):_year(year), _month(month), _day(day){}Date(const Date& date){if (this != &date){_year = date._year;_month = date._month;_day = date._day;}}// 这里认为year<2000作为循环判断失败条件operator bool(){if (_year < 2000)return false;elsereturn true;}private:int _year;int _month;int _day;
};istream& operator>>(istream& in, Date& date)
{in >> date._year >> date._month >> date._day;return in;
}ostream& operator<<(ostream& out, const Date& date)
{out << date._year << " " << date._month << " " << date._day;return out;
}struct ChatInfo
{string _name; // 名字int _id; // idDate _date; // 时间string _msg; // 聊天信息
};int main()
{// 结构信息序列化为字符串ChatInfo winfo = { "张德帅", 1314520, { 2024, 6, 10 }, "出来耍"};ostringstream oss;oss << winfo._name << endl;oss << winfo._id << endl;oss << winfo._date << endl;oss << winfo._msg << endl;string str = oss.str();cout << str << endl ;// 我们通过网络这个字符串发送给对象,实际开发中,信息相对更复杂,// 一般会选用Json、xml等方式进行更好的支持// 字符串解析成结构信息ChatInfo rInfo;istringstream iss(str);iss >> rInfo._name >> rInfo._id >> rInfo._date >> rInfo._msg;cout << "-------------------------------------------------------"<< endl;cout << rInfo._name << ' ';cout << rInfo._date << endl;cout << ":>" << rInfo._msg << endl;cout << "-------------------------------------------------------"<< endl;return 0;
}
注意:
- stringstream实际是在其底层维护了一个string类型的对象用来保存结果。
- 多次数据类型转化时,一定要用clear()来清空,才能正确转化,但clear()不会将stringstream底层的string对象清空。
- 可以使用s. str(“”)方法将底层string对象设置为""空字符串。
- 可以使用s.str()将让stringstream返回其底层的string对象。
- stringstream使用string类对象代替字符数组,可以避免缓冲区溢出的危险,而且其会对参数类型进行推演,不需要格式化控制,也不会出现格式化失败的风险,因此使用更方便,更安全。
结尾
如果有什么建议和疑问,或是有什么错误,大家可以在评论区中提出。
希望大家以后也能和我一起进步!!🌹🌹
如果这篇文章对你有用的话,希望大家给一个三连支持一下!!🌹🌹
相关文章:
【C++】IO流
目录 一、C语言的输入与输出二、流是什么三、CIO流3.1 C标准IO流3.2 C文件IO流3.2.1 二进制读写3.2.2 文本读写 四、stringstream的简单介绍结尾 一、C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据…...
前端知识速记--css篇:CSS3中的常见动画及实现方式
前端知识速记–css篇:CSS3中的常见动画及实现方式 常见的CSS3动画 1. 过渡 (Transitions) 过渡是一种非常简单的动画效果,允许你在元素的状态变更时平滑过渡到新状态。 语法格式: transition: property duration timing-function delay;…...
一个根据输入内容过滤下拉选的组件
1.element的select自定义过滤不是很灵,使用了input和dropdown 组件 <template><div class"autocomplete-wrapper"><!-- 使用 el-input 组件 --><el-inputv-model"inputValue"input"handleInput"placeholder&q…...
Java中的分布式(概念说明)
1. 分布式的基本概念 1.1 什么是分布式系统? 分布式系统(Distributed System):由多台服务器(或节点)协同工作,对外提供一个整体服务。不同节点之间通过网络通信来协同处理请求或共享数据&…...
国产编辑器EverEdit - 上下翻滚不迷路(历史编辑位置、历史光标位置回溯功能)
1 光标位置跳转 1.1 应用场景 某些场景下,用户从当前编辑位置跳转到别的位置查阅信息,如果要快速跳转回之前编辑位置,则可以使用光标跳转相关功能。 1.2 使用方法 1.2.1 上一个编辑位置 跳转到上一个编辑位置,即文本修改过的位…...
css简介
一.css-网页的美容师 css也是一种标记语言,主要用于设置HTML页面中的文本内容(字体大小对齐方式),图片外形(宽高 边框样式 边距等)以及版面的布局和外观显示样式。 二.css语法规范 css规则由两个主要的部分构成:选择器以及一条…...
GoC题解(21) 725.画迷宫(下册第4课)
题目描述 真观察下面迷宫图。发现它是一个边长逐渐变长的15边回旋图,边长依次为10、20、30....。 参考答案 int main(){int len0;for(int i1;i<15;i){ len10;pen.fd(len).rt(90); }return 0; } 解题思路 使用一个变量来记录每次循环时应该画多长的边&#…...
DDD该怎么去落地实现(3)通用的仓库和工厂
通用的仓库和工厂 我有一个梦,就是希望DDD能够成为今后软件研发的主流,越来越多研发团队都转型DDD,采用DDD的设计思想和方法,设计开发软件系统。这个梦想在不久的将来是有可能达成的,因为DDD是软件复杂性的解决之道&a…...
sql sqlserver的特殊函数COALESCE和PIVOT的用法分析
一、COALESCE是一个返回参数中第一个非NULL值的函数, 列如:COALESCE(a,b,c,d,e);可以按照顺序取abcde,中的第一个非空数据,abcde可以是表达式 用case when 加ISNULL也可以实现,但是写法复杂了…...
FPGA简介|结构、组成和应用
Field Programmable Gate Arrays(FPGA,现场可编程逻辑门阵列),是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物, 是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,…...
Vue2/Vue3生命周期对比
Vue2的生命周期钩子 beforeCreate 在实例初始化之后,数据观测(data)和事件配置之前调用。此时无法访问 data、methods 等。 created 在实例创建完成后调用。此时可以访问 data、methods,但 DOM 还未生成。 beforeMount 在挂载…...
Spring Boot 携手 DeepSeek:开启智能交互新时代
前言 在当今数字化浪潮汹涌澎湃的时代,人工智能技术正以前所未有的速度改变着我们的生活和工作方式。大语言模型作为人工智能领域的一颗璀璨明星,凭借其强大的自然语言处理能力,为各个行业带来了新的发展机遇。DeepSeek 作为一款性能卓越的大语言模型,以其高效、准确的文本…...
【Elasticsearch】Mapping概述
以下是Elasticsearch中提到的关于Mapping的各模块概述: --- 1.Dynamic mapping(动态映射) 动态映射是指Elasticsearch在索引文档时,自动检测字段类型并创建字段映射的过程。当你首次索引一个文档时,Elasticsearch会根…...
国内Ubuntu离线安装和配置Ollama服务
以下是在 Ubuntu 22.04 系统上,安装Ollama 的完整安装和配置步骤: 1. 准备工作 确保你具备 root 权限,并安装了必要的工具,如 tar、systemctl 等。 2. 创建 Ollama 用户和组 创建一个专门的 ollama 用户和组来运行 Ollama 服务…...
极狐GitLab 17.8 正式发布,多项 DevOps 重点功能解读【二】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...
【开源免费】基于Vue和SpringBoot的旅游管理系统(附论文)
本文项目编号 T 229 ,文末自助获取源码 \color{red}{T229,文末自助获取源码} T229,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
Communications link failure异常分析解决
Communications link failure异常分析解决 异常日志分析与解决常见原因解决方法 异常日志 2025-02-05 14:26:58.750 ERROR [aaeae2435a2749ac0c4af65b6e4db68c] [http-nio-9528-exec-6] o.s.t.i.TransactionAspectSupport.completeTransactionAfterThrowing:680 - Application…...
建造者模式构建对象
目录 一、创建类 二、用法 三、完整代码 一、创建类 Builder public class User {private final String name;private final int age;Builder.Default private String address "Unknown";Builder.Default private String email "N/A"; }二、用法 (1…...
2025 (ISC)²CCSP 回忆录
2025.1.20 广州,周一,我一次性通过了CCSP的考试。 为什么要考证? 个人成长所需 职业热情:做一行爱一行,既然我投入了美好的青春年华到网络安全行业当中,那么对于这个行业最有权威的认证,是肯定…...
代码随想录算法训练营第三十九天| 动态规划03
01 背包问题 二维 代码随想录 视频讲解:带你学透0-1背包问题!| 关于背包问题,你不清楚的地方,这里都讲了!| 动态规划经典问题 | 数据结构与算法_哔哩哔哩_bilibili 注意点: 1. dp[i][j] 表示从下标为[0-i]…...
对正则表达式说不!!!
可能大家都会和我一样,时常会遇到正则表达式,有时候会忘记某些字符而苦恼。今天就帮助大家克服它,虽然不多,但我认为掌握这些足够了,万变不离其宗,以不变应万变。 一、正则表达式内容分类 1. 字符类 [abc…...
制作Ubuntu根文件
系列文章目录 Linux内核学习 Linux 知识(1) Linux 知识(2) WSL Ubuntu QEMU 虚拟机 Linux 调试视频 PCIe 与 USB 的补充知识 vscode 使用说明 树莓派 4B 指南 设备驱动畅想 Linux内核子系统 Linux 文件系统挂载 QEMU 通过网络实现…...
工作一个月的经历和总结
目录 背景: 过程: 初来乍到: 小试牛刀: 终结篇: 总结: 背景: 通过朋友介绍,来到秦皇岛戴卡兴龙轮毂有限公司,我的朋友在这已经干了将近2年了,说这里比…...
Linux 更改 SSH 默认端口以提升服务器安全
🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 🌺 仓库主页: GitCode︱ Gitee ︱ Github 💖 欢迎点赞 👍 收藏 ⭐评论 …...
C#中反射的原理介绍及常见的应用场景介绍
反射(Reflection)是C#中的一种机制,允许程序在运行时获取类型信息并动态调用其成员。通过反射,程序可以访问程序集、模块、类型及其成员(如方法、属性、字段等),并能在运行时创建对象、调用方法…...
Linux内核中IPoIB驱动的初始化机制深度解析
IP over InfiniBand(IPoIB)是Linux内核中重要的网络协议,允许在InfiniBand(IB)网络上传输IP数据包,广泛应用于高性能计算和存储场景。本文深入分析IPoIB驱动初始化流程,探讨其核心设计及关键技术实现。 一、初始化流程概览 IPoIB驱动的初始化通过ipoib_ndo_init函数入口…...
深度学习框架PyTorch
第一章:机器学习基本概念(附代码) 第二章:KNN算法:从思想到实现(附代码) 第三章:决策树算法:从思想到实现(附代码) 第四章:机器学习简…...
TCP可靠传输的ARQ协议
基本知识 ARQ(Automatic Repeat-reQuest)协议主要包含:停等ARQ协议、连续ARQ协议,其中连续ARQ协议是为了解决停等ARQ协议信道利用率低的问题,目前传统的连续ARQ协议有回退N帧ARQ协议、选择性重传ARQ协议。 注意&#…...
Windows环境安装Kafka(集群版)
大家好,最近在准备Java面试,复习到Kafka的相关知识,一时兴起,就想在自己的Windows笔记本上安装一个Kafka集群。下面就记录一下安装步骤。 工具分享 Offset Explorer:Kafka可视化工具 下载地址:https://ww…...
服务器虚拟化(详解)
服务器虚拟化是一种技术,通过将物理服务器的硬件资源(如CPU、内存、存储、网络等)抽象化并分割成多个虚拟机(VM),每个虚拟机可以独立运行不同的操作系统和应用程序。虚拟化使得资源使用更加高效,…...
今日写题work05
题目:用队列实现栈 思路 队列的特点是先进先出,而栈的特点是后进先出。所以想要用队列实现模拟栈,我们可以使用两个队列,一个队列负责压栈,一个队列负责出栈。压栈很简单就是检空再调用队列的push就好,那出…...
DeepSeek模型架构及优化内容
DeepSeek v1版本 模型结构 DeepSeek LLM基本上遵循LLaMA的设计: 采⽤Pre-Norm结构,并使⽤RMSNorm函数. 利⽤SwiGLU作为Feed-Forward Network(FFN)的激活函数,中间层维度为8/3. 去除绝对位置编码,采⽤了…...
145,【5】 buuctf web [GWCTF 2019]mypassword
进入靶场 修改了url后才到了注册页面 注测后再登录 查看源码 都点进去看看 有个反馈页面 再查看源码 又有收获 // 检查$feedback是否为数组 if (is_array($feedback)) {// 如果是数组,弹出提示框提示反馈不合法echo "<script>alert(反馈不合法);<…...
Beszel监控Docker安装
一、Beszel Hub安装 #Beszel Hub安装 mkdir -p ./beszel_data && \ docker run -d \--name beszel \--restartunless-stopped \-v ./beszel_data:/beszel_data \-p 8090:8090 \henrygd/beszel#创建账号 账号/密码:adminadmin.com/adminadmin.com 二、Besz…...
Ansible批量配置服务器免密登录步骤详解
一、准备工作 192.168.85.138 安装ansible,计划配置到139的免密 192.168.85.139 待配置免密 1. 生成SSH密钥对 在Ansible控制节点生成密钥对,用于后续免密认证: ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa 全部回车默认,无…...
使用llama.cpp在gpu和cpu上运行deepseek-r1 7b的性能对比
使用deepseek-r1 7b模型的q5km量化版本进行测试, gpu上的token解码速度是cpu的近8倍. 测试环境: ubuntu22.04 x86llama.cpp cpu intel 10750h 4.41 tokens / s model size params backend threads test t/s qwen2 7B Q5_K - Medium 5.07 GiB 7.62 B CPU 6 pp512 …...
1.【BUUCTF】[SUCTF 2019]EasyWeb
进入题目页面如下 给出源码开始代码审计 <?php // 定义一个名为 get_the_flag 的函数,该函数主要处理文件上传逻辑 function get_the_flag(){// 构造用户上传文件的目录,目录名是 "upload/tmp_" 加上客户端 IP 地址的 MD5 哈希值$userdir…...
GMSL 实例1:当 MAX96717 遇上 MAX96724,打通 Camera 视频数据传输
新年伊始,继 Deepseek 在 AI 圈掀起风波之后。比亚迪在2月10日发布会上重磅官宣:全系车型将搭载自研的高阶智驾系统“天神之眼”,覆盖从10万元级入门车型到高端豪华车型的所有范围。此举如一颗重磅炸弹投向当前一卷再卷的新能源汽车赛道&…...
2025有哪些关键词优化工具好用
越来越多的企业和个人开始意识到搜索引擎优化(SEO)对于网站曝光和业务增长的重要性。在SEO优化的过程中,关键词优化占据着至关重要的地位。关键词是用户在搜索引擎中输入的词语,优化关键词有助于提高网站在搜索结果中的排名&#…...
Python常见面试题的详解6
1. 按字典 value 值排序 要点:对于给定字典,使用 sorted() 函数结合 items() 方法,依据 value 进行排序,也可以定义一个通用函数,支持按 value 升序或降序排序。示例: python d {a: 1, b: 2, c: 3, d: …...
宝塔和docker的区别
宝塔面板 vs Docker:区别、场景与互补使用指南 eepseek回答宝塔和docker的区别 好的,我现在需要回答用户关于宝塔面板和Docker之间的区别的问题。首先,我需要明确这两个工具各自的定义、功能以及它们适用的场景,这样才能准确比较…...
vscode调试redis
系统:ubuntu redis:redis-6.0.3 1.在vs中安装c/c编译插件 2.用vscode打开redis-6.0.3 3.在菜单中找到run->Add Configuration… 4.会在目录中生成一个./vscode目录,里面包含launch.json,修改launch.json中的program:${workspaceFolder}…...
tcp/ip协议设置参数,tcp/ip协议6设置
TCP/IP协议设置参数主要涉及到IP地址、子网掩码、网关地址以及DNS服务器地址等关键参数。这些参数的配置确保了网络设备能够正确地接入互联网并与其他设备进行通信。以下是对这些参数设置的详细说明: 1. IP地址 定义:IP地址是互联网中用于唯一标识每一…...
计算机网络原理试题二
一、单选 1.(单选题,5分)以下关于计算机网络定义的描述中,错误的是 A.以能够相互共享资源的方式互联起来的自治计算机系统的集合 B.计算机资源主要指计算机的CPU、内存和操作系统 C.互联的计算机既可以联网工作,也可以脱网单机工作 D.联网计算机之间的通信必须遵循…...
#渗透测试#批量漏洞挖掘#致远互联AnalyticsCloud 分析云 任意文件读取
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...
企业文件共享中的权限管理与安全风险防范
在企业的日常运营中,文件共享是必不可少的一项工作。然而,文件共享过程中如果权限管理不当,极易引发安全风险,导致企业敏感信息泄露。因此,加强文件共享中的权限管理与安全风险防范,对于保障企业信息安全至…...
2025智能硬件售后服务管理系统选择的六大标准
2025智能硬件售后服务管理系统选择的六大标准 随着2025年的到来,智能硬件行业正以前所未有的速度发展,产品迭代加速,用户需求日益多样化。在这一背景下,售后服务管理系统的选择成为了智能硬件厂商能否在激烈的市场竞争中脱颖而出…...
C++ references
C复杂在于提供了太多的内存模型 或者说: 提供了两种东西: 1、可以放对象的地方: 堆栈堆全局数据区里 2、提供了很多访问对象的方式 变量是对象指针访问对象引用来访问对象 3 * 3 9 种访问对象的方式 规则 引用一般初始化࿰…...
STM32 RCC功能说明 复位和时钟控制RCC
目录 背景 RCC配置时钟主要涉及两方面 程序 第1步、RCC默认初始化 第2步、等待HSE工作稳定 第3步、设置PLL时钟源以及倍频数 第4步、设置AHB总线时钟(HCLK) 第5步、设置PCLK1(APB1总线) 第6步、设置PCLK2(APB2总线) 第7步、FLASH存储器的配置 …...
2024年终总结和2025年规划
2024年的主线是AI基础的学习和读书,虽然AI学习花费了更多的时间,但是读书长久看来于我是更重要的事情,哈哈哈,因此先简单回顾一下读书记忆,回顾我的2024,再展望一下我的2025. 我的2024年记忆 读万卷书&am…...