C++输入输出流第二弹:文件输入输出流and字符串输入输出流

news2025/3/26 16:30:12

目录

文件输入输出流(重点)

文件输入流

文件输入流对象的创建

对测试代码进行解读:

1. 代码核心逻辑

2. 读取过程详解

3. 关键特性总结

4. 注意事项

5. 完整流程示例

这里既然提到了 >> 流,那么就对他进行进一步的认识

1. >> 操作符的默认行为

2. 对“只能提取一次”的误解

3. 循环读取与换行符处理

4. 常见误区与解决方案

5. 总结

对流的解读中有提到了只要流开启可以继续 >> 提取,那么什么时候流关闭呢?

流(Stream)关闭的时机详解

1. 核心误区澄清

2. 流的生命周期

3. 代码示例解析

4. 换行符的作用

5. 需要手动关闭流的场景

6. 常见问题解答

7. 总结

按行读取

读取指定字节数的内容

文件输出流

字符串输入输出流

字符串输入流

字符串输出流


文件输入输出流(重点)

所谓“文件”,一般指存储在外部介质上数据的集合。一批数据是以文件的形式存放在外部介质上的。操作系统是以文件为单位对数据进行管理的。要向外部介质上存储数据也必须先建立一个文件(以文件名标识),才能向它输出数据。外存文件包括磁盘文件、光盘文件和U盘文件。目前使用最广泛的是磁盘文件。

文件流是以外存文件为输入输出对象的数据流。

文件输入流是从外存文件流向内存的数据,文件输出流是从内存流向外存文件的数据。每一个文件流都有一个内存缓冲区与之对应。文件流本身不是文件,而只是以文件为输入输出对象的流。若要对磁盘文件输入输出,就必须通过文件流来实现。

C++ 对文件进行操作的流类型有三个:

ifstream(文件输入流)

ofstream(文件输出流)

fstream (文件输入输出流)

他们的构造函数形式都很类似:

ifstream();
explicit ifstream(const char* filename, openmode mode = ios_base::in);
explicit ifstream(const string & filename, openmode mode = ios_base::in);

ofstream();
explicit ofstream(const char* filename, openmode mode = ios_base::out);
explicit ofstream(const string & filename, openmode mode = ios_base::out);

fstream();
explicit fstream(const char* filename, openmode mode = ios_base::in|out);
explicit fstream(const string & filename, openmode mode = ios_base::in|out);

补充:explicit关键字的意义 —— 禁止隐式转换

上面这些函数都有默认值,不希望使用一个文件名就可以创建一个对象。

隐式类型转换是编译器读到,1时看到1正好可以使用这个1来创建一个临时的point对象,然后调用拷贝构造创建对象pt6。

image-20240311164623549

文件输入流

文件输入流对象的创建

首先我们要明确使用文件输入流的信息传输方向:文件 --》 文件输入流对象的缓冲区 --》通过输入流运算符-》 程序中的数据

根据上述的说明,我们可以将输入流对象的创建分为两类:

  1. 可以使用无参构造创建ifstream对象,再使用open函数将这个文件输入流对象与文件绑定(若文件不存在,则文件输入流进入failbit状态);

  2. 也可以使用有参构造创建ifstream对象,在创建时就将流对象与文件绑定(不是直接输入到缓冲区而是等待使用时可以调用),后续操作这个流对象就可以对文件进行相应操作。

通过参考文档中对ifstream的构造函数的描述,文件输入流对象的有参构造需要输入文件名,可以指定打开模式(不指定则使用in模式,为读打开)

#include <fstream>
void test0(){
    ifstream ifs;
    ifs.open("test1.cc");
    
    ifstream ifs2("test2.cc");
    
    string filename = "test3.cc";
    ifstream ifs3(filename);
}

image-20240311172728085

下面为测试代码可以自行测试

