【C++学习】 IO 流揭秘:高效数据读写的最佳实践
✨ 今朝有酒今朝醉,明日愁来明日愁 🌏
📃个人主页:island1314
🔥个人专栏:C++学习
⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞
引言:
🚀C++ IO 流(输入输出流)是一种用于处理数据流的机制,允许程序读取和写入数据。它包括
- 标准输入流 (
std::cin
) - 标准输出流 (
std::cout
) - 标准错误流 (
std::cerr
) - 文件流 (
std::ifstream
和std::ofstream
)。
🔥🔥🔥 这些流对象利用流类(如 istream
和 ostream
)进行数据的读取和写入,同时支持各种格式化操作和错误处理。
1. C语言的输入与输出
🥝 C语言中我们用到的最频繁的输入输出方式就是 scanf ( ) 与 printf ( )。
- scanf() : 从标准输入设备(键盘)读取数据,并将值存放在变量中。
- printf() : 将指定的文字/字符串输出到标准输出设备(屏幕)。
💢注:对宽度输出和精度输出控制。C语言借助了相应的缓冲区来进行输入与输出。
如下图所示:
🔥下面来看下对输入输出缓冲区的理解:
- 可以屏蔽掉低级 I/O 的实现,低级I/O的实现依赖操作系统本身内核的实现,所以如果能够屏蔽这部分的差异,可以很容易写出可移植的程序。
- 可以使用这部分的内容实现 “行” 读取的行为,对于计算机而言是没有 “行” 这个概念,有了这部分,就可以定义“行”的概念,然后解析缓冲区的内容,返回一个“行”。
💢总的来说:在 C++ 中,输入输出缓冲区用于优化数据的读取和写入操作。对于输出流,数据首先被写入缓冲区,然后才实际写入目标设备(如屏幕或文件),这样可以减少每次操作的系统调用次数。对于输入流,数据先从设备读取到缓冲区,再从缓冲区提供给程序。这种机制可以提高效率,但有时可能需要手动刷新缓冲区(如使用
std::flush
)或处理缓冲区的状态(如检查流是否处于良好状态)。
2. 流是什么?
从语言文字层面来看:
- “流” 即是流动的意思,是物质从一处向另一处流动的过程,是对一种有序连续且具有方向性的数据 ( 其单位可以是bit,byte,packet ) 的抽象描述。
💢而在 C++ 标准输入输出库中,流(stream)指的是一种用于处理数据输入和输出的机制。具体来说,它指信息从外部输入设备(如键盘)向计算机内部(如内存)输入和从内存向外部输出设备(显示器)输出的过程。这种输入输出的过程被形象的比喻为“流”。
🐛 它的特性是:有序连续、具有方向性
为了实现这种流动, C++定义了 I/O 标准类库,这些每个类都称为流/流类,用以完成某方面的功能
3. C++ ios类
3.1 概念
🍐 ios_base 类是基类,ios类 继承了 ios_base。通过 ios又分别设置了两个子类istream 和 ostream 。这两个类分别都有一个实例对象 cin和 cout!此外ostream还要标准错误cerr和日志输出clog。除了标准IO外,istream 和 ostream 还有子类,文件流和string流,来提供特殊的使用!
C++ 的 I/O 流主要包括以下几类:
-
输入流:
std::istream
:基本输入流类。std::ifstream
:用于从文件读取数据。std::istringstream
:用于从字符串读取数据。std::cin
:标准输入流,通常与键盘交互。
-
输出流:
std::ostream
:基本输出流类。std::ofstream
:用于向文件写入数据。std::ostringstream
:用于向字符串写入数据。std::cout
:标准输出流,通常用于屏幕显示。
-
双向流:
std::iostream
:继承了std::istream
和std::ostream
,用于同时进行输入和输出操作。std::fstream
:用于在文件中同时进行读写操作。std::stringstream
:提供了在内存中进行读写操作的能力。
-
错误和日志流:
std::cerr
:标准错误流,用于输出错误信息。std::clog
:标准日志流,用于输出日志信息。
这些流对象都定义在 <iostream>
、<fstream>
和 <sstream>
头文件中。
📆 其中值得注意的是 cerr、clog 是很少用的,它们本来是用做 错误输出 和 日志输出 的,但是因为 cout 也能做到,所以这两个很少被使用。
3.2 ios类及派生类
🍌C++系统实现了一个庞大的类库,其中ios为基类,其他类都是直接或间接派生自ios类
-
<ios>:
ios
类是所有输入输出流类的基类,提供了流的基本功能,如流状态标志、格式设置、同步等。- 主要功能包括流状态标志(如
failbit
、eofbit
)、流的格式设置(如precision
、width
)、同步机制等。
-
<iostream>:
iostream
是从ios
类派生出来的,结合了输入和输出流的功能。- 它通过包含
istream
和ostream
来实现输入和输出的功能。
-
<istream>:
istream
类用于输入流操作,负责从输入设备(如键盘、文件)读取数据。- 它是
ios
的派生类,并扩展了输入操作的功能。
-
<ostream>:
ostream
类用于输出流操作,负责将数据写入输出设备(如屏幕、文件)。- 它也是
ios
的派生类,并扩展了输出操作的功能。
-
<ifstream> 和 <ofstream> :
ifstream
(输入文件流)和ofstream
(输出文件流)是istream
和ostream
的派生类,分别用于从文件读取数据和向文件写入数据。- 这些类提供了文件流的特定功能,并继承了
ios
和istream
/ostream
的基本功能。
-
<fstream>:
fstream
类结合了ifstream
和ofstream
的功能,支持通过流的方式来读写文件。提供了对文件的输入和输出操作。- 它是
iostream
的一个派生类,用于处理文件的读写操作。
-
<sstream>:
- 对于 stringsream:字符串常用这个
- 用来支持字符串的序列化与反序列化,多用于网络,与流关系不大
3.3 主要功能
-
流状态:
ios
提供了流状态的管理功能,比如检测输入输出操作是否成功(goodbit
)、是否遇到错误(failbit
)、是否到达文件末尾(eofbit
)。 -
格式设置:
ios
允许设置和查询流的格式,包括数字的精度、宽度、对齐方式等。 -
同步:
ios
支持流的同步机制,确保多线程环境下流操作的安全性。
3.4 案例代码
🌰下面是一个简单的示例,展示了如何使用这些流类:
#include <iostream>
#include <fstream>int main() {// 输出到标准输出流std::cout << "Hello, World!" << std::endl;// 从标准输入流读取数据int number;std::cout << "Enter a number: ";std::cin >> number;// 输出到文件流std::ofstream outFile("example.txt");if (outFile.is_open()) {outFile << "The number is: " << number << std::endl;outFile.close();}else {std::cerr << "Failed to open file." << std::endl;}return 0;
}
在这个示例中:
std::cout
是ostream
类的一个实例,用于输出数据到屏幕。std::cin
是istream
类的一个实例,用于从标准输入读取数据。std::ofstream
是ostream
的派生类,用于将数据写入文件。
总的来说:
🍅ios
是 C++ 流库中的核心类,提供了流的基本功能和状态管理。istream
和 ostream
继承自 ios
,分别处理输入和输出,而 ifstream
、ofstream
和 fstream
进一步扩展了对文件的输入输出操作。
4. C++ 标准 IO 流(istream)
🍐C++标准库提供了4个全局流对象cin、cout、cerr、clog,使用cout进行标准输出,即数据从内存流向控制台(显示器)。使用cin进行标准输入即数据通过键盘输入到程序中,同时C++标准库还提供了cerr用来进行标准错误的输出,以及clog进行日志的输出,从上图可以看出:cout、cerr、clog是ostream类的三个不同的对象,因此这三个对象现在基本没有区别,只是应用场景不同!
🐛 注: 在使用时候必须要包含文件并引入 std 标准命名空间。
注意:
- cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢用,如果输入错了,必须在回车之前修改,如果回车键按下就无法挽回了。只有把输入缓冲区中的数据取完后,才要求输入新的数据。除此之外, cin 不能重定向。
- cin 输入的数据类型必须与要提取的数据类型一致,否则出错。出错只是在流的状态字state中对应位置位(置1),程序继续。
- 空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输入。但如果是字符型和字符串,则空格(ASCII码为32)无法用cin输入,字符串中也不能有空格。回车符也无法读入。如果想将字符串整行读取,则要使用getline()。
#include<iostream> using namespace std; int main() {// 输入 hello worldstring a;cin >> a;cout << a << endl; // hellocin >> a;cout << a << endl; // worldgetline(cin,a);cout << a << endl;return 0; }
- cin和cout可以直接输入和输出 内置类型数据,原因:标准库已经将所有内置类型的输入和输出全部重载了。
-
对于 自定义类型,如果要支持cin和cout的标准输入输出,需要对<<和>>进行重载。
-
发生错误时,系统需要立即输出以提醒用户,因此错误输出流对象 cerr 不具备缓冲区。
-
在线OJ中的输入和输出:
① 对于IO类型的算法,一般都需要循环输入。
② 输出:严格按照题目的要求进行,多一个少一个空格都不行。
③ 连续输入时,vs系列编译器下在输入ctrl+Z时结束。
④ scanf函数当读取发生错误或读到文件末尾,会返回EOF(-1)。 -
istream类型对象转换为逻辑条件判断值。
istream& operator>> (int& val); explicit operator bool() const;
实际上我们看到使用 while(cin>>i) 去流中提取对象数据时,调用的是operator>>,返回值是istream类型的对象,那么这里可以做逻辑条件值,源自于 istream 的对象又调用了 operator bool,operator bool 调用时如果接收流失败,或者有结束标志,则返回false。
5. C++ 文件 IO 流(fstream)
在C++中,文件输入输出(I/O)流是处理文件读写操作的关键。标准库提供了一套灵活的文件流机制,包括输入流(ifstream
)、输出流(ofstream
)以及同时支持输入和输出的流(fstream
)。以下是有关这些类和它们的用法的详细信息。
C++根据文件内容的数据格式分为二进制文件和文本文件。采用文件流对象操作文件的一般步骤如下:
- 定义一个文件流对象:
☑️ifstream(只输入用)
☑️ofstream(只输出用)
☑️fstream(既输入又输出用) (继承了ifstream和ofstream)- 使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系 。open:打开文件,可以设置对应的打开方式和C语言很类似。
- 使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写。关闭文件。
🍋🟩文件流类
1. 🍉ifstream
ifstream(输入文件流)
用于从文件中读取数据。你可以使用它来打开一个文件,并从中读取内容。
常用操作:
- 打开文件:通过构造函数或
open()
方法。 - 读取数据:使用
>>
运算符或getline()
方法。 - 检查状态:使用
eof()
,fail()
,bad()
,good()
等方法。 - 关闭文件:使用
close()
方法。
示例:
#include <iostream>
#include <fstream>
#include <string>int main() {std::ifstream inFile("input.txt"); // 打开文件if (!inFile.is_open()) { // 检查文件是否成功打开std::cerr << "Unable to open file for reading" << std::endl;return 1;}std::string line;while (std::getline(inFile, line)) { // 逐行读取std::cout << line << std::endl; // 输出到控制台}inFile.close(); // 关闭文件return 0;
}
2. 🥑ofstream
ofstream(输出文件流)
用于向文件中写入数据。你可以使用它来创建新文件或覆盖现有文件的内容。
常用操作:
- 打开文件:通过构造函数或
open()
方法。 - 写入数据:使用
<<
运算符。 - 关闭文件:使用
close()
方法。
示例:
#include <iostream>
#include <fstream>int main() {std::ofstream outFile("output.txt"); // 打开文件if (!outFile.is_open()) { // 检查文件是否成功打开std::cerr << "Unable to open file for writing" << std::endl;return 1;}outFile << "Hello, World!" << std::endl; // 写入数据outFile << "This is a test." << std::endl;outFile.close(); // 关闭文件return 0;
}
3. 🥝fstream
fstream(文件流)
支持同时读写操作。你可以用它来打开一个文件进行读写操作,而不仅仅是读取或写入。
常用操作:
- 打开文件:通过构造函数或
open()
方法,指定读写模式。 - 读取和写入数据:使用
>>
和<<
运算符。 - 关闭文件:使用
close()
方法。
示例:
#include <iostream>
#include <fstream>
#include <string>int main() {std::fstream file("example.txt", std::ios::in | std::ios::out | std::ios::app); // 打开文件if (!file.is_open()) { // 检查文件是否成功打开std::cerr << "Unable to open file" << std::endl;return 1;}// 写入数据file << "Appending this line to the file." << std::endl;// 重新定位到文件开始file.seekg(0);// 读取数据std::string line;while (std::getline(file, line)) {std::cout << line << std::endl;}file.close(); // 关闭文件return 0;
}
🥬文件模式
🍐在打开文件时,可以使用不同的模式来指定文件的打开方式:(std::ios::打开方式)
打开方式 | 功能 |
---|---|
in | Input mode (输入模式)。以读取模式打开文件用于输入操作。 |
out | Output mode (输出模式)。以写入模式打开文件用于输出操作。如果文件已存在,内容将被截断。 |
app | Append mode (追加模式)。在每次写入时,数据将被追加到文件的末尾,而不是覆盖现有内容 |
binary | Binary mode (二进制模式)。以二进制方式打开文件,不进行任何字符转换。这对于非文本文件(如图像或可执行文件)是必要的。 |
ate | At end mode (文件末尾模式)。打开文件时,文件指针定位到文件末尾。 |
trunc | Truncate mode (截断模式)。如果文件已经存在,则在打开时将其长度截断为0,即删除文件中的所有内容(当与 std::ios::out 一起使用时)。 |
🍐 写入操作可以使用<<进行流写入,也可以通过write写入一个缓冲区字符串。读取操作可以通过>>来一个一个字符读取,也可以通过read直接读取到缓冲区中。
示例:
#include <iostream>
#include <fstream>int main() {std::fstream file("example.txt", std::ios::out | std::ios::trunc); // 清空文件内容if (!file.is_open()) { // 检查文件是否成功打开std::cerr << "Unable to open file" << std::endl;return 1;}file << "This is a new file content." << std::endl;file.close(); // 关闭文件return 0;
}
总的来说:
🍅C++ 的文件 I/O 流机制提供了强大而灵活的文件操作功能。通过使用 ifstream
、ofstream
和 fstream
,你可以高效地进行文件的读取、写入和同时操作。掌握这些基本用法和模式设置能够帮助你在实际编程中更好地处理文件数据。
6. C++ 流类检查
☘️在 C++ 中,输入输出流(I/O 流)的状态检查是确保流操作成功与否的关键部分。C++ 的标准库提供了几个方法和标志来检查流的状态。这些状态检查方法可以帮助你处理流中的错误,确保程序的稳定性和正确性。
6.1 流的状态标志
C++ 的流类(如 std::ifstream
, std::ofstream
, std::stringstream
等)提供了以下几种主要的状态标志,用于检测流的不同状态:
名称 | 语法 | 功能 |
good() | stream.good() | 检查流是否处于良好的状态。返回 true 如果流没有发生任何错误。 |
fail() | stream.fail() | 检查流是否处于失败状态。通常在流操作失败时(如读取或写入时发生错误)返回 true 。 |
eof() | stream.eof() | 检查流是否到达了文件末尾(EOF)。如果读取操作到达了文件末尾,返回 true 。 |
bad() | stream.bad() | 检查流是否处于坏状态。这是一个严重的错误状态,通常表示流出现了不可恢复的错误(如硬件故障)。一般来说,很少会遇到这种错误! |
清理流状态
在处理流时,可能需要重置流的状态以继续进行操作。可以使用 clear()
函数来重置流的状态标志
file.clear(); // 重置流状态
6.2 标准流的状态检查
int main()
{string s;cout << cin.good() << endl;cout << cin.eof() << endl;cout << cin.bad() << endl;cout << cin.fail() << endl << endl;//istream operator >> (istream & is, string & s);//while (cin >> s) //和上面等价while (operator >> (cin, s).operator bool()) {cout << cin.good() << endl;cout << cin.eof() << endl;cout << cin.bad() << endl;cout << cin.fail() << endl << endl;cout << s << endl;}cout << cin.good() << endl;cout << cin.eof() << endl;cout << cin.bad() << endl;cout << cin.fail() << endl << endl;// 恢复标志状态,再输入cin.clear();while (cin >> s) {cout << cin.good() << endl;cout << cin.eof() << endl;cout << cin.bad() << endl;cout << cin.fail() << endl << endl;cout << s << endl;}return 0;
}
6.3 文件流的状态检查
#include <iostream>
#include <fstream>int main() {std::ifstream inFile("example.txt");if (!inFile) { // 检查文件是否成功打开std::cerr << "Failed to open file." << std::endl;return 1;}std::string line;while (std::getline(inFile, line)) {if (inFile.eof()) {std::cout << "End of file reached." << std::endl;}if (inFile.fail()) {std::cout << "File operation failed." << std::endl;}std::cout << line << std::endl;}inFile.close(); // 关闭文件return 0;
}
总的来说:
🍅C++ 提供了一些标准的方法和标志来检查流的状态,这些方法帮助程序员了解流的当前状态,并在发生错误时采取适当的措施。通过合理使用这些方法,可以确保程序的稳定性和可靠性。
7. C++ 非文件流(sstream)
在 C++ 中,除了文件流(如 std::ifstream
和 std::ofstream
),还有其他几种流类型用于处理不同的数据源和目标。以下是一些常见的非文件流类型:
7.1 stringstream
在C语言中,如果想要将一个整形变量的数据转化为字符串格式,如何去做?
- 使用 itoa() 函数
- 使用 sprintf() 函数
但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。
而在C++中,可以使用 stringstream 类对象来避开此问题。
std::stringstream
是 C++ 标准库中的一个类,用于在内存中处理字符串流。它继承自 std::istream
和 std::ostream
,可以像文件流一样用来读取和写入数据,但数据是在内存中的字符串。
示例:
- 将数值类型数据格式化为字符串
#include<sstream>int main() {int a = 12345678;string sa;// 将一个整形变量转化为字符串,存储到string类对象中stringstream s;s << a;s >> sa;// clear()// 注意多次转换时,必须使用clear将上次转换状态清空掉// stringstreams在转换结尾时(即最后一个转换后),会将其内部状态设置为badbit// 因此下一次转换是必须调用clear()将状态重置为goodbit才可以转换// 但是clear()不会将stringstreams底层字符串清空掉// s.str("");// 将stringstream底层管理string对象设置成"",// 否则多次转换时,会将结果全部累积在底层string对象中s.str("");s.clear(); // 清空s, 不清空会转化失败double d = 12.34;s << d;s >> sa;string sValue;sValue = s.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; }
- 序列化和反序列化结构数据
struct ChatInfo {string _name; // 名字int _id; // idDate _date; // 时间string _msg; // 聊天信息 };int main() {// 结构信息序列化为字符串ChatInfo winfo = { "张三", 135246, { 2022, 4, 10 }, "晚上一起看电影吧"};ostringstream oss;oss << winfo._name << " " << winfo._id << " " << winfo._date << " " << winfo._msg;string str = oss.str();cout << str << endl << endl;// 我们通过网络这个字符串发送给对象,实际开发中,信息相对更复杂,// 一般会选用Json、xml等方式进行更好的支持// 字符串解析成结构信息ChatInfo rInfo;istringstream iss(str);iss >> rInfo._name >> rInfo._id >> rInfo._date >> rInfo._msg;cout << "-------------------------------------------------------" << endl;cout << "姓名:" << rInfo._name << "(" << rInfo._id << ") ";cout << rInfo._date << endl;cout << rInfo._name << ":>" << rInfo._msg << endl;cout << "-------------------------------------------------------" << endl;return 0; }
7.2 istringstream
std::istringstream
是一个输入流类,用于从字符串中读取数据。它提供了与 std::istream
类似的功能,但数据源是字符串。
示例:
#include <iostream>
#include <sstream>
#include <string>int main() {std::string data = "123 456.78";// 创建一个从字符串中读取数据的输入字符串流对象std::istringstream iss(data);int number;double floating;// 从字符串流中读取数据iss >> number >> floating;// 输出结果std::cout << "Read integer: " << number << std::endl;std::cout << "Read floating-point: " << floating << std::endl;return 0;
}
7.3 ostringtream
std::ostringstream
是一个输出流类,用于将数据写入到字符串中。它提供了与 std::ostream
类似的功能,但数据目标是字符串。
示例:
#include <iostream>
#include <sstream>
#include <string>int main() {// 创建一个向字符串中写入数据的输出字符串流对象std::ostringstream oss;// 向字符串流中写入数据oss << "Hello, " << "world!" << std::endl;oss << 123 << " " << 45.67 << std::endl;// 获取字符串流中的字符串std::string result = oss.str();// 输出结果std::cout << "String stream content: " << result;return 0;
}
📖 总结
C++ 的 I/O 流系统包括输入流、输出流和双向流。输入流(如 std::cin
、std::ifstream
)用于读取数据,输出流(如 std::cout
、std::ofstream
)用于写入数据,而 双向流(如 std::fstream
、std::stringstream
)则支持同时读写操作。标准错误流(std::cerr
)和标准日志流(std::clog
)用于错误报告和日志记录。这些流对象提供了强大的数据处理功能,是 C++ 编程的核心组件之一。
💞 💞 💞那么本篇到此就结束,希望我的这篇博客可以给你提供有益的参考和启示,感谢大家支持!!!祝大家天天开心
相关文章:

