【C++学习】 IO 流揭秘:高效数据读写的最佳实践

news2024/9/19 13:13:41

✨                                          今朝有酒今朝醉,明日愁来明日愁     🌏

📃个人主页:island1314

🔥个人专栏:C++学习

⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏  💞 💞 💞


引言:

🚀C++ IO 流(输入输出流)是一种用于处理数据流的机制,允许程序读取和写入数据。它包括

  1. 标准输入流 (std::cin)
  2. 标准输出流 (std::cout)
  3. 标准错误流 (std::cerr)
  4. 文件流 (std::ifstreamstd::ofstream)。

🔥🔥🔥 这些流对象利用流类(如 istreamostream)进行数据的读取和写入,同时支持各种格式化操作和错误处理。

1. C语言的输入与输出

🥝 C语言中我们用到的最频繁的输入输出方式就是 scanf ( ) 与 printf ( )。

  1. scanf() : 从标准输入设备(键盘)读取数据,并将值存放在变量中。
  2. printf() : 将指定的文字/字符串输出到标准输出设备(屏幕)。

💢注:对宽度输出和精度输出控制。C语言借助了相应的缓冲区来进行输入与输出。

如下图所示:

  

🔥下面来看下对输入输出缓冲区的理解:

  1. 可以屏蔽掉低级 I/O 的实现,低级I/O的实现依赖操作系统本身内核的实现,所以如果能够屏蔽这部分的差异,可以很容易写出可移植的程序。
  2. 可以使用这部分的内容实现 “行” 读取的行为,对于计算机而言是没有 “行” 这个概念,有了这部分,就可以定义“行”的概念,然后解析缓冲区的内容,返回一个“行”。

💢总的来说:在 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 流主要包括以下几类:

  1. 输入流

    • std::istream:基本输入流类。
    • std::ifstream:用于从文件读取数据。
    • std::istringstream:用于从字符串读取数据。
    • std::cin:标准输入流,通常与键盘交互。
  2. 输出流

    • std::ostream:基本输出流类。
    • std::ofstream:用于向文件写入数据。
    • std::ostringstream:用于向字符串写入数据。
    • std::cout:标准输出流,通常用于屏幕显示。
  3. 双向流:

    • std::iostream:继承了 std::istream 和 std::ostream,用于同时进行输入和输出操作。
    • std::fstream:用于在文件中同时进行读写操作。
    • std::stringstream:提供了在内存中进行读写操作的能力。
  4. 错误和日志流

    • std::cerr:标准错误流,用于输出错误信息。
    • std::clog:标准日志流,用于输出日志信息。

这些流对象都定义在 <iostream><fstream><sstream> 头文件中。

📆 其中值得注意的是 cerr、clog 是很少用的,它们本来是用做 错误输出 和 日志输出 的,但是因为 cout 也能做到,所以这两个很少被使用。

3.2 ios类及派生类

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

  1. <ios>:

    • ios 类是所有输入输出流类的基类,提供了流的基本功能,如流状态标志、格式设置、同步等。
    • 主要功能包括流状态标志(如 failbiteofbit)、流的格式设置(如 precisionwidth)、同步机制等。
  2. <iostream>:

    • iostream 是从 ios 类派生出来的,结合了输入和输出流的功能。
    • 它通过包含 istream 和 ostream 来实现输入和输出的功能。
  3. <istream>:

    • istream 类用于输入流操作,负责从输入设备(如键盘、文件)读取数据。
    • 它是 ios 的派生类,并扩展了输入操作的功能。
  4. <ostream>:

    • ostream 类用于输出流操作,负责将数据写入输出设备(如屏幕、文件)。
    • 它也是 ios 的派生类,并扩展了输出操作的功能。
  5. <ifstream> 和 <ofstream> :

    • ifstream(输入文件流)和 ofstream(输出文件流)是 istream 和 ostream 的派生类,分别用于从文件读取数据和向文件写入数据。
    • 这些类提供了文件流的特定功能,并继承了 ios 和 istream / ostream 的基本功能。
  6. <fstream>:

    • fstream 类结合了 ifstream 和 ofstream 的功能,支持通过流的方式来读写文件。提供了对文件的输入和输出操作。
    • 它是 iostream 的一个派生类,用于处理文件的读写操作。
  7. <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++ 流库中的核心类,提供了流的基本功能和状态管理。istreamostream 继承自 ios,分别处理输入和输出,而 ifstreamofstreamfstream 进一步扩展了对文件的输入输出操作。

