C语言学习之文件操作

        经过前面的学习,我们已经基本掌握了如何去写一个C语言的代码了。但是在实际的项目中,我们不可能不需要文件去操作。因为如果没有文件,我们写的程序是存储在电脑的内存中的。如果程序推出,内存回收数据就随之丢失了。如果我们要对数据进行永久性的保存,我们就需要使用文件。

        接下来我们就文件的操作进行学习

目录

什么是文件

      程序文件

      数据文件   

        文件名

二进制文件和文本文件

科普:绝对路径和相对路径:

1. 绝对路径

2. 相对路径

3. 关键区别对比

4. 实际编程注意事项

5. 示例场景

文件的打开与关闭

        流和标准流

        流

        标准流

        文件指针

        文件的打开与关闭 

        文件的顺序读写

对比两组函数scanf/fscanf/sscanf和printf/fprintf/sprintf

对比表格

1. 功能与数据流方向

3. 安全性问题

2. 参数差异

4. 典型应用场景

5.典型应用场景

文件的随机读写

        fseek函数

        ftell函数

        rewind函数

   文件读取结束的判定

        错误使用的feof     

        文件缓冲区


什么是文件

        文件是磁盘(磁盘)的文件

        但是在程序设计上,我们一般谈及的文件分为两种:程序文件、数据文件(文件功能角度来区分)。

      程序文件

        程序文件包括程序文件(后缀为.c),目标文件(Windows环境下后缀为.obj),可执行程序(Windows环境下后缀为.exe)

      数据文件   

        文件内容不一定是程序,而是程序运行时读写的数据,如程序运行时需要从中读取数据的文件,或者输出内容的文件
        本篇中讨论的是数据⽂件。

        在之前的学习中所处理数据的输⼊输出都是以终端为对象的,即从终端的键盘输⼊数据,运⾏结果显⽰到显⽰器上。其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使⽤,这⾥处理的就是磁盘上⽂件。

        文件名

        一个文件要有唯一的标识,以便于用户识别和引用

        文件名包含三部分:文件路径+文件名主干+文件后缀

        如:D:\VS2022\c-language-practice\test.c

        为了方便起见,文件标识就是文件名

二进制文件和文本文件

        根据数据的组织形式,数据⽂件被称为⽂本⽂件和⼆进制⽂件。

        数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的⽂件中,就是⼆进制⽂件。

        如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件。

        ⼀个数据在⽂件中是怎么存储的呢?

        字符⼀律以ASCII形式存储数值型数据既可以⽤ASCII形式存储,也可以使⽤⼆进制形式存储。如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占⽤5个字节(每个字符⼀个字节),⽽⼆进制形式输出,则在磁盘上只占4个字节。

        测试代码:

#include<stdio.h>
int main()
{int a = 100;FILE* fp = fopen("test.txt", "wb");fwrite(&a,4,1,fp);//二进制写入文件中fclose(fp);fp = NULL;return 0;
}

运行之后是这个样子,也就是什么都没有

通过这里打开可以发现

        

生成了一个txt的文本文件

 这个文件在VS内是无法打开的

        但是我们可以在VS中打开它(虽然实际意义不是很大)

显示结果为:

科普:绝对路径和相对路径:

1. 绝对路径

定义

根目录开始的完整路径,明确指向文件或目录的位置。

  • Windows示例C:\\Users\\Name\\Documents\\file.txt

  • Linux/macOS示例/home/name/Documents/file.txt

特点

FILE* fp = fopen("data/input.csv", "r");  // 当前目录下的data子目录
// 或
FILE* fp = fopen("../logs/error.log", "w"); // 上级目录的logs子目录

2. 相对路径

定义

相对于程序当前工作目录的路径,不包含根目录。

  • 示例

    • data/file.txt:当前目录下的data子目录中的文件。

    • ../config/settings.ini:上级目录的config子目录中的文件。

特点

  • 灵活性:路径随程序的工作目录变化而变化。

  • 简洁性:路径较短,便于维护。

  • 符号说明

    • .:当前目录(可省略)。

    • ..:上级目录。

C语言中的使用

FILE* fp = fopen("data/input.csv", "r");  // 当前目录下的data子目录
// 或
FILE* fp = fopen("../logs/error.log", "w"); // 上级目录的logs子目录