【C++学习】 IO 流揭秘:高效数据读写的最佳实践
✨ 今朝有酒今朝醉,明日愁来明日愁 🌏 📃个人主页:island1314 🔥个人专栏:C学习 ⛺️ 欢迎关注:👍点赞 👂Ἷ…...

C#使用TCP-S7协议读写西门子PLC(五)-测试程序
上面四篇我们进行封装连接PLC以及读写PLC内存地址表 C#使用TCP-S7协议读写西门子PLC(一)-CSDN博客 C#使用TCP-S7协议读写西门子PLC(二)-CSDN博客 C#使用TCP-S7协议读写西门子PLC(三)-CSDN博客 C#使用TCP-S7协议读写西门子PLC(四)-CSDN博客 这里我们进行测试操作 西门子PLC-…...

经验——IMX6UL的uboot无法ping主机或Ubuntu
主要描述可能的方向,不涉具体过程,详细操作可以查阅网上相关教程 跟随正点原子教程测试以太网端口时,即便按照步骤多次尝试也无法ping通,后补充了些许网络工程基础知识解决了这个问题。 uboot无法ping主机或Ubuntu有多种可能&…...
AUTOSAR-规范文档版本
https://www.autosar.org/standards 2024年11月(R24-11) Foundation(FO) // TODO Classic(CP) // TODO Adaptive(AP) // TODO 2023年11月(R23-11) Foundation&a…...