4. C++ 标准 IO 流(istream)

🍐C++标准库提供了4个全局流对象cin、cout、cerr、clog,使用cout进行标准输出,即数据从内存流向控制台(显示器)。使用cin进行标准输入即数据通过键盘输入到程序中,同时C++标准库还提供了cerr用来进行标准错误的输出,以及clog进行日志的输出,从上图可以看出:cout、cerr、clog是ostream类的三个不同的对象,因此这三个对象现在基本没有区别,只是应用场景不同!

🐛 注: 在使用时候必须要包含文件并引入 std 标准命名空间。
注意:

  1. cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢用,如果输入错了,必须在回车之前修改,如果回车键按下就无法挽回了。只有把输入缓冲区中的数据取完后,才要求输入新的数据。除此之外, cin 不能重定向。
  2.  cin 输入的数据类型必须与要提取的数据类型一致,否则出错。出错只是在流的状态字state中对应位置位(置1),程序继续。
  3. 空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输入。但如果是字符型和字符串,则空格(ASCII码为32)无法用cin输入,字符串中也不能有空格。回车符也无法读入。如果想将字符串整行读取,则要使用getline()
    #include<iostream>
    using namespace std;
    int main()
    {
    	// 输入 hello world
    	string a;
    	cin >> a;
    	cout << a << endl; // hello
    
    	cin >> a;
    	cout << a << endl; // world
    
    	getline(cin,a);
    	cout << a << endl;
        
        return 0;
    }
    
  4. cin和cout可以直接输入和输出 内置类型数据,原因:标准库已经将所有内置类型的输入和输出全部重载了。
  5. 对于 自定义类型,如果要支持cin和cout的标准输入输出,需要对<<和>>进行重载

  6. 发生错误时,系统需要立即输出以提醒用户,因此错误输出流对象 cerr 不具备缓冲区

  7. 在线OJ中的输入和输出:
    ① 对于IO类型的算法,一般都需要循环输入。
    ② 输出:严格按照题目的要求进行,多一个少一个空格都不行
    ③ 连续输入时,vs系列编译器下在输入ctrl+Z时结束。
    ④ scanf函数当读取发生错误或读到文件末尾,会返回EOF(-1)。

  8. 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++根据文件内容的数据格式分为二进制文件文本文件。采用文件流对象操作文件的一般步骤如下:

  1. 定义一个文件流对象:
    ☑️ifstream(只输入用)
    ☑️ofstream(只输出用)
    ☑️fstream(既输入又输出用) (继承了ifstream和ofstream)
  2. 使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系 。open:打开文件,可以设置对应的打开方式和C语言很类似。
  3. 使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写。关闭文件。

🍋‍🟩文件流类

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::打开方式)

打开方式功能
inInput mode (输入模式)。以读取模式打开文件用于输入操作。
outOutput mode (输出模式)。以写入模式打开文件用于输出操作。如果文件已存在,内容将被截断。
appAppend mode (追加模式)。在每次写入时,数据将被追加到文件的末尾,而不是覆盖现有内容
binaryBinary mode (二进制模式)。以二进制方式打开文件,不进行任何字符转换。这对于非文本文件(如图像或可执行文件)是必要的。
ateAt end mode (文件末尾模式)。打开文件时,文件指针定位到文件末尾。
truncTruncate 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 流机制提供了强大而灵活的文件操作功能。通过使用 ifstreamofstreamfstream,你可以高效地进行文件的读取、写入和同时操作。掌握这些基本用法和模式设置能够帮助你在实际编程中更好地处理文件数据。

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::ifstreamstd::ofstream),还有其他几种流类型用于处理不同的数据源和目标。以下是一些常见的非文件流类型:

7.1 stringstream

在C语言中,如果想要将一个整形变量的数据转化为字符串格式,如何去做?

  • 使用 itoa() 函数
  • 使用 sprintf() 函数

但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。
而在C++中,可以使用 stringstream 类对象来避开此问题。

std::stringstream 是 C++ 标准库中的一个类,用于在内存中处理字符串流。它继承自 std::istreamstd::ostream,可以像文件流一样用来读取和写入数据,但数据是在内存中的字符串。