适用场景

  • 项目内部资源文件(如配置文件、数据文件)。

  • 需要跨平台移植的代码。

缺点

  • 依赖工作目录:若程序运行时工作目录改变,路径可能失效。

  • 调试困难:路径错误可能导致文件找不到,需检查当前目录。

3. 关键区别对比

对比项绝对路径相对路径
路径起点根目录(如 C:\\ 或 /程序当前工作目录
唯一性唯一确定文件位置随工作目录变化
可移植性低(依赖系统目录结构)高(路径与项目结构相关)
典型使用场景系统级文件访问(如日志、全局配置)项目内部资源访问(如数据文件、模块配置)
路径长度
安全性可能暴露敏感路径更安全(隐藏具体系统路径)

4. 实际编程注意事项

(1) 路径分隔符

  • Windows:默认使用反斜杠 \,但在C字符串中需转义为 \\,或统一使用正斜杠 /(兼容)。

  • Linux/macOS:使用正斜杠 /

  • 跨平台写法

    // 统一使用正斜杠
    FILE* fp = fopen("data/files/image.png", "rb");

    (2) 获取当前工作目录

  • C标准库函数getcwd(需包含 <unistd.h> 或 <direct.h>)。

    #include <unistd.h>
    char cwd[256];
    getcwd(cwd, sizeof(cwd)); // 获取当前工作目录
    printf("当前目录:%s\n", cwd);

    (3) 路径拼接

  • 手动拼接(不推荐):

    char path[256];
    snprintf(path, sizeof(path), "%s/%s", base_dir, filename);
  • 使用库函数(推荐):

    • C17引入的 std::filesystem(C++),但C语言需依赖平台API(如Windows的 PathCombine)。

(4) 错误处理

  • 检查文件是否成功打开

FILE* fp = fopen("data.txt", "r");
if (fp == NULL) {perror("文件打开失败"); // 输出:文件打开失败: No such file or directoryreturn 1;
}

5. 示例场景

场景1:读取项目内的配置文件

  • 相对路径config/settings.ini

    FILE* fp = fopen("config/settings.ini", "r");

    场景2:写入系统日志文件

  • 绝对路径(Linux):

    FILE* fp = fopen("/var/log/myapp/error.log", "a");

    总结

  • 绝对路径:精准但不可移植,适合访问系统级固定文件。

  • 相对路径:灵活且可移植,适合项目内部资源管理。

  • 编程建议:优先使用相对路径,结合环境变量或配置文件动态设置路径,提升代码可维护性和跨平台能力。

    文件的打开与关闭

            流和标准流

            流

            我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。

            C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的。

            ⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后操作。

            标准流

            那为什么我们从键盘输⼊数据,向屏幕上输出数据,并没有打开流呢?那是因为C语⾔程序在启动的时候,默认打开了3个流:

    • stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。

    • stdout - 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出流中。

    • stderr - 标准错误流,⼤多数环境中输出到显⽰器界⾯。

            这是默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进⾏输⼊输出操作的。stdin、stdout、stderr 三个流的类型是: FILE * ,通常称为⽂件指针。

            C语⾔中,就是通过 FILE* 的⽂件指针来维护流的各种操作的。

            那么什么是文件指针呢,接下来我们来学习以下

            文件指针

            缓冲⽂件系统中,关键的概念是“⽂件类型指针”,简称“⽂件指针”。

            每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名字,⽂件状态及⽂件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名 FILE.

            不同C编译器的FILE类型包含的内容不完全相同,但是大同小异

            每当打开⼀个⽂件的时候,系统会根据⽂件的情况⾃动创建⼀个FILE结构的变量,并填充其中的信息,使⽤者不必关⼼细节。

            ⼀般都是通过⼀个FILE的指针来维护这个FILE结构的变量,这样使⽤起来更加⽅便。

            下⾯我们可以创建⼀个FILE*的指针变量

    FILE *pf;//文件指针变量

            定义pf是⼀个指向FILE类型数据的指针变量。可以使pf指向某个⽂件的⽂件信息区(是⼀个结构体变量)。通过该⽂件信息区中的信息就能够访问该⽂件。也就是说,通过⽂件指针变量能够间接找到与它关联的⽂件

            ⽐如:

            文件的打开与关闭 

            ⽂件在读写之前应该先打开⽂件,在使⽤结束之后应该关闭⽂件

            在编写程序的时候,在打开⽂件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建⽴了指针和⽂件的关系。

            ANSI C 规定使⽤ fopen 函数来打开⽂件, fclose函数 来关闭⽂件。

    //打开文件
    FILE*fopen(const char *filename,const char*mode);
    //关闭文件
    FILE*fclose(FILE*stream);

            mode表示文件打开模式,下面的是所有的文件打开模式

    文件打开模式含义文件不存在时的行为
    "r"只读模式打开文本文件返回NULL,打开失败
    "rb"只读模式打开二进制文件返回NULL,打开失败
    "w"写入模式打开文本文件,清空文件内容(若存在)创建新文件
    "wb"写入模式打开二进制文件,清空文件内容(若存在)创建新文件
    "a"追加模式打开文本文件,写入从文件末尾开始创建新文件
    "ab"追加模式打开二进制文件,写入从文件末尾开始创建新文件
    "r+"读写模式打开文本文件(文件必须存在)返回NULL,打开失败
    "rb+" / "r+b"读写模式打开二进制文件(文件必须存在)返回NULL,打开失败
    "w+"读写模式打开文本文件,清空文件内容(若存在)创建新文件
    "wb+" / "w+b"读写模式打开二进制文件,清空文件内容(若存在)创建新文件
    "a+"读写模式打开文本文件,写入从文件末尾开始,读取从头开始创建新文件
    "ab+" / "a+b"读写模式打开二进制文件,写入从文件末尾开始,读取从头开始创建新文件
    "wx" (C11)独占写入模式打开文本文件(若文件存在则失败)创建新文件(若存在则失败,返回NULL
    "wbx" (C11)独占写入模式打开二进制文件(若文件存在则失败)创建新文件(若存在则失败,返回NULL

            举例说明:

    #include<stdio.h>
    int main()
    {//fopen()函数用于打开文件,返回一个FILE*指针// 如果成功打开文件,则返回文件信息区的指针// 如果打开失败,则返回NULL。FILE* fp=fopen("D:\\VS2022\\c-language-practice\\文件操作学习\\test.txt","r");if(fp==NULL){perror("fopen");return 1;}else{printf("文件打开成功\n");}return 0;
    }

            文件的顺序读写

            顺序读写函数的介绍

    函数名功能适用场景
    fgetc从文件流中读取一个字符逐个字符读取文本文件(如解析配置文件、简单文本处理)
    fputc向文件流中写入一个字符逐个字符写入文本文件(如生成日志、构建文本内容)
    fgets从文件流中读取一行或指定长度的字符串(包含换行符,自动添加\0按行读取文本文件(如读取CSV、配置文件)
    fputs向文件流中写入一个字符串(不自动添加换行符)写入字符串到文本文件(如保存用户输入、导出数据)
    fscanf从文件流中按格式读取数据(类比 scanf读取结构化文本数据(如读取"Name: %s, Age: %d" 格式的记录)
    fprintf向文件流中按格式写入数据(类比 printf写入结构化文本数据(如生成格式化日志、保存表格数据)
    fread从文件流中读取二进制数据块(按字节数和项数)读取二进制结构体或数组(如加载图片、音视频文件或程序状态快照)
    fwrite向文件流中写入二进制数据块(按字节数和项数)写入二进制结构体或数组(如保存游戏进度、序列化数据)
    getc与 fgetc 功能相同,但可能通过宏实现(性能略高)同 fgetc,常用于高频字符读取场景
    putc与 fputc 功能相同,但可能通过宏实现(性能略高)同 fputc,常用于高频字符写入场景
    ungetc将字符退回输入流,使下次读取可重新获取该字符解析需要“向前看”的场景(如词法分析器中回退字符)

            上⾯说的适⽤于所有输⼊流⼀般指适⽤于标准输⼊流和其他输⼊流(如⽂件输⼊流);所有输出流⼀般指适⽤于标准输出流和其他输出流(如⽂件输出流)。

    关键说明

    1. 文本模式 vs 二进制模式

      • 文本模式函数(fgetcfputs等)会自动处理换行符转换(如Windows的\r\n ↔ \n)。

      • 二进制模式函数(freadfwrite)直接操作原始字节,无格式转换。

    2. 顺序读写特性

      • 所有函数按文件指针顺序操作,每次读写后指针自动后移。

      • 与随机访问函数(fseekftell)互补,不可混用。

    3. 典型应用场景

      • 文本处理fgets + fputs(逐行读写),fscanf + fprintf(格式化数据)。

      • 二进制处理fread + fwrite(结构体/数组持久化)。

      • 低层操作fgetc + fputc(自定义解析或生成。

    举例说明:写入一个字符

    fputc函数的结构:

    #include<stdio.h>
    int main()
    {FILE* fp=fopen("test.txt","w");if(fp==NULL){perror("fopen");return 1;}//写文件fputc('a', fp);fputc('b', fp);fputc('c', fp);fputc('d', fp);fputc('e', fp);fputc('f', fp);fputc('g', fp);fputc('h', fp);fputc('i', fp);fputc('j', fp);fputc('k', fp);//关闭文件fclose(fp);fp = NULL;return 0;
    }

     代码为0 ,代表运行成功

    成果展示:

    读字符

    #include<stdio.h>
    int main()
    {FILE* fp=fopen("test.txt","r");if(fp==NULL){perror("fopen");return 1;}//写文件fputc('a', fp);fputc('b', fp);fputc('c', fp);fputc('d', fp);fputc('e', fp);fputc('f', fp);fputc('g', fp);fputc('h', fp);fputc('i', fp);fputc('j', fp);fputc('k', fp);//读文件int ch;while((ch=fgetc(fp))!=EOF){printf("%c ", ch);}//关闭文件fclose(fp);fp = NULL;return 0;
    }

    对比两组函数scanf/fscanf/sscanf和printf/fprintf/sprintf

    对比表格

    对比项scanf 系列 (scanf/fscanf/sscanf)printf 系列 (printf/fprintf/sprintf)
    核心功能从输入源按格式解析数据并存储到变量。将数据按格式格式化输出到目标输出源。
    函数分类scanf:标准输入(键盘)
    fscanf:文件流
    sscanf:字符串
    printf:标准输出(屏幕)
    fprintf:文件流
    sprintf:字符串
    参数顺序scanf(format, &var1, &var2...)
    fscanf(stream, format, &var...)
    printf(format, val1, val2...)
    fprintf(stream, format, val...)
    输入/输出源输入源:键盘(stdin)、文件、字符串输出目标:屏幕(stdout)、文件、字符串
    返回值返回成功解析的项数(失败返回EOF返回成功输出的字符数(失败返回负值)
    安全性风险缓冲区溢出(如%s无长度限制)sprintf存在缓冲区溢出风险,建议用snprintf
    典型应用场景读取用户输入、解析文件数据、提取字符串中的结构化信息打印日志、生成格式化字符串、写入文件数据

    详细对比说明

    1. 功能与数据流方向

    3. 安全性问题

    • scanf系列

      • 从输入源(键盘、文件、字符串)读取数据,按格式解析后存入变量。

    • 示例

      int age;
      char name[32];
      sscanf("Name: Alice, Age: 25", "Name: %s, Age: %d", name, &age);

      printf系列

    • 将数据按格式转换为字符串,输出到目标(屏幕、文件、字符串)。

    • 示例

      char buffer[100];
      sprintf(buffer, "Result: %d", 42); // 输出到字符串

      2. 参数差异

    • scanf系列

      • scanf:直接从 stdin 读取,无需指定输入源。

      • fscanf:需传入文件指针(如 FILE* fp)。

      • sscanf:需传入源字符串。

      • 变量参数:必须传递变量的地址(如 &num)。

    • printf系列

      • printf:直接输出到 stdout

      • fprintf:需传入文件指针。

      • sprintf:需传入目标字符数组。

      • 变量参数:直接传递变量值(非指针)。

    • scanf系列

      • %s 和 %[ 格式符可能导致缓冲区溢出。

      • 改进方法:指定最大宽度(如 %31s 限制长度为31字符)。

    • printf系列

      • sprintf 可能因目标缓冲区过小导致溢出。

      • 改进方法:使用 snprintf 限制写入长度。

    char buf[10];
    snprintf(buf, sizeof(buf), "%s", "Too long string"); // 安全截断

    4. 典型应用场景

    函数应用场景
    scanf交互式程序读取用户输入(需配合输入验证)
    fscanf读取配置文件、日志文件等结构化文本文件
    sscanf解析字符串中的数字或字段(如解析HTTP响应头)
    printf输出调试信息、程序运行结果到控制台
    fprintf写入日志文件、生成报告文件
    sprintf动态生成格式化字符串(需注意缓冲区大小,优先用 snprintf

    5.典型应用场景

     输入函数组

    // 从键盘读取输入
    int num;
    scanf("%d", &num); // 从文件读取
    FILE* fp = fopen("data.txt", "r");
    fscanf(fp, "Value: %d", &num);// 从字符串解析
    char str[] = "2023-10-01";
    int year, month, day;
    sscanf(str, "%d-%d-%d", &year, &month, &day);

    输出字符组

    // 输出到屏幕
    printf("Result: %d\n", 42);// 输出到文件
    FILE* fp = fopen("log.txt", "w");
    fprintf(fp, "Error: %s\n", "File not found");// 输出到字符串
    char buffer[64];
    sprintf(buffer, "Date: %04d-%02d-%02d", year, month, day);

    文件的随机读写

            fseek函数

            根据文件指针的位置和偏移量来定位文件的指针(文件内容的光标)

    int fseek(FILE*stream,long int offset,int origin);

            例子:

    #include<stdio.h>
    int main()
    {FILE* pfile;pfile = fopen("test.txt", "wb");fputs("Hello, world!", pfile);fseek(pfile,9,SEEK_SET);fputs("  IM THE WORLD", pfile);fclose(pfile);return 0;
    }

            结果:

            ftell函数

            返回文件指针相对起始位置的偏移量

    #include<stdio.h>
    int main()
    {FILE* pfile;long size;pfile = fopen("test.txt", "rb");if (pfile == NULL){perror("打开失败");return 1;}else{fseek(pfile, 0, SEEK_END);size=ftell(pfile);fclose(pfile);printf("文件大小为:%ld\n", size);}return 0;
    }

            rewind函数

            让文件指针回到文件的起始位置

    void rewind (FILE*stream);

    #include<stdio.h>
    int main()
    {int n;FILE* pfile;char str[27];pfile = fopen("test.txt", "w+");for (n='A';n<= 'Z';n++){fputc(n,pfile);}rewind(pfile);fread(str, 1, 26, pfile);fclose(pfile);str[26] = '\0';printf("%s\n", str);return 0;
    }

    结果为: 

       文件读取结束的判定

            错误使用的feof     

            牢记:在⽂件读取过程中,不能⽤ feof 函数的返回值直接来判断⽂件的是否结束。feof 的作⽤是:当⽂件读取结束的时候,判断读取结束的原因是否是:遇到⽂件尾结束。

            1. ⽂本⽂件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )例如:• fgetc 判断是否为 EOF .• fgets 判断返回值是否为 NULL .

            2. ⼆进制⽂件的读取结束判断,判断返回值是否⼩于实际要读的个数。例如:• fread判断返回值是否⼩于实际要读的个数。

            文本文件的例子:

    #include<stdio.h>
    #include<stdlib.h>
    int main()
    {int c;//要处理EOF,必须为int型变量FILE* pfile=fopen("test.txt", "r");if (!pfile){perror("打开失败");return 1;}//输入失败的时候会返回EOFwhile ((c = fgetc(pfile)) != EOF){putchar(c);}//判断原因if (ferror(pfile)){puts("读取失败");}else if(feof(pfile)){puts("文件结束");}fclose(pfile);return 0;
    }

            二进制文件的例子:

    #include<stdio.h>
    enum {SIZE=5};
    int main()
    {double a[SIZE] = {1.1, 2.2, 3.3, 4.4, 5.5};FILE* pfile = fopen("test.txt", "wb");//以二进制方式打开文件fwrite(a, sizeof(double), SIZE, pfile);//将数组a写入文件fclose(pfile);//关闭文件double b[SIZE];pfile =fopen("test.txt", "rb");//以二进制方式打开文件size_t ret_code = fread(b, sizeof(double), SIZE, pfile);//从文件中读取数组bif (ret_code==SIZE){puts("数组读取内容为:");for (int n = 0;n < SIZE;n++){printf("%.2f ",b[n]);}putchar('\n');}else{if (feof(pfile)){puts("文件读取结束");}else if (ferror(pfile)){puts("文件读取失败");}}fclose(pfile);//关闭文件return 0;
    }

            文件缓冲区

            ANSI C 标准采⽤“缓冲⽂件系统” 处理数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的⼤⼩根据C编译系统决定的。

            

            这⾥可以得出⼀个结论:因为有缓冲区的存在,C语⾔在操作⽂件的时候,需要做刷新缓冲区或者在⽂件操作结束的时候关闭⽂件。如果不做,可能导致读写⽂件的问题。 

            以上就是本期C语言的内容了,希望各位读者朋友点个赞,谢谢

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

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

    相关文章

    2025年PMP 学习十三 第9章 项目资源管理(9.1,9.2)

    2025年PMP 学习十三 第9章 项目资源管理&#xff08;9.1,9.2&#xff09; 序号过程过程组9.1规划资源管理规划9.2估算活动资源规划9.3获取资源执行9.4建设团队执行9.5管理团队执行9.6控制资源监控 文章目录 2025年PMP 学习十三 第9章 项目资源管理&#xff08;9.1,9.2&#xf…

    蓝桥杯13届国B 完全日期

    题目描述。 如果一个日期中年月日的各位数字之和是完全平方数&#xff0c;则称为一个完全日期。 例如&#xff1a;2021 年 6 月 5 日的各位数字之和为 20216516&#xff0c;而 16 是一个完全平方数&#xff0c;它是 4 的平方。所以 2021 年 6 月 5 日是一个完全日期。 例如&…

    某某霸翻译逆向分析[JS逆向]

    声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未经…

    开源Heygem本地跑AI数字人视频教程

    图文教程&#xff1a; 点击跳转 视频教程 资料包下载 点击下载&#xff1a;

    C++之fmt库介绍和使用(1)

    C之fmt库介绍与使用(1) Author: Once Day Date: 2025年5月12日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 源码分析_Once-Day的博客-CSDN博客 …

    设计模式(9)——创建型模式之工厂方法

    设计模式(9)——创建型模式之工厂方法 工厂方法作用结构伪代码适用场景工厂方法 作用 工厂方法是一种创建型设计模式,其在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型。 结构 产品(Product)将会对接口进行声明。对于所有由创建者及其子类构建的对象,…

    Docker 疑难杂症解决指南:从入门到进阶的全面剖析

    Docker 作为容器化技术的代表&#xff0c;凭借其轻量级、可移植性和高效资源利用率&#xff0c;已成为开发、测试和部署应用的标准工具。然而&#xff0c;在实际使用中&#xff0c;用户常常会遇到镜像构建失败、容器启动异常、网络配置问题等疑难杂症。本文将从镜像构建、容器生…

    抢跑「中央计算+区域控制」市场,芯驰科技高端智控MCU“芯”升级

    伴随着整车EE架构的加速变革&#xff0c;中国高端车规MCU正在迎来“新格局”。 在4月23日开幕的上海国际车展期间&#xff0c;芯驰科技面向新一代AI座舱推出了X10系列芯片&#xff0c;以及面向区域控制器、电驱和动力域控、高阶辅助驾驶和舱驾融合系统等的高端智控MCU产品E3系…

    DeepPrep:深度学习提升神经影像预处理

    DeepPrep&#xff1a;深度学习提升神经影像预处理 一、DeepPrep介绍和BIDS格式介绍 神经影像预处理的痛点&#xff1a;传统工具&#xff08;如fMRIPrep&#xff09;在大规模数据处理时效率低下&#xff0c;临床样本鲁棒性不足。DeepPrep通过深度学习工作流管理实现突破&#…

    pytorch 数据预处理和常用工具

    文章目录 NumPyNumpy数据结构安装和使用NumPy Matplotlib的安装和导入安装和导入Matplotlib绘制基础图画折线图散点图柱状图图例 数据清洗据清洗的作用Pandas进行数据清洗Pandas数据结构Series 数据结构DataFrame数据结构 Pandas数据清洗常用代码 特征工程主成分分析线性判别分…

    MATLAB 中常用的微分函数介绍

    MATLAB 中常用的微分函数介绍 在 MATLAB 中&#xff0c;微分运算是数值计算和符号计算中常用的功能。无论是在进行数据分析、优化算法&#xff0c;还是数学建模时&#xff0c;微分都扮演着重要的角色。本文将介绍 MATLAB 中常用的微分函数&#xff0c;并通过简单的示例帮助大家…

    按指定位置或关键字批量删除工作表-Excel易用宝

    在一个工作簿中有多个工作表&#xff0c;有些工作表不需要了&#xff0c;如果一个一个手动删除&#xff0c;那实在是太慢了&#xff0c;有没有什么好的方法可以批量删除工作表。 批量删除工作表很简单&#xff0c;单击【易用宝】→【工作表】→【批量删除工作表】。 在打开的批…

    TypeScript装饰器:从入门到精通

    TypeScript装饰器&#xff1a;从入门到精通 什么是装饰器&#xff1f; 装饰器&#xff08;Decorator&#xff09;是TypeScript中一个非常酷的特性&#xff0c;它允许我们在不修改原有代码的情况下&#xff0c;给类、方法、属性等添加额外的功能。想象一下装饰器就像给你的代码…

    【SSL证书系列】客户端如何检查中间CA签名是否由根CA签发

    客户端通过以下步骤检查中间CA的签名是否由受信任的根CA签发&#xff1a; 1. 证书链的构建 服务器发送的证书链通常包含&#xff1a; • 服务器证书&#xff08;由中间CA签发&#xff09; • 中间CA证书&#xff08;由根CA签发&#xff09; • 根CA证书&#xff08;通常不发送…

    【android bluetooth 协议分析 12】【A2DP详解 1】【车机侧蓝牙音乐免切源介绍】

    “车机蓝牙音乐免切源” 是近年来车载系统&#xff08;IVI&#xff0c;In-Vehicle Infotainment&#xff09;中常见的一个用户体验优化功能。它主要是为了简化蓝牙音乐播放流程、减少用户操作&#xff0c;提升使用便捷性。 一、什么是“切源”&#xff1f; 在车机系统中&#…

    Android usb网络共享详解

    Android usb网络共享详解 文章目录 Android usb网络共享详解一、前言二、USB网络共享使用的前提1、Android设备支持adb 并且打开usb开关2、原生Settings能看到USB网络共享开关3、代码中检测USB网络共享是否支持 三、Settings 中USB网络共享代码的部分代码1、Settings\res\xml\t…

    Step1

    项目 SchedulerSim 已搭建完成 ✅ ⸻ ✅ 你现在拥有的&#xff1a; • &#x1f527; 两种调度器&#xff08;Round Robin SJF&#xff09; • &#x1f4e6; 模拟进程类 Process • &#x1f9f1; 清晰结构&#xff1a;OOP 风格 便于扩展 • ✍️ 主函数已演示调度器运行效…

    初探 Skynet:轻量级分布式游戏服务器框架实战

    在游戏服务器开发领域&#xff0c;高效、稳定且易于扩展的框架一直是开发者追求的目标。Skynet 作为一款轻量级、高性能的分布式游戏服务器框架&#xff0c;凭借其独特的设计理念和强大的功能&#xff0c;赢得了众多开发者的青睐 一.Skynet底层架构支持 1.Actor erlang 从语言…

    Oracle数据库中,WITH..AS 子句用法解析

    前言 在Oracle数据库中&#xff0c;WITH子句&#xff08;也成为“子查询因子化” 或“公共表表达式”&#xff0c;Common Table Expression, CTE)用于定义一个临时命名的结果集&#xff0c;这个结果集可以在后续的查询中引用。 一、基本语法 WITH sjtab AS &#xff08;SELE…

    什么是卫星电话?卫星电话与普通电话有什么区别?

    在信息时代&#xff0c;通信技术已渗透到人类生活的方方面面&#xff0c;但传统地面通信网络仍存在盲区&#xff0c;无论是海洋、沙漠、高山&#xff0c;还是灾害现场&#xff0c;普通手机往往因基站信号无法覆盖而失效。此时&#xff0c;卫星电话便成为连接世界的“生命线”。…