网络(四)——HTTP协议
文章目录 认识urlurlencode和urldecodeHTTP协议格式HTTP的方法HTTP的状态码HTTP常见Header 虽然应用层的协议是由人为规定的,但是已经有大佬们定义了一些现成的,又非常好用的应用层协议,供我们直接参考使用. HTTP(超文本传输协议)就是其中之一…...

comfyui中报错 Cmd(‘git‘) failed due to: exit code(128) 如何解决
🎈背景 comfyui今天在安装插件的过程中,发现有个插件第一次安装失败后,再次安装就开始报错了,提示: ComfyUI-Inpaint-CropAndStitch install failed: Bad Request 截图如下: 看下后台的报错: …...

测试-Gatling 与性能测试
Gatling 与性能测试详解 一、什么是性能测试? 性能测试是一种软件测试类型,旨在评估系统在负载下的响应时间、吞吐量和资源利用率等性能指标。通过性能测试,开发者和运维团队能够识别出系统的瓶颈、优化系统性能,并确保其在实际…...
ESRGAN——老旧照片、视频帧的修复和增强,提高图像的分辨率
ESRGAN(Enhanced Super-Resolution GAN):用于提高图像的分辨率,将低质量图像升级为高分辨率版本,常用于老旧照片、视频帧的修复和增强。 一、ESRGAN 介绍 1.1 背景 超分辨率问题是计算机视觉中的一个重要研究领域&a…...