示例:

  1. 将数值类型数据格式化为字符串
    #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;
    }
    
  2. 字符串拼接
    ​int main()
    {
    	stringstream sstream;
    	
    	// 将多个字符串放入 sstream 中
    	sstream << "first" << " " << "string,";
    	sstream << " second string";
    	cout << "strResult is: " << sstream.str() << endl;
    	
    	// 清空 sstream
    	sstream.str("");
    	sstream << "third string";
    	cout << "After clear, strResult is: " << sstream.str() << endl;
    	return 0;
    }
    
    ​
  3. 序列化和反序列化结构数据
    struct ChatInfo
    {
    	string _name; // 名字
    	int _id; // id
    	Date _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::cinstd::ifstream)用于读取数据,输出流(如 std::coutstd::ofstream)用于写入数据,而 双向流(如 std::fstreamstd::stringstream)则支持同时读写操作。标准错误流(std::cerr)和标准日志流(std::clog)用于错误报告和日志记录。这些流对象提供了强大的数据处理功能,是 C++ 编程的核心组件之一。

💞 💞 💞那么本篇到此就结束,希望我的这篇博客可以给你提供有益的参考和启示,感谢大家支持!!!祝大家天天开心

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2141686.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker部署ddns-go教程(包含完整的配置过程)

本章教程教程,主要介绍如何用Docker部署ddns-go。 一、拉取容器 docker pull jeessy/ddns-go:v6.7.0二、运行容器 docker run -d \--name ddns-go \--restart unless-stopped \

蓝桥杯—STM32G431RBT6按键的多方式使用(包含软件消抖方法精讲)从原理层面到实际应用(一)

新建工程教程见http://t.csdnimg.cn/JySLg 点亮LED教程见http://t.csdnimg.cn/Urlj5 末尾含所有代码 目录 按键原理图 一、按键使用需要解决的问题 1.抖动 1.什么是抖动 2.抖动类型 3.如何去消除抖动 FIRST.延时函数消抖&#xff08;缺点&#xff1a;浪费CPU资源&#xff…

1.使用 IDEA 过程中的英语积累 - File 菜单(每一次重点积累 5 个单词)

前言 学习可以不局限于传统的书籍和课堂&#xff0c;各种生活的元素也都可以做为我们的学习对象&#xff0c;本文将利用 IDEA 页面上的各种英文元素来做英语的积累&#xff0c;如此做有 3 大利 这些软件在我们工作中是时时刻刻接触的&#xff0c;借此做英语积累再合适不过&…

web开发 之 HTML、CSS、JavaScript、以及JavaScript的高级框架Vue(学习版2)

一、前言 接下来就是来解决这些问题 二、 Ajax 1.ajax javscript是网页三剑客之一&#xff0c;空用来控制网页的行为的 xml是一种标记语言&#xff0c;是用来存储数据的 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-…

Fastjson反序列化漏洞——JNDI注入

一.前言 之前使用反序列化和序列化时写入的到文件里面的&#xff0c;真实环境中&#xff0c;也是这样吗&#xff1f; 当然不是了&#xff0c;通过二进制&#xff0c;字节流数据进行的。 为什么会有JNDI&#xff1f; 由于http和ftp传输消耗资源仍然很大&#xff0c;就有了JRM…

macOS Sequoia发布:Apple又给我们带来了什么惊喜?

今天是个激动人心的日子,尤其是对于Mac用户来说,因为Apple正式发布了全新的操作系统——macOS Sequoia。作为一款专为Mac设备设计的操作系统,Sequoia不仅仅是简单的升级,它承载了Apple在系统体验上的巨大飞跃。听到这个消息,你可能会好奇,Apple这次又会带来什么样的创新?…

【Python】高效图像处理库:pyvips

月亮慢慢变圆&#xff0c;日子慢慢变甜。 在图像处理领域&#xff0c;pyvips 是一个轻量级且高效的库&#xff0c;适合处理大规模图像、实现高性能的操作。相较于其他常见的图像处理库如 PIL 或 OpenCV&#xff0c;pyvips 以其低内存占用和出色的速度脱颖而出。本文将介绍 pyv…

2024年全国大学生数学建模竞赛B题生产过程中的决策问题分析

目录 引言 问题 1&#xff1a;抽样检测方案设计 问题 2&#xff1a;生产过程中的决策 决策阶段划分 决策方案 结果 问题 3&#xff1a;多道工序和零配件的决策 生产流程 决策过程 问题 4&#xff1a;基于抽样检测的重新决策 动态调整次品率 结论 引言 在2024年全国…

[Golang] Sync