#include <fstream>
#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::ifstream;
void test0()
{
    ifstream ifs;
    //文件输入流对象是从文件中读取内容
    //需要绑定到一个存在的文件
    // ifs.open("cout.cpp");
    ifs.open("cout.cc");
    if(!ifs.good())
    {
        cout << "open file is fail!" << endl;
        return;
    }
    //默认以换行符,空格作为间隔,这里注意只是跳过,还会留在缓冲区
    //一次读取一个字符串
    string word;
    //只要ifs是goodbit状态就会循环
    //等价于while(ifs.good),会进行隐式布尔类型转换,并检查
    while(ifs >> word)
    {
        cout << word << endl;
    }
    //规范操作,使用完之后关闭流
    ifs.close();
}
int main()
{
    test0();
    return 0;
}

对测试代码进行解读:

以下是针对图片中代码的读取机制解析,结合 C++ 输入流的特性:


1. 代码核心逻辑

图片中的代码片段:

string word;
while (ifs >> word) {  // 关键点:输入流操作
    cout << word << endl;
}

功能:从输入流 ifs 中逐个读取以 空格或换行符分隔 的字符串,并输出每个字符串。


2. 读取过程详解

(1) 默认分隔规则

  • 分隔符operator>> 在读取字符串时默认以 空白字符(空格、换行符、制表符等) 作为分隔符。

  • 行为:每次读取会 跳过前导空白字符,直到遇到非空白字符开始读取,再遇到空白字符时停止。

(2) 单次读取步骤

ifs >> word
  1. 检查流状态:若 ifs 处于 good() 状态(无错误、未到文件尾),继续读取。

  2. 跳过空白:忽略当前位置开始的连续空格/换行符。

  3. 读取内容:将后续非空白字符存入 word,直到遇到下一个空白字符或文件尾。

  4. 更新流状态:若读取成功,ifs 保持 good();若失败(如文件尾),ifs 置为 eof()fail()

(3) 循环条件 while (ifs >> word)

  • 本质:等价于 while (ifs.good()) 但更安全。

  • 执行流程

    1. 执行 ifs >> word(尝试读取)。

    2. 检查流的隐式布尔转换结果:

      • 若读取成功(流有效):返回 true,进入循环体。

      • 若读取失败(如文件尾或错误):返回 false,退出循环。


3. 关键特性总结
特性说明
自动跳过空白无需手动处理空格/换行符,流操作符自动跳过。
流状态驱动循环循环条件隐式检查 ifs 的状态,避免死循环。
按需读取每次循环读取一个逻辑单元(以空白分隔的字符串)。
错误处理内嵌若流进入错误状态(如类型不匹配),循环自动终止。

4. 注意事项

(1) 文件尾与错误状态

  • 文件尾(EOF):当读取到文件末尾时,ifs.eof()true,循环终止。

  • 错误状态:若输入内容与目标类型不匹配(如试图将字母读入 int),ifs.fail()true,循环也会终止。

(2) 关闭流的正确方式

  • 自动释放:通常不需要手动调用 ifs.close(),输入流对象会在析构时自动关闭。

  • 手动关闭场景:若需要提前释放资源(如重新打开文件),可显式调用 ifs.close()


5. 完整流程示例

假设输入文件内容为:

Hello   World
C++   Input

执行过程

  1. 第一次循环:读取 "Hello",输出 Hello

  2. 第二次循环:跳过空格,读取 "World",输出 World

  3. 第三次循环:跳过换行符,读取 "C++",输出 C++

  4. 第四次循环:跳过空格,读取 "Input",输出 Input

  5. 第五次读取:遇到文件尾,ifs >> word 失败,循环终止。


这里既然提到了 >> 流,那么就对他进行进一步的认识

1. >> 操作符的默认行为

在 C++ 中,流提取符 >> 默认以空白字符(空格、换行符 \n、制表符 \t 等)作为分隔符。其工作流程如下:

  1. 跳过前导空白:自动忽略输入流中起始位置的所有空白字符。

  2. 读取非空白内容:从第一个非空白字符开始读取,直到遇到下一个空白字符或流结束。

  3. 终止条件:遇到空白字符或流结束时,停止本次提取。

示例代码

int num;
string str;

// 输入 "  42\nHello"(含前导空格和换行符)
cin >> num;  // 读取 42(跳过前导空格,换行符终止读取)
cin >> str;  // 读取 "Hello"(跳过换行符,继续读取)

2. 对“只能提取一次”的误解