跨界融合:EasyDSS+无人机视频直播推流技术助力行业多场景应用
随着科技的飞速发展,无人机技术与流媒体技术的结合正逐步改变着多个行业的运作模式。其中,EasyDSS互联网视频云服务与无人机视频直播推流技术的结合,更是为警务安防、赛事直播、农业监测等多个领域带来了前所未有的变革。本文将深入探讨EasyD…...

Linux实操笔记2 Ubuntu安装Nginx的不同方法
今天来了解Ubuntu或者说Linux系统安装Nginx的几种办法。包括从Ubuntu的库安装到官方源码编译安装。 一、Nginx是什么? 以下是来自Nginx中文文档的内容。 Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性: 作为 Web 服务器:相比…...

QCustomPlot笔记(一)
文章目录 简介将帮助文档添加到Qt Creator中编译共享库cmake工程编译提示ui_mainwindow.h找不到qcustomplot.h文件 环境:windowsQt Creator 10.0.1cmake 简介 QT中用于绘制曲线的第三方工具 下载地址:https://www.qcustomplot.com/index.php/download 第一个压缩…...

【机器学习】多模态AI——融合多种数据源的智能系统
随着人工智能的快速发展,单一模态(如文本、图像或语音)已经不能满足复杂任务的需求。多模态AI(Multimodal AI)通过结合多种数据源(如文本、图像、音频等)来提升模型的智能和表现,适用…...