[Golang] Sync 文章目录 [Golang] Syncsync.WaitGroupsync.Once对比init() sync.Lock互斥锁和读写锁互斥锁读写锁 死锁问题加锁解锁不成对循环等待 sync.Mapsync/atomicatomic和mutex的区别atomic.value sync.Pool如何使用sync.Pool使用场景 Golang中我们一般提倡使用通信来共享…

Java入门,初识Java

Java背景知识 Java是早期美国 sun 公司&#xff08;Stanford University Network&#xff09;在1995年推出的一门计算机高级编程语言。Java早期称为Oak&#xff08;中文翻译为&#xff1a;橡树&#xff09;&#xff0c;后期改名为Java。&#xff08;因为当时sun公司门口有很多…

MySQL_数据类型简介

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

【计算机网络】TCP 协议——详解三次握手与四次挥手

文章目录 一、引言二、TCP1、TCP 的数据格式2、TCP 的三次握手3、TCP 的四次挥手4、TCP 的全双工通信 三、TCP 的状态转换1、TCP 连接的建立&#xff08;三次握手&#xff09;状态2、TCP 连接的终止&#xff08;四次挥手&#xff09;状态3、TCP 异常情况 一、引言 TCP与UDP的区…

Linux操作系统文件权限管理

Linux操作系统下文件的权限分为当前用户权限、用户组权限和其他用户权限&#xff0c;然后每一类用户或组又分为读权限(r)、写权限(w)和可执行权限(x)。 如图1&#xff0c;打开任一目录&#xff0c;右键单击文件&#xff0c;在弹出菜单选择“属性”&#xff0c;在弹出的属性选项…

一款强大的吉他乐谱编辑软件GuitarPro 8.2中文解锁版

GuitarPro 8.2中文解锁版是一款强大的吉他乐谱编辑软件&#xff0c;适合新手和专业乐手。它提供详尽教程和实用工具&#xff0c;助力初学者掌握吉他技巧&#xff1b;对于专业乐手&#xff0c;它精准记录音符和节奏&#xff0c;提供丰富编辑功能和音效处理。此外&#xff0c;软件…

【python版】示波器输出的csv文件(时间与电压数据)如何转换为频率与幅值【方法④】

将示波器输出的 CSV 文件中的时间和电压数据转换为频率和幅值数据的过程涉及几个步骤&#xff0c;下面是详细的步骤和相关的计算公式&#xff1a; 1. 导入数据 首先&#xff0c;你需要将 CSV 文件中的时间和电压数据导入到数据分析工具中&#xff0c;比如 Python&#xff08;…

【网络】TCP/IP 五层网络模型:网络层

最核心的就是 IP 协议&#xff0c;是一个相当复杂的协议 TCP 详细展开讲解&#xff0c;是因为 TCP 确实在开发中非常关键&#xff0c;经常用到&#xff0c;IP 则不同&#xff0c;和普通程序猿联系比较浅。和专门开发网络的程序猿联系比较紧密&#xff08;开发路由器&#xff0…

深度学习自编码器 - 随机编码器和解码器篇

序言 在深度学习领域&#xff0c;自编码器作为一种无监督学习技术&#xff0c;凭借其强大的特征表示能力&#xff0c;在数据压缩、去噪、异常检测及生成模型等多个方面展现出独特魅力。其中&#xff0c;随机编码器和解码器作为自编码器的一种创新形式&#xff0c;进一步拓宽了…

COTERRORSET—— LLM训练新基准让模型从自身错误中学习

概述 论文地址&#xff1a;https://arxiv.org/pdf/2403.20046.pdf 在最近的研究中&#xff0c;大规模语言模型因其推理能力而备受关注。这些模型在各种任务和应用中取得了令人瞩目的成果&#xff0c;尤其是使用思维链&#xff08;CoT&#xff09;提示方法的有效性已得到证实。…

智慧宿舍平台|基于Springboot+vue的智慧宿舍系统(源码+数据库+文档)

智慧宿舍系统 目录 基于Springbootvue的智慧宿舍系统 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取 博主介绍&#xff1a;✌️大厂码农|毕设布道师&#xff0c;阿里云开发社区乘风者…

FPGA基本结构和简单原理

前言&#xff1a; FPGA全程为&#xff08;Field Programmable Gate Array&#xff09;现场可编程逻辑阵列&#xff0c;以基本的逻辑为主可以实现大多数芯片可以实现的功能&#xff0c;比如说&#xff1a;ASIC芯片等&#xff0c;在半导体领域有着重要的作用。 本文…