用户的疑问可能源于以下观察: 当输入流中存在换行符时,cin >> 似乎只能提取一次数据实际原因

  • 换行符作为分隔符>> 遇到换行符时会终止当前读取,但流状态仍有效

  • 后续读取不受限:只要流未关闭或未到文件尾,可以继续使用 >> 提取后续数据。

示例

int a, b;
// 输入 "10\n20"
cin >> a;  // 读取 10(换行符终止本次读取,但流仍有效)
cin >> b;  // 读取 20(跳过换行符,继续读取)
cout << a + b;  // 输出 30

3. 循环读取与换行符处理

若需连续读取多行数据,可通过循环实现。换行符不会导致流终止,只是分隔数据单元。

示例:逐词读取多行文本

string word;
while (cin >> word) {  // 每次读取一个以空白分隔的字符串
    cout << "Read: " << word << endl;
}

输入

Hello World
C++ Input

输出

Read: Hello
Read: World
Read: C++
Read: Input

4. 常见误区与解决方案
误区场景原因分析解决方案
读取含空格的字符串时被截断>> 默认以空格为分隔符使用 getline(cin, str) 按行读取
换行符导致后续读取失败未正确处理流状态或缓冲区结合 cin.ignore() 清除残留字符
混合使用 >>getline 时出错>> 残留换行符影响 getlinegetline 前调用 cin.ignore()

示例:安全混合使用 >>getline

int id;
string name;

cin >> id;                // 读取整数(如输入 123)
cin.ignore(100, '\n');    // 清除残留的换行符
getline(cin, name);       // 读取完整一行(如输入 "Alice Smith")

5. 总结
  • >> 的终止条件:遇到空白字符(包括换行符)时停止当前读取,但流仍可继续使用。

  • 循环读取可行性:只要流状态有效,可多次调用 >> 提取数据。

  • 换行符处理:需注意残留换行符对后续操作的影响,必要时使用 ignore() 清理。

对流的解读中有提到了只要流开启可以继续 >> 提取,那么什么时候流关闭呢?

流(Stream)关闭的时机详解

根据图片中的代码和描述,您对流关闭的机制存在误解。以下是针对问题的详细解答:


1. 核心误区澄清

您提到的 “流在遇到换行符时会断掉”“流提取符只能提取一次” 是对流操作的两个常见误解:

  • 误解1:换行符会导致流关闭。 事实:换行符(\n)仅是 数据分隔符,它只会终止当前读取操作,但 不会关闭流

  • 误解2:流提取符 (>>) 只能提取一次数据。 事实:只要流状态正常(未到文件尾或发生错误),可以 多次调用 >> 提取数据


2. 流的生命周期

流的关闭(释放资源)与读取操作的终止是两个独立的概念:

(1) 流的关闭时机

  • 自动关闭:当流对象(如 ifstreamistringstream离开作用域时,析构函数会自动调用 close() 方法释放资源。

  • 手动关闭:可以显式调用 stream.close() 提前关闭流(例如需要重新打开另一个文件时)。

示例

{
    ifstream ifs("data.txt");  // 打开流
    // 读取操作...
}  // 作用域结束,ifs 析构时自动调用 close()

(2) 读取操作的终止

  • >> 遇到分隔符(如换行符、空格)时,当前读取操作终止,但流仍保持打开状态。

  • 流仅在以下情况彻底关闭或失效:

    • 显式调用 close()

    • 流对象被销毁(如离开作用域)。

    • 流到达文件尾(eof()true)。


3. 代码示例解析

假设图片中的代码为:

ifstream ifs("input.txt");
string word;
while (ifs >> word) {  // 每次读取一个以空白分隔的字符串
    cout << word << endl;
}

执行过程

  1. 流保持打开:循环中每次 ifs >> word 读取一个字符串(跳过换行符、空格),但流始终未关闭。

  2. 终止条件:当文件内容全部读取完毕(到达文件尾),ifs >> word 会失败,循环退出。

  3. 流关闭ifs 在程序块结束时自动关闭(析构时调用 close())。


4. 换行符的作用
  • 仅作为分隔符:换行符用于分割数据单元(如 "Hello\nWorld" 会被拆分为 "Hello""World")。

  • 不影响流状态:换行符不会导致流关闭,甚至不会影响后续读取操作。

示例

int a, b;
// 输入:"10\n20"
cin >> a;  // 读取 10(换行符终止本次读取,但流仍有效)
cin >> b;  // 读取 20(跳过换行符)
cout << a + b;  // 输出 30

5. 需要手动关闭流的场景
场景操作
需要重新绑定到其他文件close(),再 open()
确保资源立即释放(如写入文件)显式调用 close()

示例

ifstream ifs("data1.txt");
// 读取 data1.txt...
ifs.close();          // 手动关闭
ifs.open("data2.txt"); // 重新打开另一个文件

6. 常见问题解答

Q1:为什么有时读取后流无法继续使用?

  • 可能原因

    1. 流到达文件尾(eof()true)。

    2. 流进入错误状态(如尝试读取非数字到 int 变量)。

  • 解决方法:检查流状态并重置:

    if (ifs.fail()) {
        ifs.clear();  // 清除错误状态
        ifs.ignore(); // 跳过无效输入
    }

Q2:换行符残留导致的问题如何解决?

  • 场景:混合使用 >>getline 时,>> 可能残留换行符影响 getline

  • 解决方案:在 getline 前清除缓冲区:

    int num;
    string line;
    
    cin >> num;
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 清除残留换行符
    getline(cin, line);

7. 总结
关键点说明
换行符是分隔符,不关闭流仅终止当前读取操作,流仍可继续使用。
流关闭的时机自动(析构时)或手动调用 close()
循环读取的可行性只要流状态正常,可多次调用 >> 提取数据。

通过这一机制,流可以高效处理复杂输入场景,同时避免资源泄漏。如果需要按行处理数据,建议使用 getline 替代 >>

  • 文件模式

根据不同的情况,对文件的读写操作,可以采用不同的文件打开模式。文件模式在 GNU GCC7.4 源码实现中,是用一个叫做 openmode 的枚举类型定义的,它位于 ios_base 类中。文件模式一共有六种,它们分别是:

in : 输入,文件将允许做读操作;如果文件不存在,打开失败

out : 输出,文件将允许做写操作;如果文件不存在,则直接创建一个

app : 追加,写入将始终发生在文件的末尾

ate : 末尾,写入最初在文件的末尾

trunc : 截断,如果打开的文件存在,其内容将被丢弃,其大小被截断为零

binary : 二进制,读取或写入文件的数据为二进制形式

image-20240302194238908

按行读取

遇到换行符就会断开。

方法一:使用ifstream类中的成员函数getline,这种方式是兼容C的写法

image-20231114153418881

image-20231114165346910

ifstream ifs("test.cc");
//方法一,兼容C的写法,使用较少
char buff[100] = {0};
while(ifs.getline(buff,sizeof(buff))){
    cout << buff << endl;
    memset(buff,0,sizeof(buff));
}

准备好一片空间存放一行的内容,但是有一个弊端就是我们并不知道一行的内容会有多少个字符,如果超过了设置的字符长度将无法完成该行的读取,也将跳出循环。

方法二:

使用<string>提供的getline方法,工作中更常用

image-20231114172656364

image-20231114172732337

image-20231114172826427

传入输入流对象、string、分隔符(默认换行符为分隔符)

//更方便,使用更多
string line;
while(getline(ifs,line)){
    cout << line << endl;
}

将一行的内容交给一个string对象去存储,不用再关心字符数了。

image-20240311172652416

下面为测试代码,可以自行测试

#include <string.h>
#include <fstream>
#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::ifstream;
using std::string;

void test0()
{
    ifstream ifs;
    // 文件输入流对象是从文件中读取内容
    // 需要绑定到一个存在的文件
    //  ifs.open("cout.cpp");
    ifs.open("cout.cc");
    if (!ifs.good())
    {
        cout << "open file is fail!" << endl;
        return;
    }
    // 默认以换行符,空格作为间隔
    // 一次读取一个字符串
    string word;
    // 只要ifs是goodbit状态就会循环
    while (ifs >> word)
    {
        cout << word << endl;
    }
    // 规范操作,使用完之后关闭流
    ifs.close();
}
void test1()
{
    ifstream ifs;
    // 文件输入流对象是从文件中读取内容
    // 需要绑定到一个存在的文件
    //  ifs.open("cout.cpp");
    ifs.open("cout.cc");
    if (!ifs.good())
    {
        cout << "open file is fail!" << endl;
        return;
    }
    // 方法一:兼容c的写法,使用较少
    // 建立一个数组,将数组初始化为0
    //  char buff[100] = {0};
    //  while(ifs.getline(buff,sizeof(buff)))
    //  {
    //      cout << buff << endl;
    //      memset(buff,0,sizeof(buff));
    //  }
    // 方法2
    string str;
    while (std::getline(ifs, str))
    {
        cout << str << endl;
    }
    // 规范操作,使用完之后关闭流
    ifs.close();
}
int main()
{
    // test0();
    test1();
    return 0;
}

读取指定字节数的内容

read函数 + seekg函数 + tellg函数

通过文件输入流对象读取到的内容交给字符数组,同时需要传入要读取的字符数(读取字符存到字符数组中)

image-20231121220137273

image-20231121220333589

要知道字符数就需要用上tellg函数了,可以这样理解,从文件中读取内容时存在一个文件游标,读取是从文件游标的位置开始读取的。tellg就是用来获取游标位置的,而seekg则是用来设置游标位置的。

image-20231121220941483

调用seekg时有两种方式,一种是绝对位置(比如将游标设为流的开始位置,可以直接传参数0);一种是相对位置,传入偏移量和基准点——第一个参数:相对基准点需要向前偏移则传入负数,不偏移则传入0,需要向后偏移则传入正数。第二个参数格式为std::ios::beg(以流的开始位置为例)

image-20231121221123214

如图示:

image-20240311174215440

例子:读取一个文件的全部内容

void test0(){
    string filename = "test.cc";
    ifstream ifs(filename); 

    if(!ifs){
        cerr << "ifs open file fail!";
        return;
    }
    
    //读取一个文件的所有内容先要获取文件的大小
    //将游标放到了文件的最后(尾后)流的结尾尾后
    ifs.seekg(0,std::ios::end);
    long length = ifs.tellg();//获取尾后下标,实际就是总的字符数
    cout << length << endl;

    char * pdata = new char[length]();
    //需要将游标再放置到文件开头
    ifs.seekg(0,std::ios::beg);
    ifs.read(pdata,length);

    //content包含了文件的所有内容,包括空格、换行
    string content(pdata);
    cout << "content:" << content << endl;
    /* cout << pdata << endl; */
    ifs.close();
}

还可以在创建输入流对象时指定ate模式(打开后会自动寻位到结尾所以打印出来游标就是结尾的位置),省去第一步将游标置流末尾处的操作。

下面为测试代码,可以自行测试

#include <string.h>
#include <fstream>
#include <iostream>
#include <string>
#include <unistd.h>

using std::cin;
using std::cout;
using std::endl;
using std::ifstream;
using std::string;

void test0()
{
    string filename  = "cout.cc";
    ifstream ifs(filename, std::ios::ate);

    if (!ifs)
    {
        std::cerr << "ifs open file fail!";
        return;
    }
    cout << ifs.tellg()<<endl;
    // 读取一个文件的所有内容先要获取文件的大小
    // 将游标放到了文件的最后(尾后)流的结尾尾后
    // ifs.seekg(0, std::ios::end);
    long length = ifs.tellg(); // 获取尾后下标,实际就是总的字符数
    cout << length << endl;

    char *pdata = new char[length]();
    // 需要将游标再放置到文件开头
    ifs.seekg(0, std::ios::beg);
    ifs.read(pdata, length);

    // content包含了文件的所有内容,包括空格、换行
    string content(pdata);
    cout << "content:" << content << endl;
    /* cout << pdata << endl; */
    ifs.close();
}
int main()
{
    test0();
    return 0;
}

文件输出流

文件输出流的作用是将流对象保存的内容传输给文件

image-20231121223550199

ofstream对象的创建与ifstream对象的创建类似

#include <fstream>
void test0(){
    ofstream ofs;
    ofs.open("test1.cc");
    
    ofstream ofs2("test2.cc");
    
    string filename = "test3.cc";
    ofstream ofs3(filename);
}

推测一下,如果文件输出流对象绑定的文件不存在,可以吗?

—— 可以,如果文件不存在,就创建出来

  • 通过输出流运算符写内容

ofstream对象绑定文件后,可以往该文件中写入内容

string filename = "test3.cc";
ofstream ofs3(filename);

string line("hello,world!\n");
ofs << line; 

ofs.close();

内容传输的过程是string中的内容传给ofs对象,再传给这个对象绑定的文件。

但是我们会发现进行多次写入,并没有保留下多次的内容,因为这种创建方式会使打开模式默认为std::ios::out,每次都会清空文件的内容

为了实现在文件流结尾追加写入内容的效果,可以在创建流对象时指定打开模式为std::ios::app(追加模式)

string filename = "test3.cc";
ofstream ofs3(filename,std::ios::app);//不能使用无参构造,不能将参数传给对象,所以使用有参构造 

  • 通过write函数写内容

除了使用输出流运算符<< 将内容传输给文件输出流对象(传给ofstream对象就是将内容传到其绑定的文件中),还可以使用write函数进行传输

image-20231121224635781

char buff[100] = "hello,world!";
ofs.write(buff,strlen(buff));
const char* a = "HEllo!\n";
ofs,write(a,sizeof(a));

strig str("summer\n");
ofs.write(str.c_str(),str.size());

  • 动态查看指令

为了更方便地查看多次写入的效果(动态查看文件的内容)可以使用指令

tail 文件名 -F   //动态查看文件内容

ctrl + c        //退出查看

image-20231121224849472

字符串输入输出流

字符串I/O是内存中的字符串对象与字符串输入输出流对象之间做内容传输的数据流,通常用来做格式转换。

C++ 对字符串进行操作的流类型有三个:

istringstream (字符串输入流)

ostringstream (字符串输出流)

stringstream (字符串输入输出流)

它们的构造函数形式都很类似:

istringstream(): istringstream(ios_base::in) { }
explicit istringstream(openmode mode = ios_base::in);
explicit istringstream(const string& str, openmode mode = ios_base::in);

ostringstream(): ostringstream(ios_base::out) { }
explicit ostringstream(openmode mode = ios_base::out);
explicit ostringstream(const string& str, openmode mode = ios_base::out);

stringstream(): stringstream(in|out) { }
explicit stringstream(openmode mode = ios_base::in|ios_base::out);
explicit stringstream(const string& str, openmode mode = ios_base::in|ios_base::out);

字符串输入流

将字符串的内容传输给字符串输入流对象,再通过这个对象进行字符串的处理(解析)

创建字符串输入流对象时传入c++字符串,字符串的内容就被保存在了输入流对象的缓冲区中。之后可以通过输入流运算符将字符串内容输出给不同的变量,起到了字符串分隔的作用。

image-20231123173647213

——如下,将字符串s的内容传给了两个int型数据

void test0(){
    string s("123 456");
    int num = 0;
    int num2 = 0;
    //将字符串内容传递给了字符串输入流对象  
    istringstream iss(s);
    iss >> num >> num2;
    cout << "num:" << num << endl;
    cout << "num2:" << num2 << endl;
}

因为输入流运算符会默认以空格符作为分隔符,字符串123 456中含有一个空格符,那么传输时会将空格前的123传给num,空格后的456传给num2,因为num和num2是int型数据,所以编译器会以int型数据来理解缓冲区释出的内容,将num和num2赋值为123和456

字符串输入流通常用来处理字符串内容,比如读取配置文件

//myserver.conf
ip 192.168.0.0
port 8888
dir ~HaiBao/53th/day06
    
//readConf.cc
void readConfig(const string & filename){
    ifstream ifs(filename);
    if(!ifs.good()){
        cout << "open file fail!" << endl;
        return;
    }
    
    string line;
    string key, value;
    while(getline(ifs,line)){
        istringstream iss(line);
        iss >> key >> value;
        cout << key << " -----> " << value << endl; 
    }
}

void test0(){
    readConfig("myserver.conf");
}

image-20240312110625185

字符串输出流

通常的用途就是将各种类型的数据转换成字符串类型

void test0(){
    int num = 123, num2 = 456;
    ostringstream oss;
    //把所有的内容都传给了字符串输出流对象
    oss << "num = " << num << " , num2 = " << num2 << endl;
    cout << oss.str() << endl;
}

将字符串、int型数据、字符串、int型数据统统传给了字符串输出流对象,存在其缓冲区中,利用它的str函数,全部转为string类型并完成拼接。

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

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

相关文章

TCP传输---计算机网络

TCP结构 源端口和目标端口&#xff1a;标识通信的应用程序。序列号&#xff1a;标记发送的数据段的顺序序号。确认号 ( ACK)&#xff1a;确认接收到的数据序号。标志位&#xff1a;控制连接状态&#xff0c;包括 SYN&#xff08;同步&#xff09;、ACK&#xff08;确认&#xf…

基于TweenMax和SVG的炫酷弹性进度条动画特效

这是一款效果非常炫酷的基于TweenMax和SVG的炫酷弹性进度条动画特效。该弹性进度条特效在点击触发按钮之后&#xff0c;按钮会变形为进度条&#xff0c;然后一个滑块在它上面滑动&#xff0c;就像重物滑过绳子的感觉&#xff0c;非常有创意。 在线演示 使用方法 该弹性进度条效…

python面试高频考点(深度学习大模型方向)

1. python中yeild和return的区别&#xff1f; 2. 介绍一下pytohn中的上下文管理器&#xff1f; 在Python中&#xff0c;上下文管理器&#xff08;Context Manager&#xff09; 是一种通过 with 语句管理资源的协议&#xff0c;确保资源&#xff08;如文件、数据库连接、线程锁…

六、重学C++—深入探索new delete

上一章节&#xff1a; 五、重学C—类(封装继承)-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/146458436?spm1001.2014.3001.5502 本章节代码&#xff1a; cpp CuiQingCheng/cppstudy - 码云 - 开源中国https://gitee.com/cuiqingcheng/cppstudy/tree/m…

Unity代码热更新和资源热更新

知识点来源&#xff1a;人间自有韬哥在&#xff0c;hybridclr,豆包 目录 一、代码热更新1.代码热更新概述2.HybridCLR 二、资源热更新1.资源热更新概述2.AB包2.1.AB包的加载2.2.卸载AB包2.3.加载AB包依赖包2.4.获取MD52.5.生成对比文件2.6.更新AB包 3.Addressable3.1.AssetRef…

于纷扰中寻静谧:正念观照的智慧之旅

在现代社会的快节奏浪潮中&#xff0c;我们仿若被裹挟前行的浮萍&#xff0c;生活的压力与信息的洪流冲刷着内心的宁静&#xff0c;焦虑与迷茫如影随形。而正念观照&#xff0c;恰似一叶扁舟&#xff0c;能引领我们在心灵的海洋中回归自我&#xff0c;探寻那片澄澈之境。 正念…

环境评价分析中土地利用现状图的制作方法

在环境评价中&#xff0c;土地利用现状图是重要的基础图件&#xff0c;用于分析项目区域的土地利用类型、分布格局及其生态环境特征。 以下是制作土地利用现状图的详细步骤和方法&#xff1a; 一、前期准备工作 确定制图范围和比例尺 根据评价范围确定制图区域边界 常用比例…

编程题记录3

九宫幻方 题目链接&#xff1a;https://www.lanqiao.cn/problems/100/learning/?page1&first_category_id1&second_category_id3&tags%E7%9C%81%E8%B5%9B&tag_relationintersection 先旋转、镜像得到所有的情况&#xff0c;可以发现情况是可以暴力得出的。…

sql语句给表添加一个递增列

SSMS–》视图-》数据库(表)-》新建查询 ALTER TABLE [表名] DROP COLUMN ID ALTER TABLE [表名] ADD ID INT IDENTITY(1,1)执行完以上操作&#xff0c;会在表的最后一列添加一个自增字段 接下来如何把最后一个字段放到第一个字段呢&#xff1f; 假如sqlserver 表test 有以下…

vue java 实现大地图切片上传

文章目录 一、项目背景二、页面三、代码1.前端2.mock-i18n.js文件3.xx.js文件定义方法4.配置文件 application.properties5.后端方法 四、易错点易错点1&#xff1a;前端要进行分片切割&#xff0c;然后再分片上传。易错点2&#xff1a;后端配置文件要配置。易错点3&#xff1a…

langchain+ollama+deepseek的部署(win)

ANACONDA 安装 官网&#xff1a;Download Anaconda Distribution | Anaconda 配置系统环境 在系统变量中配置 检查是否配置成功 通过 cmd 窗口输入&#xff1a; conda info 如图&#xff1a;表示成功 配置你的虚拟环境 二、安装 ollama allama 安装 官网地址&#xff1a…

deepseek实战教程-第四篇开放平台接口文档使用

第二篇讲解了如何本地安装大模型&#xff0c;然后编写一个基于jsspringboot的项目&#xff0c;通过页面实现对话的功能。实际上&#xff0c;上面的demo用到是deepseek提供的接口&#xff0c;那么deepseek共提供了多少接口呢&#xff1f;这就要讨论到deepseek的接口库了&#xf…

一站式电脑工具箱,功能全面且实用

小明工具箱是一款集成了系统设置、维护工具、实用工具、图像处理等四大类工具的电脑工具箱&#xff0c;涵盖了上百种实用工具&#xff0c;能够满足用户在文件管理、文本处理、系统优化、图像处理等多方面的需求。 初次使用&#xff0c;需双击软件&#xff0c;便会自动将工具解压…

那些正常的动态规划

文章目录 前言动态规划到底是啥&#xff1f; 线性dp最长上升子序列子集和子序列和子串的区别内容分析 最大上升子序列例题1——[NOIP2004 提高组] 合唱队形分析 最长公共子序列最长公共子串 平面dp例题2——[NOIP2000 提高组] 方格取数分析 例题3——[NOIP2008 提高组] 传纸条分…

华为交换相关

端口模式 &#xff08;1&#xff09;access&#xff1a;只能属于单个VLAN&#xff0c;一般用于连接计算机端口 &#xff08;2&#xff09;trunk&#xff1a;端口允许多个VLAN通过&#xff0c;可以接收和发送多个VLAN报文&#xff0c;默认情况下只有管理VLAN不携带标签信息 &…

Chrome Performance 面板完全指南:从卡顿到丝滑的终极调试术

1.写在前面 前端性能调试是优化网页加载速度和运行效率的关键步骤&#xff0c;Chrome DevTools 的 Performance 面板 是核心工具; 2.Performance 面板使用步骤 ★ 基础 打开面板 在 Chrome 中按 F12 → 切换到 Performance 标签页。 开始录制 方式一&#xff1a;点击 ⚫️ 圆…

JDK 24:Java 24 中的新功能

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;历代文学&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编程&#xff0c;高并发设计&#xf…

ubuntu服务器server版安装,ssh远程连接xmanager管理,改ip网络连接。图文教程

ventoy启动服务器版iso镜像&#xff0c;注意看server名称&#xff0c;跟之前desktop版ubuntu不一样。没有gui界面。好&#xff0c;进入命令行界面。语言彻底没汉化了&#xff0c;选英文吧&#xff0c;别的更看不懂。 跟桌面版ubuntu类似&#xff0c;选择是否精简系统&#xff0…

python机器学习——新手入门学习笔记

一&#xff0c;概论 1.什么是机器学习 定义&#xff1a; 机器学习是从数据中自动分析获得模型&#xff0c;并利用模型对未知数据进行预测。 其实就是通过问题和数据&#xff0c;发现规律&#xff0c;并进行预测&#xff0c;与人脑相似。目的就是从历史数据当中获得规律&#x…

LabVIEW 与 PLC 通讯的常见方式

在工业自动化和数据采集系统中&#xff0c;PLC&#xff08;可编程逻辑控制器&#xff09; 广泛用于控制和监测各种设备&#xff0c;而 LabVIEW 作为强大的图形化编程工具&#xff0c;常用于上位机数据处理和可视化。为了实现 LabVIEW 与 PLC 的高效通讯&#xff0c;常见的方法包…