QT学习与数据库连接
1.基础 1. 安装最后一个非在线版本 5.14, 没有的话联系我 新建一个.cpp文件 #include <QApplication> #include <QLabel> #include <QLineEdit> #include <QPushButton> #include <QHBoxLayout> #include <QVBoxLayout> #include <Q…...

泛读笔记:从Word2Vec到BERT
自然语言处理(NLP)模型的发展历史 1.统计方法时期:使用贝叶斯方法、隐马尔可夫模型、概率模型等传统统计方法 2.机器学习时期:支持向量机(SVM)、决策树模型、随机森林、朴素贝叶斯等传统机器学习方法 3.深度学习革命:各种新的深度学习模型&am…...

redis实现分布式锁详细教程,可续锁(看门狗)、可重入
前言 本文将讨论的做一个高并发场景下避不开的话题,即redis分布式锁。比如在淘宝 的秒杀场景、热点新闻和热搜排行榜等。可见分布式锁是一个程序员面向高级的一门必修课,下面请跟着本篇文章好好学习。 redis分布式锁有哪些面试题 1.Redis做分布式的时…...
代码随想录打卡Day32
今天有点事,先做一题,剩下的明天补。 509. 斐波那契数 这道题目太简单了,递归几行代码就结束了,用动态规划做也可以,主要是学习一下动态规划五部曲。 这是递归的代码 class Solution { public:int fib(int n) {//确…...

数学学习记录
目录 学习资源: 9月14日 1.映射:编辑 2.函数: 9月15日 3.反函数: 4.收敛数列的性质 5.反三角函数: 9月16日 6.函数的极限: 7.无穷小和无穷大 极限运算法则: 学习资源: 3Blue1…...

R语言统计分析——散点图1(常规图)
参考资料:R语言实战【第2版】 R语言中创建散点图的基础函数是plot(x,y),其中,x和y是数值型向量,代表着图形中的(x,y)坐标点。 attach(mtcars) plot(wt,mpg,main"Basic Scatter plot of MPG vs. Weigh…...

蓝桥杯—STM32G431RBT6按键的多方式使用(包含软件消抖方法精讲)从原理层面到实际应用(一)
新建工程教程见http://t.csdnimg.cn/JySLg 点亮LED教程见http://t.csdnimg.cn/Urlj5 末尾含所有代码 目录 按键原理图 一、按键使用需要解决的问题 1.抖动 1.什么是抖动 2.抖动类型 3.如何去消除抖动 FIRST.延时函数消抖(缺点:浪费CPU资源ÿ…...

基于STM32的温度、电流、电压检测proteus仿真系统(OLED、DHT11、继电器、电机)
目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STM32F103C8T6 采用DHT11读取温度、滑动变阻器模拟读取电流、电压。 通过OLED屏幕显示,设置电流阈值为80,电流小阈值为50,电压阈值为60,温度阈值…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...