C++ 的 输入输出流(I/O Streams)
什么是输入输出流
C++ 的输入输出操作是通过 流(stream) 机制实现的。
使用cin和cout
#include <iostream>
using namespace std;
int main()
{string name;int age;cout << "请输入你的名字:";cin >> name;cout << "请输入你的年龄:";cin >> age;cout << "你好," << name << ",你今年 " << age << " 岁。" << endl;return 0;
}
需要解释的建议转专业;
注意:
cin >> 是以空格为分隔符,遇空格就停止。
文件的输入和输出:ifstream/ofstream
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
// 写入文件ofstream fout("data.txt");fout << "Hello, file!" << endl;fout << "C++ 文件操作示例" << endl;fout.close();
// 读取文件ifstream fin("data.txt");string line;while (getline(fin, line)){cout << "读到: " << line << endl;}fin.close();return 0;
}
文件写入操作
// 写入文件
ofstream fout("data.txt");
fout << "Hello, file!" << endl;
fout << "C++ 文件操作示例" << endl;
fout.close();
ofstream fout("data.txt");
:创建一个 ofstream
对象 fout
,并且将其与文件 data.txt
关联起来。ofstream
用于向文件写入数据。若文件不存在,会创建该文件;若文件已存在,会清空原有内容。
fout << "Hello, file!" << endl;
和 fout << "C++ 文件操作示例" << endl;
:向文件 data.txt
写入两行内容,endl
用于换行。
fout.close();
:关闭文件,释放与文件关联的资源。
文件读取操作
// 读取文件
ifstream fin("data.txt");
string line;
while (getline(fin, line))
{cout << "读到: " << line << endl;
}
fin.close();
ifstream fin("data.txt");
:创建一个 ifstream
对象 fin
,并将其与文件 data.txt
关联起来。ifstream
用于从文件读取数据。
string line;
:定义一个 string
类型的变量 line
,用于存储从文件中读取的每一行内容。
while (getline(fin, line))
:使用 getline
函数从文件中逐行读取内容,每次读取一行并存储到 line
变量中。getline
函数在读取到文件末尾时会返回 false
,循环结束。
cout << "读到: " << line << endl;
:将读取到的每一行内容输出到控制台。
fin.close();
:关闭文件,释放与文件关联的资源。
注:在 C++ 里,使用 ofstream
或 ifstream 创建对象时不指定文件打开方式是可行的。
ofstream
默认的打开方式
使用 ofstream
类创建对象并关联文件,却不明确指定打开方式时,ofstream
会采用默认的打开方式。默认情况下,ofstream
以 ios::out | ios::trunc
模式打开文件。
ios::out
:表明以输出模式打开文件,也就是用于向文件写入数据。
ios::trunc
:意味着如果文件已经存在,会先把文件内容清空,再进行写入操作;若文件不存在,则会创建该文件。
手动指定打开方式
若有特殊需求,也能手动指定文件的打开方式。ofstream
类的构造函数可以接收第二个参数,用于指定打开方式。
字符串流:stringstream
#include <iostream>
#include <sstream>
using namespace std;
int main()
{string input = "42 3.14 hello";stringstream ss(input);int i;double d;string s;ss >> i >> d >> s;cout << "Integer: " << i << ", Float: " << d << ", String: " << s << endl;return 0;
}
头文件
#include <iostream>
#include <sstream>
#include <sstream>
:该头文件引入了 stringstream
类,stringstream
类能够将字符串当作流来处理,可进行字符串的输入和输出操作。
定义输入字符串并创建 stringstream
对象
string input = "42 3.14 hello";
stringstream ss(input);
string input = "42 3.14 hello";
:定义了一个字符串 input
,其中包含一个整数、一个浮点数和一个字符串,它们之间用空格分隔。
stringstream ss(input);
:创建了一个 stringstream
对象 ss
,并将字符串 input
作为初始内容。这样 ss
就可以像处理输入流一样处理这个字符串。
定义变量并从 stringstream
中提取数据
int i;
double d;
string s;
ss >> i >> d >> s;
int i;
、double d;
和 string s;
:分别定义了一个整数变量 i
、一个双精度浮点数变量 d
和一个字符串变量 s
,用于存储从 stringstream
中提取的数据。
ss >> i >> d >> s;
:使用 >>
运算符从 stringstream
对象 ss
中依次提取数据,并将其存储到对应的变量中。>>
运算符会根据变量的类型自动进行类型转换。在这个例子中,它会先将字符串中的第一个整数 "42"
转换为整数类型并存储到 i
中,接着将第二个浮点数 "3.14"
转换为双精度浮点数类型并存储到 d
中,最后将剩余的字符串 "hello"
存储到 s
中。
i
、d
、s
的顺序不是绝对不能换,交换顺序后,代码的执行结果会依赖于 stringstream
对象 ss
中存储的字符串内容。如果字符串内容的顺序与变量类型的提取顺序不匹配,就可能导致提取失败或者得到不符合预期的结果。
注:
stringstream
类的介绍
stringstream
是 C++ 标准库 <sstream>
头文件中定义的类,它继承自 iostream
类,结合了 istream
(输入流)和 ostream
(输出流)的功能,允许你像操作文件流或标准输入输出流一样操作字符串。stringstream
主要有以下三个子类:
istringstream
:用于从字符串中读取数据,相当于输入流。
ostringstream
:用于向字符串中写入数据,相当于输出流。
stringstream
:既可以读取也可以写入字符串,兼具前两者的功能。
stringstream
对象的初始化
stringstream
对象不一定要接受一个 string
类对象来初始化。
使用 string
对象初始化
#include <iostream>
#include <sstream>
#include <string>int main() {std::string input = "42 3.14 hello";std::stringstream ss(input);return 0;
}
stringstream
对象 ss
被初始化为包含字符串 "42 3.14 hello"
。
默认初始化
#include <iostream>
#include <sstream>int main() {std::stringstream ss;ss << "This is a test";return 0;
}
这里先默认初始化了 stringstream
对象 ss
,之后可以使用 <<
运算符向其写入数据。
>>
运算符能从 stringstream
对象中提取对应类型数据的原理
>>
运算符是 C++ 中用于输入流操作的提取运算符。当它用于 stringstream
对象时,其工作原理基于 C++ 的流操作和类型转换机制。
流操作
stringstream
是一个流对象,>>
运算符会从流中读取数据。它会按照空格、制表符或换行符等空白字符来分割流中的内容,每次提取一个 “词”(token)。
类型转换
当 >>
运算符遇到不同类型的变量时,会尝试将读取到的字符串数据转换为该变量的类型。这是通过 C++ 的流库中预定义的类型转换函数实现的。
整数类型:当目标变量是整数类型(如 int
)时,>>
运算符会尝试将读取到的字符串转换为整数。如果字符串包含有效的整数字符序列,就会成功转换;否则会导致流状态错误。
#include <iostream>
#include <sstream>int main() {std::string input = "42";std::stringstream ss(input);int num;ss >> num;std::cout << "Integer: " << num << std::endl;return 0;
}
>>
运算符将字符串 "42"
转换为整数 42
并存储到 num
中。
浮点数和它一样操作;
- 字符串类型:当目标变量是
std::string
类型时,>>
运算符会读取直到遇到下一个空白字符为止的字符串。#include <iostream> #include <sstream> #include <string>int main() {std::string input = "hello world";std::stringstream ss(input);std::string word;ss >> word;std::cout << "String: " << word << std::endl;return 0;//仅仅输出“hello” }
>>
运算符读取到"hello"
就停止了,因为遇到了空格,所以word
被赋值为"hello"
。
I/O常见技巧:
读取整行: getline(cin,str)
清除输入缓冲: cin.ignore()或 cin.clear()
判断文件是否打开:fin.is_open()
检查流状态: cin.fail()、fin.eof()
小结
标准流(cin,cout,cerr):控制台输入输出
文件流(ifstream/ofstream/fstream):文件读写
字符串流(stringstream):字符串格式转换
流格式控制:设置小数位、对齐等
C++ 使用 <iomanip> 头文件提供了一系列 格式控制操作符。
常见格式控制符:(省略std::)
fixed:使用固定小数位表示法
scientific:科学计数法
setprecision(n):设置小数位保留精度
setw(n):设置输出字符串宽度
left/right/internal:设置对齐方式
setfill(c):设置填充字符
showpos:显示正号(+)
格式化数字输出
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{double pi = 3.141592653;cout << "Default Output: " << pi << endl;cout << fixed << setprecision(3);cout << "Round to 3 decimal places: " << pi << endl;cout << setw(10) << right << setfill('*') << 42 << endl;// 右对齐,宽度 10,用 * 填充return 0;
}
输出保留三位小数的pi值
cout << fixed << setprecision(3);
cout << "Round to 3 decimal places: " << pi << endl;
cout << fixed << setprecision(3);
fixed
是一个操纵符,它会让浮点数以固定点表示法输出,也就是小数点后的位数固定。
setprecision(3)
同样是一个操纵符,它指定了输出浮点数时小数点后的位数为 3。这两个操纵符结合使用,就能让后续输出的浮点数保留三位小数。
右对齐输出整数并填充字符
cout << setw(10) << right << setfill('*') << 42 << endl;
setw(10)
:这是一个操纵符,它设置了下一个输出项的宽度为 10 个字符。如果输出项的实际宽度小于 10 个字符,就会按照指定的填充字符进行填充。
right
:这是一个操纵符,它指定输出项右对齐。
setfill('*')
:这是一个操纵符,它指定了填充字符为 *
。
42
是要输出的整数。综合起来,这段代码会以右对齐的方式输出整数 42
,宽度为 10 个字符,不足的部分用 *
填充,输出结果为 ********42
。
中文字符流(UTF-8 / 宽字符)
中文字符通常需要用 宽字符(wchar_t)+ 宽流(wcout/wcin) 或确保控制台支持 UTF-
8 编码。
宽字符流输出中文(Windows 下推荐)
#include <iostream>
#include <locale>
using namespace std;
int main()
{
// 设置全局 locale,使 wcout 能输出中文
//(Windows 使用 "chs" 或 "zh_CN.UTF-8")locale::global(locale(""));wcout << L"Hello, World" << endl;return 0;
}
头文件
#include <iostream>
#include <locale>
#include <iostream>
:这是标准输入输出流的头文件,借助它可以使用 cout
、wcout
、cin
等标准输入输出对象。
#include <locale>
:该头文件提供了处理区域设置的功能,能让程序适配不同地区的语言、货币、日期格式等。
设置全局区域设置
locale::global(locale(""));
locale::global
函数用于设置全局的区域设置。
locale("")
代表使用系统默认的区域设置。在 Windows 系统中,这可能会使用 "chs" 或者 "zh_CN.UTF - 8",从而确保程序能正确处理中文等宽字符。
输出宽字符字符串
wcout << L"Hello, World" << endl;
wcout
是用于输出宽字符的标准输出流对象。
L"Hello, World"
是宽字符字符串,以 L
作为前缀,表明其中的每个字符是宽字符类型(通常是 wchar_t
)。
封装文件读写成类
将文件 I/O 封装成类能提升代码复用性与清晰度,特别适合数据处理类。
封装为 FileManager 类
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
class FileManager
{
public:FileManager(const string& fname) : filename(fname) {}void writeLine(const string& text){ofstream fout(filename, ios::app); // 追加写入if (fout.is_open()){fout << text << endl;fout.close();}else{cerr << "无法打开文件用于写入!" << endl;}}void readAll() const{ifstream fin(filename);if (fin.is_open()){string line;while (getline(fin, line)){cout << "读到: " << line << endl;}fin.close();}else{cerr << "无法打开文件用于读取!" << endl;}}
private:string filename;
};
int main()
{FileManager file("data.txt");file.writeLine("你好,文件!");file.writeLine("C++ 文件封装测试。");file.readAll();return 0;
}
writeLine
方法
void writeLine(const string& text)
{ofstream fout(filename, ios::app); // 追加写入if (fout.is_open()){fout << text << endl;fout.close();}else{cerr << "无法打开文件用于写入!" << endl;}
}
- 功能:该方法用于向文件中追加一行文本。
- 实现步骤:
- 创建一个
ofstream
对象fout
,并以追加模式(ios::app
)打开指定的文件。 - 检查文件是否成功打开,如果成功,则将传入的文本
text
写入文件,并在末尾添加换行符endl
。 - 关闭文件流。
- 如果文件无法打开,则使用
cerr
输出错误信息(这里也可以换成cout,但cerr本身就是专门用来输出错误信息的。
- 创建一个
readall方法
void readAll() const
{ifstream fin(filename);//上面那一步就等同于://ifstream fin;//fin.open(filename);//省略掉了使用open()函数if (fin.is_open()){string line;while (getline(fin, line)){cout << "读到: " << line << endl;}fin.close();}else{cerr << "无法打开文件用于读取!" << endl;}
}
- 功能:该方法用于读取文件中的所有行,并将每行内容输出到控制台。
- 实现步骤:
- 创建一个
ifstream
对象fin
,并打开指定的文件。 - 检查文件是否成功打开,如果成功,则使用
getline
函数逐行读取文件内容,直到文件结束。 - 对于每一行,将其输出到控制台,并在前面加上提示信息 “读到:”。
- 关闭文件流。
- 如果文件无法打开,则使用
cerr
输出错误信息。
- 创建一个
注:
cerr和cout的区别
缓冲机制
cout
:cout
是带有缓冲的输出流。这意味着当你向cout
输出数据时,数据会先被存储在缓冲区里,等缓冲区满了或者遇到特定的刷新条件(像遇到endl
、调用flush()
函数或程序结束return 0 的时候直接刷新等),才会将数据输出到对应的设备(一般是控制台)。cerr
:cerr
是无缓冲的输出流。一旦你向cerr
输出数据,数据会立刻被输出到对应的设备,不会进行缓冲。这种特性使得cerr
适合用于输出错误信息,因为在程序出错时,你希望错误信息能马上显示出来,而不是等到缓冲区满了才显示。
用途
cout
:通常用于输出程序的正常运行结果。比如在计算并输出一些数据、显示提示信息等场景下使用。cerr
:专门用于输出程序运行过程中出现的错误信息。使用cerr
可以让错误信息和正常输出区分开来,方便调试和监控程序。
输出目标
cout
:默认情况下,cout
的输出目标是标准输出设备,一般是控制台。不过,你可以通过重定向操作将其输出到文件或者其他设备。cerr
:默认情况下,cerr
的输出目标是标准错误输出设备,同样通常是控制台。和cout
不同的是,cerr
的输出不会被重定向操作影响,它始终会输出到标准错误输出设备,这样能确保错误信息不会被误重定向到其他地方。
小结
技术点:核心语法/类 场景
格式流控制:<iomanip> 小数精度、对齐、美观输出
中文字符流:wcout,L"",locale 终端/日志中正确输出中文
文件操作封装:自定义类+ifstream/ofstream 实现面向对象的数据存取方式
stringstream 实现类型转换、如何读写二进制文件 (ios::binary)
使用 stringstream 实现类型转换
stringstream 是一个灵活的字符串流工具,能像输入输出流一样操作字符串。
当你创建一个 stringstream
对象后,就可以使用 <<
运算符向这个对象里插入数据,也能使用 >>
运算符从这个对象中提取数据。
stringstream
类,它能让你像操作标准输入输出流(如 cin
和 cout
)一样对字符串进行操作,从而 实现字符串和其他数据类型之间的转换 。
字符串 ↔ 数字转换
#include <iostream>
#include <sstream>
using namespace std;
int main()
{string str = "42.5";double num;stringstream ss(str);ss >> num;cout << "字符串转数字: " << num << endl;int i = 100;stringstream ss2;ss2 << i;string s = ss2.str();cout << "数字转字符串: " << s << endl;return 0;
}
字符串转数字
string str = "42.5";
double num;
stringstream ss(str);
ss >> num;
cout << "字符串转数字: " << num << endl;
stringstream
对象创建与初始化:stringstream ss(str);
:创建一个stringstream
对象ss
,并使用字符串str
对其进行初始化。这意味着ss
中包含了字符串"42.5"
(这种类似构造函数的初始化只能是字符串类型,不能是int、double等类型,没有对应的构造函数)。
- 字符串转换为数字:
ss >> num;
:使用输入运算符>>
从stringstream
对象ss
中读取数据,并尝试将其转换为double
类型,然后存储到变量num
中。这里"42.5"
被成功转换为42.5(注意必须用stringstream类型的对象来转化为其他类型的对象,不能直接转化,必须用stringstream当跳板)
。
数字转字符串
int i = 100;
stringstream ss2;
ss2 << i;
string s = ss2.str();
cout << "数字转字符串: " << s << endl;
stringstream
对象创建:stringstream ss2;
:创建一个空的stringstream
对象ss2
。(这是因为stringstream类型的对象不能直接被int类型初始化,没有这个构造函数,必须分成两步)
- 数字写入
stringstream
对象:ss2 << i;
:使用输出运算符<<
将整数i
的值写入stringstream
对象ss2
中。此时ss2
中存储了表示100
的字符串。
- 使用
<<
运算符将一个int
类型的变量i
(这里i
的值为 100)插入到stringstream
对象ss2
中时,100
会以字符串的形式存储在ss2
里。
- 获取
stringstream
中的字符串:string s = ss2.str();
:调用str()
方法从stringstream
对象ss2
中获取存储的字符串,并将其赋值给字符串变量s
。
注:
str()
方法的功能
stringstream
类提供了一个名为 str()
的成员函数,其作用是获取 stringstream
对象当前存储的字符串内容。这个方法返回一个 std::string
类型的对象,该对象包含了 stringstream
中存储的所有字符。
string s = ss2.str();
的执行过程
- 调用
ss2.str()
:ss2
是stringstream
对象,调用它的str()
方法,会返回一个std::string
对象,这个对象包含了ss2
中当前存储的字符串"100"
(100以字符串的形式被存储)。 - 赋值操作:把
ss2.str()
返回的std::string
对象赋值给字符串变量s
。经过这一步,变量s
就存储了"100"
这个字符串。
读写二进制文件 (ios::binary)
#include <iostream>
#include <fstream>
using namespace std;
struct Person
{char name[20];int age;
};
int main()
{
// 写入ofstream fout("people.dat", ios::binary);Person p1 = {"Alice", 25};Person p2 = {"Bob", 30};fout.write(reinterpret_cast<char*>(&p1), sizeof(p1));fout.write(reinterpret_cast<char*>(&p2), sizeof(p2));fout.close();
// 读取ifstream fin("people.dat", ios::binary);Person p;while (fin.read(reinterpret_cast<char*>(&p), sizeof(p))){cout << "Name: " << p.name << ", Age: " << p.age << endl;}fin.close();return 0;
}
写入部分
ofstream fout("people.dat", ios::binary);
Person p1 = {"Alice", 25};
Person p2 = {"Bob", 30};
fout.write(reinterpret_cast<char*>(&p1), sizeof(p1));
fout.write(reinterpret_cast<char*>(&p2), sizeof(p2));
fout.close();
ios::binary:是一个文件打开模式标志,表示以二进制模式打开文件。在二进制模式下,数据会以字节形式直接写入文件,不进行额外的字符转换(如换行符转换),这对于存储结构体等二进制数据非常重要。
fout.write(reinterpret_cast<char*>(&p1), sizeof(p1));
fout.write(reinterpret_cast<char*>(&p2), sizeof(p2));
fout.write()
是ofstream
类的成员函数,用于将指定数量的字节写入文件。reinterpret_cast<char*>(&p1)
和reinterpret_cast<char*>(&p2)
:&p1
和&p2
分别是p1
和p2
结构体对象的地址。reinterpret_cast<char*>
是 C++ 中的强制类型转换操作符,它将结构体对象的地址转换为char*
类型。这是因为write
函数要求第一个参数是char*
类型的指针,指向要写入的数据的起始地址。
sizeof(p1)
和sizeof(p2)
:sizeof
是 C++ 的一个操作符,用于获取对象或类型所占用的字节数(这里是对象,不是地址)。这里sizeof(p1)
和sizeof(p2)
分别表示p1
和p2
结构体对象的大小,即要写入文件的字节数。
读取部分
ifstream fin("people.dat", ios::binary);
Person p;
while (fin.read(reinterpret_cast<char*>(&p), sizeof(p)))
{cout << "Name: " << p.name << ", Age: " << p.age << endl;
}
fin.close();
定义一个 Person
结构体的对象 p
,用于存储从文件中读取的数据。
while (fin.read(reinterpret_cast<char*>(&p), sizeof(p)))
{cout << "Name: " << p.name << ", Age: " << p.age << endl;
}
fin.read()
是ifstream
类的成员函数,用于从文件中读取指定数量的字节到指定的内存地址。reinterpret_cast<char*>(&p)
:将p
结构体对象的地址转换为char*
类型,作为read
函数的第一个参数,表示读取的数据要存储的起始地址。sizeof(p)
:表示要从文件中读取的字节数,即一个Person
结构体对象的大小。while (fin.read(...))
:read
函数在成功读取指定数量的字节时返回fin
对象本身,在布尔上下文中,fin
对象会被转换为bool
类型,如果读取成功则为true
,如果遇到文件结束符(EOF)或读取错误则为false
。因此,这个while
循环会不断读取文件,直到文件结束。- 在循环体中,使用
cout
输出从文件中读取的p
结构体对象的name
和age
成员。
注:
结构体的内存布局
Person
结构体的定义如下:
struct Person
{char name[20];int age;
};
在内存中,结构体的成员是连续存储的。name
数组占据前 20 个字节,age
这个 int
类型的成员接着存储在 name
之后,一般 int
类型在常见的系统上占 4 个字节。所以,Person
结构体的总大小(sizeof(Person)
)通常是 24 个字节(20 字节的 name
数组加上 4 字节的 age
)。
数据读取过程
Person p;
while (fin.read(reinterpret_cast<char*>(&p), sizeof(p)))
{cout << "Name: " << p.name << ", Age: " << p.age << endl;
}
- 定义一个
Person
结构体的对象p
,用于存储从文件中读取的数据,读出来的数据就存储在了这个定义的p中。 reinterpret_cast<char*>(&p)
:把p
这个Person
结构体对象的地址强制转换为char*
类型。这是因为read
函数要求第一个参数是char*
类型的指针,指向数据要存储的起始地址。sizeof(p)
:确定要从文件中读取的字节数,这里是Person
结构体的大小。read
函数会从文件中读取sizeof(p)
字节的数据,然后把这些数据依次存放到p
结构体对象的内存空间里。- 由于结构体成员在内存中是连续存储的,文件中的前 20 个字节会被存到
p.name
数组中,接下来的 4 个字节会被存到p.age
中。这样,文件中的二进制数据就和p
结构体的成员一一对应起来了。
小贴士
写二进制:write(reinterpret_cast<char*>(&obj),sizeof(obj) )
读二进制:read(reinterpret_cast<char*>(&obj),sizeof(obj))
必须用reinterpret_cast因为write/read操作的是char*指针
结构体对齐注意 :添加 #pragma pack(1) 或 alignas(1) 以避免字节填充问题
小结
std::stoi(str)、std::stod(str):字符串转 int/double
#include <iostream>
#include <string>using namespace std;int main() {string intStr = "123";string doubleStr = "3.14";int num = stoi(intStr);double dNum = stod(doubleStr);cout << "字符串 \"" << intStr << "\" 转 int 结果: " << num << endl;cout << "字符串 \"" << doubleStr << "\" 转 double 结果: " << dNum << endl;return 0;
}
用法示例;
相关文章:
C++ 的 输入输出流(I/O Streams)
什么是输入输出流 C 的输入输出操作是通过 流(stream) 机制实现的。 流——就是数据的流动通道,比如: 输入流:从设备(如键盘、文件)读取数据 → 程序 输出流:程序将数据写入设备&…...
Java 安全:如何防止 SQL 注入与 XSS 攻击?
Java 安全:如何防止 SQL 注入与 XSS 攻击? 在 Java 开发领域,安全问题至关重要,而 SQL 注入和 XSS 攻击是两种常见的安全威胁。本文将深入探讨如何有效防止这两种攻击,通过详细代码实例为您呈现解决方案。 一、SQL 注…...
leetcode day36 01背包问题 494
494 目标和 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - ,然后串联起所有整数,可以构造一个 表达式 : 例如,nums [2, 1] ,可以在 2 之前添加 ,在 1 之前添加 - &…...
31Calico网络插件的简单使用
环境准备: 1、删除Flannel 2、集群所有node节点拉取所需镜像(具体版本可以依据calico.yaml文件中): docker pull calico/cni:v3.25.0 docker pull calico/node:v3.25.0 docker pull calico/kube-controllers:v3.25.0一、安装Cali…...
进阶篇 第 5 篇:现代预测方法 - Prophet 与机器学习特征工程
进阶篇 第 5 篇:现代预测方法 - Prophet 与机器学习特征工程 (图片来源: ThisIsEngineering RAEng on Pexels) 在前几篇中,我们深入研究了经典的时间序列统计模型,如 ETS 和强大的 SARIMA 家族。它们在理论上成熟且应用广泛,但有…...
实用生活c语言脚本
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <time.h> // 清理临时文件目录 void clean_temp_directory() { const char* temp_dir "/tmp"; // 可自定义需要清理的目录 char command[1024]; …...
从零开始构建微博爬虫与数据分析系统
从零开始构建微博爬虫与数据分析系统 引言 社交媒体平台蕴含着海量的信息和数据,通过对这些数据的收集和分析,我们可以挖掘出有价值的见解。本文将详细介绍如何构建一个完整的微博爬虫和数据分析系统,从数据爬取、清洗、到多维度分析与可视…...
417. 太平洋大西洋水流问题
题目 有一个 m n 的矩形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。 这个岛被分割成一个由若干方形单元格组成的网格。给定一个 m x n 的整数矩阵 heights , heights…...
chili3d调试笔记8 打印零件属性
无效, 返回的是节点不是坐标啥的, 找他的属性 把document和selectednote(空集)传给handleshowproperty方法 怎么获得selectnotes和selectnotes的property值 有selectnotes运行这段就行了 明天再搞...
uniapp Vue2升级到Vue3,并发布到微信小程序的快捷方法
目录 前言:升级项目的两种方式步骤一、新建项目 【选择-默认模版】二、修改-pages.json三、补充-缺少的文件四、修改-Main.js按照 [官方文档-vue2升级vue3迁移指南](https://uniapp.dcloud.net.cn/tutorial/migration-to-vue3.html) 修改 五、升级-uni-ui扩展组件的…...
火山RTC 5 转推CDN 布局合成规则
实时音视频房间,转推CDN,文档: 转推直播--实时音视频-火山引擎 一、转推CDN 0、前提 * 在调用该接口前,你需要在[控制台](https://console.volcengine.com/rtc/workplaceRTC)开启转推直播功能。<br> * 调…...
Mujoco xml < sensor>
< sensor> jointposjointveljointactuatorfrcframequatgyroaccelerometerframeposframelinveltouchobjtype"site" objname"imu" 和site"imu"的区别python中与sensor有关的写法传感器名字索引第几个idid索引传感器名字传感器数量sensor中的…...
示例:spring xml+注解混合配置
以下是一个 Spring XML 注解的混合配置示例,结合了 XML 的基础设施配置(如数据源、事务管理器)和注解的便捷性(如依赖注入、事务声明)。所有业务层代码通过注解简化,但核心配置仍通过 XML 管理。 1. 项目结…...
同样的html标记,不同语言的文本,显示的字体和粗细会不一样吗
同样的 HTML 标记,在不同语言的文本下,显示出来的字体和粗细确实可能会不一样,原因如下: 🌍 不同语言默认字体不同 浏览器字体回退机制 CSS 里写的字体如果当前系统不支持,就会回退到下一个,比如…...
Linux进程6-alarm闹钟定时终止、raise发送信号、abort终止、pause挂起进程验证
目录 1.alarm函数 1.1关键点 1.2单个alarm函数定时 1.3两个alarm函数定时 2.raise函数 2.1核心行为 2.2 raise与 kill 的区别 2.3程序: 3.abort函数 4.pause 函数 4.1 pause简单挂起 4.2父进程挂起,子进程发信号 1.alarm函数 函数原型&…...
SpringCloud组件—Eureka
一.背景 1.问题提出 我们在一个父项目下写了两个子项目,需要两个子项目之间相互调用。我们可以发送HTTP请求来获取我们想要的资源,具体实现的方法有很多,可以用HttpURLConnection、HttpClient、Okhttp、 RestTemplate等。 举个例子&#x…...
类加载器与jvm的内存
1. 类加载器与内存的关系 类加载器的字节码放在方法区(元空间)中,同时类加载器加载类后类的信息(成员变量、成员方法及修饰符等)存放在方法区中。类的信息所占内存的回收要同时满足两个条件:类的实例被回收…...
【C++】新手入门指南(下)
文章目录 前言 一、引用 1.引用的概念和定义 2.引用的特性 3.引用的使用 4.const引用 5.指针和引用的关系 二、内联函数 三、nullptr 总结 前言 这篇续上篇的内容新手入门指南(上),继续带大家学习新知识。如果你感兴趣欢迎订购本专栏。 一、…...
el-table中el-input的autofocus无法自动聚焦的解决方案
需求 有一个表格展示了一些进度信息,进度信息可以修改,需要点击进度信息旁边的编辑按钮时,把进度变为输入框且自动聚焦,当鼠标失去焦点时自动请求更新接口。 注:本例以vue2 element UI为例 分析 这个需求看着挺简单…...
vimplus 如何修改语言支持的版本,以及如何跳转路径
vimplus修改语言版本 默认的vimplus支持c的版本是17 如何修改我们需要修改.ycm_extra_conf.py文件,这个文件管理了我们的插件配置 找到 把他修改为你想要的版本 增添路径 把你安装的gcc位置提供给他,默认的目前比较老 这里都是他提前为我们准备的路…...
麒麟V10安装MySQL8.4
1、下载安装包 wget https://cdn.mysql.com//Downloads/MySQL-8.4/mysql-8.4.5-1.el7.x86_64.rpm-bundle.tar2、解压 mkdir -p /opt/mysql tar -xvf mysql-8.4.5-1.el7.x86_64.rpm-bundle.tar -C /opt/mysql3、安装MySQL 3.1、卸载mariadb rpm -qa | grep mariadb rpm -e m…...
Varjo-XR3在UE5中,头显中间有一个方块一直显示
深色方块显示在屏幕中间的焦点区域中 屏幕中间的对焦区域中显示的黑色方块。 黑色方块是一个已知问题。它在 Varjo VRTemplate 中不可见,因为它使用具有推荐 VR 设置的前向渲染方法。 但是,如果你将延迟渲染方法与高级功能(如 Lumen、Nani…...
FastText 模型文本分类实验:从零到一的实战探索
在自然语言处理(NLP)领域,文本分类是一个基础而重要的任务,广泛应用于情感分析、主题识别、垃圾邮件过滤等多个场景。最近,我参与了一次基于 FastText 模型的文本分类实验,从数据预处理到模型构建、训练和评…...
不同经营性道路运输从业资格证申请条件全解析
在道路运输领域,获取相应的从业资格证是合法从事经营性运输工作的关键前提。不同类型的运输业务,如旅客运输、货物运输以及危险货物运输,对从业者有着不同的条件要求。 经营性道路旅客运输驾驶员 驾驶证年限:需取得相应的机动车…...
WHAT - 静态资源缓存穿透
文章目录 1. 动态哈希命名的基本思路2. 具体实现2.1 Vite/Webpack 配置动态哈希2.2 HTML 文件中动态引用手动引用使用 index.html 模板动态插入 2.3 结合 Cache-Control 避免缓存穿透2.4 适用于多环境的动态策略 总结 在多环境部署中,静态资源缓存穿透是一个常见问题…...
11、Refs:直接操控元素——React 19 DOM操作秘籍
一、元素操控的魔法本质 "Refs是巫师与麻瓜世界的连接通道,让开发者能像操控魔杖般精准控制DOM元素!"魔杖工坊的奥利凡德先生轻抚着魔杖,React/Vue的refs能量在杖尖跃动。 ——以神秘事务司的量子纠缠理论为基,揭示DOM…...
crontab 定时备份 mysql 数据库
1、使用 mysqldump 命令备份数据 1.1 备份全部数据库的数据和结构 mysqldump -uroot -p123456 -A > /data/backup/db.sql1.2 备份全部数据库的结构(加 -d 参数) mysqldump -uroot -p123456 -A -d > /data/backup/db.sql1.3 备份全部数据库的数据…...
数据库对象与权限管理-视图与索引管理
一、视图(View)管理 1. 视图的定义与本质 视图(View)是Oracle数据库中的逻辑表,它不直接存储数据,而是通过预定义的SQL查询动态生成结果集。视图的本质可以理解为: 虚拟表:用户可…...
德施曼重磅发布五大突破性技术及多款重磅新品,开启AI智能管家时代
当智能锁拥抱人文关怀,万物有灵便有了具象化的表达。 4月22日,智能锁领军品牌德施曼“万物有灵”2025全球新品发布会在乌镇隆重举行,为智能锁行业带来了AI时代的革新方案。 会上,德施曼创始人/CEO祝志凌重磅发布了五大突破性技术&…...
单元测试学习笔记(一)
自动化测试 通过测试工具/编程模拟手动测试步骤,全自动半自动执行测试用例,对比预期输出和实际输出,记录并统计测试结果,减少重复的工作量。 单元测试 针对最小的单元测试,Java中就是一个一个的方法就是一个一个的单…...
Rest Client插件写http文件直接发送请求
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言📌 插件介绍:🚀 安装方式:📚 使用示例:⚙️ 功能亮点: 前言 直接在 VSCode …...
LLM 论文精读(一)Scaling Laws for Neural Language Models
这篇文章是2020年发表的一篇LLM领域中非常重要的论文,由OpenAI发布,总结了LLM模型规模与训练数据token之间的比例关系,即我们熟知的 Scaling Laws,允许 通过观察小规模训练实验,提前预测大模型的效果表现,降…...
Spring AOP + Logback + MDC全链路日志追踪
1、背景 由于权限管理和安全规范,服务都部署到云上,只能通过日志系统查看日志。 然而,面对海量的日志数据,如何快速定位关键信息和调用链路是一个巨大的挑战。 2、方案调研 在 Spring Boot 中实现全链路日志追踪,核…...
SVT-AV1编码器初始化函数
一 函数解释 这个函数SVT-AV1编码器初始化的核心函数,负责配置编码器组件,分配资源并启动编码线程,以下时对每一行的详细解释。 函数签名和参数检查 EB_API EbErrorType svt_av1_enc_init(EbComponentType *svt_enc_component) { if (svt_enc…...
Unity 导出Excel表格
1.首先,需要导入EPPlus.dll;(我这里用的是Unity 2017.3.0f3) https://download.csdn.net/download/qq_41603955/90670669 2.代码如下: using UnityEngine; using UnityEditor; using System.IO; using OfficeOpenXm…...
Web前端开发技术——HTML5、CSS3、JavaScript
一、HTML 1.基本结构 <html lang "en"><head><meta charset"UTF-8"><meta name"Keywords" content""><meta name"Description" content""><title>Web网页标题</title&g…...
野外价值观:在真实世界的语言模型互动中发现并分析价值观
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
【华为HCIP | 华为数通工程师】821—多选解析—第十二页
多选727、某台路由器的输出信息如下所示,以下描述正确的有哪些选项? A、路由器Router ID为10.0.1.1 B、路由器Router ID为10.0.2.2。 C、本路由器的接口地址为10.0.12.2。 D、本路由器是DR。 解析:display ospf peer //获取的OSPF邻居信…...
Selenium 在爬取过程中,网络响应被退出的解决方案
我在使用 Selenium 爬取网站的时候,直接get url ,却立马闪退,遇到了获取网络响应直接被退出的问题。 这通常是由于 反爬机制、浏览器检测 或 网络限制 导致的。 以下是 完整排查与解决方案: 1. 检查常见原因 问题类型典型表现可…...
楼宇自控怎样全方位融入建筑领域,为绿色建筑发展添砖加瓦
在全球积极倡导可持续发展的大背景下,绿色建筑已成为建筑领域发展的必然趋势。绿色建筑旨在减少对环境的负面影响,提高能源利用效率,为用户提供健康、舒适的室内环境。而楼宇自控系统作为建筑智能化的核心组成部分,正以其独特的技…...
语音合成(TTS)从零搭建一个完整的TTS系统-第二节-中文转拼音
一、概述 本节我们进行语音合成前端中的第二步,需要把中文转换为拼音。通过python和c两种语言进行实现,python可以直接调用pypinyin库实现。c实现是本节的重点,首先根据词典进行分词,接着把分词后的词进行词典映射,得到…...
基于springboot的停车位管理系统(源码+数据库)
12基于springboot的停车位管理系统:前端 thymeleaf、Jquery、bootstrap,后端 Springboot、Mybatis,系统角色分为:用户、管理员,管理员在管理后台录入车位信息,用户在线查找车位、预约车位,解决停…...
深入理解 Spring @Configuration 注解
在 Spring 框架中,@Configuration 注解是一个非常重要的工具,它用于定义配置类,这些类可以包含 Bean 定义方法。通过使用 @Configuration 和 @Bean 注解,开发者能够以编程方式创建和管理应用程序上下文中的 Bean。本文将详细介绍 @Configuration 注解的作用、如何使用它以及…...
15.三数之和(LeetCode)java
个人理解: 1.使用双指针做法,首先对数组进行排序 第一重for循环控制第一个数,对数组进行遍历。双指针初始化为lefti1, rigthnums.length-1。然后使用while循环移动双指针寻找合适的数。因为返回的是数,不是下标,数不能…...
2022年全国职业院校技能大赛 高职组 “大数据技术与应用” 赛项赛卷(10卷)任务书
2022年全国职业院校技能大赛 高职组 “大数据技术与应用” 赛项赛卷(10卷)任务书 模块A:大数据平台搭建(容器环境)(15分)任务一:Hadoop 伪分布式安装配置任务二:Flume安装…...
Redis—内存淘汰策略
记:全体LRU,ttl LRU,全体LFU,ttl LFU,全体随机,ttl随机,最快过期,不淘汰(八种) Redis 实现的是一种近似 LRU 算法,目的是为了更好的节约内存&…...
新能源汽车可视化大屏系统毕业设计
以下是一个基于Python和Flask框架的新能源汽车可视化大屏系统后台代码示例。这个系统提供API接口用于前端大屏展示新能源汽车相关数据。 主应用文件 (app.py) python from flask import Flask, jsonify, request from flask_cors import CORS import random from datetime imp…...
02-keil5的配置和使用
一、创建工程 1、在菜单栏”Project”,在弹出的下拉菜单,选择“New uVision Project”。 2、在弹出的对话框,填写工程的名字,例如工程名字为project。 3、为保存的工程,选择对应的芯片。 4、为当前工程,添…...
电脑硬盘丢失怎么找回?解决硬盘数据恢复的2种方法
无论是个人用户还是企业用户来讲,存储在磁盘中的文档、图片、视频、音频等数据都具有相当的价值。但在日常使用过程中,误删操作、病毒攻击、硬件故障等情况都可能造成电脑硬盘突然消失不见数据丢失。面对电脑硬盘丢失这类问题时,采取正确的应…...
【Spring】依赖注入的方式:构造方法、setter注入、字段注入
在Spring框架中,除了构造器注入(Constructor Injection)和Setter注入(Setter Injection),还有一种依赖注入方式:字段注入(Field Injection)。字段注入通过在Bean的字段上…...