【C语言】—— 文件操作(下)
【C语言】—— 文件操作(下)
- 前言:
- 五、文件的顺序读写
- 5.1、 顺序读写函数介绍
- 5.2、 f p u t c fputc fputc 函数
- 5.3、 f g e t c fgetc fgetc 函数
- 5.4、 f p u t s fputs fputs 函数
- 5.5、 f g e t s fgets fgets 函数
- 5.6、 f p r i n t f fprintf fprintf 函数
- 5.7、 f s c a n f fscanf fscanf 函数
- 5.8、 p r i n t f / f p r i n t f / s p r i n t f printf/fprintf/sprintf printf/fprintf/sprintf 函数对比
- 5.9、 s c a n f / f s c a n f / s s c a n f scanf/fscanf/sscanf scanf/fscanf/sscanf 函数对比
- 5.10、 f w r i t e fwrite fwrite 函数
- 5.11、 f r e a d fread fread 函数
- 六、文件的随机读写
- 七、文件读取结束的判定
- 7.1、 被错误使用的 f e o f feof feof
- 7.2、如何判断文件读取结束
- (1)文本文件判断
- (2)二进制文件判断
- 八、 文件缓冲区
前言:
在 【C语言】—— 文件操作(上) 一文中,我们对文件有了一个简单的了解,并学会了如何打开和关闭文件,下面就让我们一起来学学如何对文件进行读写吧。
五、文件的顺序读写
5.1、 顺序读写函数介绍
| 函数名 | 功能 | 适用于 |
|---|---|---|
| fgetc | 字符输入函数 | 所有输入流 |
| fputc | 字符输出函数 | 所有输出流 |
| fgets | 文本行输入函数 | 所有输入流 |
| fputs | 文本行输出函数 | 所有输出流 |
| fscanf | 格式化输入函数 | 所有输入流 |
| fprintf | 格式化输出函数 | 所有输出流 |
| fread | 二进制输入 | 文件 |
| fwrite | 二进制输出 | 文件 |
注:上面说的适用于所有输入流一般指适用于标准输入流和其他输入流(如文件输入流);所有输出流一般指适用于标准输出流和其他输出流(如文件输出流)
下面我们对上述函数一一进行介绍
5.2、 f p u t c fputc fputc 函数
- 函数功能:将一个字符写入流中,这个流其实就是文件流
- 函数参数:
- i n t int int c h a r a c t e r character character:
要写入的字符,字符的本质就是 A S C I I ASCII ASCII 码值,因此这里参数类型为 i n t int int 没有问题 - F I L E FILE FILE * s t r e a m stream stream :指向要写入文件的
文件指针
- i n t int int c h a r a c t e r character character:
- 返回类型:返回类型是
int:当写入成功,返回写入的值,当写入失败,返回EOF(-1)
函数使用:
#include<stdio.h>int main()
{FILE* pf = NULL;//打开文件pf = fopen("test.txt", "w");//文件操作if (NULL == pf){perror("fopen fail");return 1;}//写文件fputc('a', pf);fputc('b', pf);fputc('c', pf);//写入26个字母char ch = 0;for (ch = 'a'; ch <= 'z'; ch++){fputc(ch, pf);}//关闭文件fclose(pf);pf = NULL;
}
这样,字符就写好了。
当写入字符时,还有一些细节需要注意:当一个文件打开时,最开始其实是有一个光标指向第一个位置,每当用 f p u t c fputc fputc 函数写入一个字符,光标则后退一格。光标是用来维护此时此刻我们这个文件写到哪的,而且是按照一定的顺序往后走的,因此叫做顺序读写
5.3、 f g e t c fgetc fgetc 函数
- 函数功能:从流(文件)中获取一个字符
- 返回值:返回类型为 i n t int int 。如果成功,就会将
读到的字符返回,如果读取失败或者遇到文件末尾返回EOF(-1)- 为什么返回类型是
int呢?正是因为它会返回两种类型的值:字符的 A S C I I ASCII ASCII码 值和 EOF;如果返回类型为char,则EOF 无法返回
- 为什么返回类型是
函数使用:
#include<stdio.h>int main()
{FILE* pf = NULL;//打开文件pf = fopen("test.txt", "r");//文件操作if (NULL == pf){perror("fopen fail");return 1;}//读文件int ch = 0;while ((ch = fgetc(pf)) != EOF){printf("%c ", ch);}printf("\n");//关闭文件fclose(pf);pf = NULL;
}
运行结果:
而同样,以只读的方式打开文件,刚开始光标是在第一个位置,即指向 a a a,每读一个字符,光标向后退一位。
5.4、 f p u t s fputs fputs 函数
- 函数功能:
将 str 字符串写入文件流中,直至遇到 ‘\0’ 停止(‘\0’不会被写入)
注:多次调用该函数,并不会实现主动换行,要想换行应主动输入‘\n’
函数使用:
#include<stdio.h>int main()
{//打开文件FILE* pf = NULL;pf = fopen("test.txt", "w");if (NULL == pf){perror("fopen fail");return 1;}//写文件fputs("hello", pf);fputs("world\n", pf);fputs("hello csdn\n", pf);//关闭文件fclose(pf);pf = NULL;return 0;
}
运行结果:

我们可以看到,加了换行符后,文件的光标是直接落到下一行的。
5.5、 f g e t s fgets fgets 函数
- 函数功能:
从流中最多读取 num 个字符,并放在 str 所指向的空间中- 函数读 n u m num num 个字符,但是最多只能读取 n u m num num - 1个,因为最后一个位置函数会自己加上 ‘\0’
- 该函数不会换行读取。当 n u m num num 大于字符数时,遇到换行符 ‘\n’,将 ‘\n’ 读取后,不再往下读取,自己加上 ‘\0’ 后停止。
- 当函数读取成功,返回的是目标空间的地址;读取失败则返回空指针(NULL)
函数使用:
#include<stdio.h>int main()
{//打开文件FILE* pf = NULL;pf = fopen("test.txt", "r");if (NULL == pf){perror("fopen fail");return 1;}//读文件char arr1[10] = "xxxxxxxxx";fgets(arr1, 8, pf);char arr2[10] = "xxxxxxxxx";fgets(arr2, 8, pf);//关闭文件fclose(pf);pf = NULL;return 0;
}
运行结果:
5.6、 f p r i n t f fprintf fprintf 函数
该函数的功能是将数据以格式化的形式写入流中(以文本的形式)
其实, f p r i n t f fprintf fprintf 函数和 p r i n t f printf printf 函数是非常相像的,让我们来对比一下
他们的区别仅仅是第一个参数的有无而已,其他都是一模一样的,所以你会用 p r i n t f printf printf你就会用 f p r i n t f fprintf fprintf
多的一个参数是什么呢?是文件流,你需要将数据输出到的那个文件流
#include<stdio.h>struct S
{char name[20];int age;float score;
};
int main()
{struct S s = { "张三", 20, 75.5f };//打开文件FILE* pf = NULL;pf = fopen("test.txt", "w");if (NULL == pf){perror("fopen fail");return 1;}//写文件fprintf(pf, "%s %d %f", s.name, s.age, s.score);//关闭文件fclose(pf);pf = NULL;return 0;
}
运行结果:

5.7、 f s c a n f fscanf fscanf 函数
该函数的功能是从文件流中读取格式化的数据。
不难发现, f s a n f fsanf fsanf 与 s c a n f scanf scanf 函数很像,我们来对比一下
同 f p r i n t f fprintf fprintf 一样, f s c a n f fscanf fscanf 与 s c a n f scanf scanf 只是相差一个参数而已,你会用 s c a n f scanf scanf 自然也就会用 f s c a n f fscanf fscanf 函数,第一个参数即是你所要读取的文件流。
#include<stdio.h>struct S
{char name[20];int age;float score;
};
int main()
{struct S s = { 0 };//打开文件FILE* pf = NULL;pf = fopen("test.txt", "r");if (NULL == pf){perror("fopen fail");return 1;}//读文件fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));//printf("%s %d %.2f\n", s.name, s.age, s.score);fprintf(stdout, "%s %d %.2f\n", s.name, s.age, s.score);//关闭文件fclose(pf);pf = NULL;return 0;
}
运行结果:
注意看,上述代码用了 f p r i n t f fprintf fprintf 来将数据打印在屏幕上
还记得最开始的表格中, f p r i n t f fprintf fprintf 最后一列写的是所有输出流吗?这所有输出流就包括了文件流和标准输出流,既然 f p r i n t f fprintf fprintf 可以输出到文件中,那么自然也就可以输出到屏幕中,完成 p r i n t f printf printf 一样的功能。
而同理,前面讲的 f p u t c fputc fputc、 f g e t s fgets fgets、 f s c a n f fscanf fscanf 等函数也可以从标准输入(输出)流中获取(输出)数据。
5.8、 p r i n t f / f p r i n t f / s p r i n t f printf/fprintf/sprintf printf/fprintf/sprintf 函数对比
通过我们前面的学习,我们已经知道了 p r i n t f printf printf 和 f p r i n t f fprintf fprintf 函数的作用:
- p r i n t f printf printf:把数据以格式化的形式打印在标准输出流上
- f p r i n t f fprintf fprintf : 把数据以格式化的形式打印在 指定的输出流 上
那么 s p r i n t f sprintf sprintf 函数又是作什么的呢?我们一起来看看
该函数的作用是:将数据以格式化的形式写到字符串上。其实就是把格式化的数据转换成字符串
#include<stdio.h>struct S
{char name[20];int age;float score;
};
int main()
{struct S s = { "张三", 20, 75.5f };char buf[50] = { 0 };sprintf(buf, "%s %d %f", s.name, s.age, s.score);printf("%s\n", buf);return 0;
}
运行结果:

该代码完全是以 %s 的形式打印的,说明数据已经完全转换成字符串了。
5.9、 s c a n f / f s c a n f / s s c a n f scanf/fscanf/sscanf scanf/fscanf/sscanf 函数对比
同样,通过我们前面的学习,我们已经知道了 s c a n f scanf scanf 和 f s c a n f fscanf fscanf 函数的作用:
- s c a n f scanf scanf:从 标准输入流 中读取格式化的数据
- f s c a n f fscanf fscanf:从 指定输入流 中读取格式化的数据
那 s s c a n f sscanf sscanf 的功能又是什么呢?学习了 s p r i n t f sprintf sprintf ,我们猜测,其应该是从字符串中读取格式化数据,是不是呢?我们一起来看看
函数功能:从字符串中读取格式化数据
#include<stdio.h>struct S
{char name[20];int age;float score;
};
int main()
{struct S s = { "张三", 20, 75.5f };char buf[50] = { 0 };sprintf(buf, "%s %d %f", s.name, s.age, s.score);struct S a = { 0 };sscanf(buf, "%s %d %f", s.name, &(s.age), &(s.score));printf("%s %d %f\n", s.name, s.age, s.score);return 0;
}
运行结果:
5.10、 f w r i t e fwrite fwrite 函数
- 函数功能:以二进制的形式将内存块中的数据写入文件中
- 参数介绍:
- c o n s t const const v o i d void void * p t r ptr ptr: p t r ptr ptr 是指向要写入数据的数组的
指针 - s i z e size size_ t t t s i z e size size:表示要写入的每个元素的
大小 - s i z e size size_ t t t c o u n t count count:表示要写入元素的
个数
- c o n s t const const v o i d void void * p t r ptr ptr: p t r ptr ptr 是指向要写入数据的数组的
下面我们直接上代码:
#include<stdio.h>int main()
{int arr[] = { 1,2,3,4,5 };int sz = sizeof(arr) / sizeof(arr[0]);FILE* pf = NULL;pf = fopen("test.txt", "wb");if (NULL == pf){perror("fopen fail");return 1;}fwrite(arr, sizeof(arr[0]), sz, pf);fclose(pf);pf = NULL;return 0;
}
我们以二进制的方式打开:
5.11、 f r e a d fread fread 函数
该函数的作用是:以二进制的形式读取数据到内存中
我们可以看到,这函数的参数与 f w r i t e fwrite fwrite 是大同小异的,这里就不一一介绍了,我们直接上代码
#include<stdio.H>int main()
{int arr[5] = { 0 };FILE* pf = NULL;pf = fopen("test.txt", "rb");if (NULL == pf){perror("fopen fail");return 1;}fread(arr, sizeof(arr[0]), 5, pf);for (int i = 0; i < 5; i++){printf("%d ", arr[i]);}printf("\n");fclose(pf);pf = NULL;return 0;
}
运行结果:
但是,上面代码是我提前知道了总共的数据个数,当我不知道数据具体个数是又该怎么办呢?
这里,我们需要知道 f r e a d fread fread 函数的返回值,该函数的返回值是读取到的数据的个数。这时,当我要求读 7 个数据,而返回值是 5 时,说明数据读完了。
上面的代码我们可以做如下修改:
#include<stdio.h>int main()
{int arr[5] = { 0 };FILE* pf = NULL;pf = fopen("test.txt", "rb");if (NULL == pf){perror("fopen fail");return 1;}int i = 0;while (fread(arr + i, sizeof(arr[0]), 1, pf)){printf("%d ", arr[i]);i++;}printf("\n");fclose(pf);pf = NULL;return 0;
}
六、文件的随机读写
前面我们所学习到的函数都是顺序读写,光标是依次往后移动。那能不能做到随机读写呢,即我想在哪里读写就在哪读写,指那打那。
当然是可以的,下面让我们一起来学习。
6.1、 f s e e k fseek fseek 函数
- 功能:根据文件指针的位置和偏移量来定位文件指针(光标)。
- 参数介绍:
- l o n g long long i n t int int o f f s e t offset offset:相对于起始位置的
偏移量,可正可负 - i n t int int o r i g i n origin origin:
起始位置
- l o n g long long i n t int int o f f s e t offset offset:相对于起始位置的
起始位置选择:
| 常量 | 所指位置 |
|---|---|
| SEEK_SET | 文件的起始位置 |
| SEEK_CUR | 当前光标位置 |
| SEEK_END | 文件结尾 |
这个函数有什么用呢?比如文件中有 a b c d e f g abcdefg abcdefg 的数据,当前光标指向 a a a,而我想直接读 e e e,这时就可以用该函数移动光标啦。
例子:
#inclu<stdio.h>int main()
{FILE* pf = NULL;pf = fopen("test.txt", "r");if (NULL == pf){perror("fopen fail");return 1;}char ch = 0;ch = fgetc(pf);printf("%c\n", ch);fseek(pf, 3, SEEK_CUR);ch = fgetc(pf);printf("%c\n", ch);fclose(pf);pf = NULL;return 0;
}
运行结果:
6.2、 f t e l l ftell ftell 函数
f t e l l ftell ftell 函数会返回文件指针(光标) 相对于文件起始位置的 偏移量
这里,我们想:如果我们让光标读到文件末尾,在返回偏移量,是不是就能知道文件的长度呢?答案是肯定的。
例子:
#includ<stdio.h>int main()
{FILE* pf;long size;pf = fopen("test.txt", "rb");if (NULL == pf)perror("Error opening file");fseek(pf, 0, SEEK_END); // non-portablesize = ftell(pf);fclose(pf);printf("Size of test.txt: %ld bytes.\n", size);return 0;
}
6.3、 r e w i n d rewind rewind 函数
r e w i n d rewind rewind 函数可以让文件指针回到起始位置
走的太远,别忘了回头路
例子:
#include<stdio.h>int main()
{int n;FILE* pf;char buffer[27];pf = fopen("test.txt", "w+");for (n = 'A'; n <= 'Z'; n++){fputc(n, pf);}rewind(pf);fread(buffer, 1, 26, pf);fclose(pf);buffer[26] = '\0';printf(buffer);return 0;
}
七、文件读取结束的判定
7.1、 被错误使用的 f e o f feof feof
很多人都以为 f e o f feof feof函数是用来直接判断文件读取是否结束。其实这是大错特错的
f e o f feof feof 的作用是:当文件读取结束时,判断读取结束的原因是否是因为:遇到文件末尾结束。
现在假设文件读取结束了,但是是什么原因读取结束的呢?
- 有可能遇到文件末尾
- 读取的时候发生了错误
f e o f feof feof 函数是判断是否是因为遇到文件末尾而结束的。
而还有个函数叫 f e r r o r ferror ferror 是用来判断是否是因为遇到错误而读取结束的
其实在我们打开一个流时,会有两个标记值
- 是否遇到文件末尾
- 是否发生错误
当读文件的过程中确实是遇到文件末尾了,就会将第一个值
标记;遇到错误就会将第二个值标记。
f e o f feof feof是用来检测第一个标记的; f e r r o r ferror ferror是用来检测第二个标记的
f e o f feof feof 函数:当文件确实是因为读取到文件末尾而结束时,返回一个非零值,反之返回 0
7.2、如何判断文件读取结束
那么如何来判断文件是否读取结束呢?其实在前面结束各个函数时已经顺便介绍了:通过函数的返回值进行判断!
(1)文本文件判断
| 函数名 | 正常读取返回值 | 读取结束或遇到错误的返回值 |
|---|---|---|
| fgetc | 返回读取到的字符的ASCII码值 | EOF |
| fgets | 返回目标空间的地址 | NULL |
(2)二进制文件判断
二进制文件用 f r e a d fread fread 进行读取, f r e a d fread fread 返回值是其读取到的个数。当其返回值小于实际要读取的个数时,表示文件读取结束
八、 文件缓冲区
我们想一个问题:当我们想往文件中存 26 个字母,这 26 个字母是直接从程序(内存)中存到文件(硬盘)中的吗?
其实不是的。
ANSI C 标准采用 “缓冲文件系统” 处理的数据文件的,所谓缓冲文件系统指的是系统自动在内存中为程序中为每一个正在使用的文件开辟一块“文件缓冲区”。
从内存向磁盘输出数据会先送达内存中的缓冲区,装满缓冲区或主动刷新缓冲区才将数据送到磁盘上。
如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区或刷新缓冲区),然后在从缓冲区逐个地将数据送到程序数据区(程序变量等)。
缓冲区的大小根据C编译系统决定的。
那为什么要有文件缓冲区呢?
其实,当我们向文件中输入输出数据时,相关函数会调用操作系统相关接口;这时如果写一个字符就调用一次操作系统,是不是效率太低,并且我们的操作系统上面可不止跑着一个程序,这时你一直打扰操作系统,操作系统就没法干活了。
应用缓冲区,在缓冲区攒够一定数据再一次性全部录进,效率就会提升很多。
下面,我们通过一段代码验证缓冲区的存在:
#include<stdio.h>
#include <windows.h>
//VS2019 WIN11环境测试
int main()
{FILE* pf = fopen("test.txt", "w");fputs("abcdef", pf);//先将代码放在输出缓冲区printf("睡眠10秒-已经写数据了,打开test.txt⽂件,发现⽂件没有内容\n");Sleep(10000);printf("刷新缓冲区\n");fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到⽂件(磁盘)//注:fflush 在⾼版本的VS上不能使⽤了printf("再睡眠10秒-此时,再次打开test.txt⽂件,⽂件有内容了\n");Sleep(10000);fclose(pf);//注:fclose在关闭⽂件的时候,也会刷新缓冲区pf = NULL;return 0;
}
这里我们需要注意:
因为有文件冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。
如果不做,可能导致读写文件的问题
好啦,本期关于文件操作的知识就介绍到这里啦,希望本期博客能对你有所帮助。同时,如果有错误的地方请多多指正,让我们在C语言的学习路上一起进步!
相关文章:
【C语言】—— 文件操作(下)
【C语言】—— 文件操作(下) 前言:五、文件的顺序读写5.1、 顺序读写函数介绍5.2、 f p u t c fputc fputc 函数5.3、 f g e t c fgetc fgetc 函数5.4、 f p u t s fputs fputs 函数5.5、 f g e t s fgets fgets 函数5.6、 f p r i n t f…...
np.argsort
函数解释 np.argsort是NumPy库中的一个函数,用于对数组进行排序并返回排序后的索引。它不会直接对数组进行排序,而是返回一个数组,这个数组中的元素是原数组中元素按升序排序后的索引。 numpy.argsort(a, axis-1, kindNone, orderNone) 参…...
ORC与Parquet列式存储的区别
ORC与Parquet列式存储 1、ORC与Parquet列式存储2、ORC与Parquet的区别 列式存储(Columnar Storage)是一种优化的数据存储方式,与传统的行式存储(Row Storage)相比,列式存储在数据压缩、查询性能、I/O效率等…...
析构函数和拷贝构造函数
文章目录 析构函数1.析构函数的定义:2.析构函数的语法:3.析构函数的特性: 拷贝构造函数1.拷贝构造函数的定义:2.拷贝构造函数的语法3.拷贝构造函数的特性(1)拷贝构造函数是构造函数的一个重载形式**(这个其实也很好理解࿰…...
sql server启动、连接 与 navicat连接sql server
一、sql server 启动 1.搜索cmd->以管理员身份运行 2.输入以下命令 net start mssqlserver 3.服务器启动成功 二、sql server连接 1.打开ssms,输入,连接 2.右键,属性 3.连接,勾选允许远程连接到此服务器 三、navicat连接sq…...
数据库测试数据准备厂商 Snaplet 宣布停止运营
上周刚获知「数据库调优厂商 OtterTune 宣布停止运营」。而今天下班前,同事又突然刷到另一家海外数据库工具商 Snaplet 也停止运营了。Snaplet 主要帮助开发团队在数据库中生成仿真度高且合规的测试数据。我们在年初还撰文介绍过它「告别手搓!Postgres 一…...
【Java09】方法(下)
1. 形参个数可变的方法 Java允许方法指定数量不确定的形参。如果在定义方法是,在最后一个形参的类型后加...,则表明该形参可以接受多个参数值。多个参数值作为数组传入: public class Varargs {public static void test(int a, String... b…...
d88888888
分析:v9999999999 vn输出n个n 先算出n的位数p 所以答案是nn*10的p次方n*10的2p次方.....n*10的(n-1)p次方 化简n*(10的0次方10的p次方10的2p次方.....10的(n-1)p次方) 后面为等比数列求和 …...
【MySQL备份】mysqldump基础篇
目录 1.简介 2.基本用途 3.命令格式 3.1常用选项 3.2常用命令 4.备份脚本 5.定时执行备份脚本 1.简介 mysqldump 是 MySQL 数据库管理系统的命令行实用程序,用于创建数据库的逻辑备份。它能够导出数据库的结构(如表结构、视图、触发器等…...
C# Halcon目标检测算法
在Halcon中进行目标检测可以使用传统的计算机视觉方法,也可以使用深度学习的方法。Halcon提供了丰富的函数库来处理这些任务,而在C#中使用Halcon,你需要通过Halcon .NET接口。 以下是使用Halcon进行目标检测的一般步骤,这里我将给…...
7.4总结
今天写了几道题目 最近,一年级学生马克西姆学习了科拉兹猜想,但他在讲课时没有太注意,所以他认为猜想中提到了以下过程: 有一个变量 $$$x$$$ 和一个常数 $$$y$$$ 。下面的操作要执行 $$$k$$$ 次: - 将 $$$x$$$ 增加…...
知识图谱查询语言的表示
文章目录 SPARQL知识图谱查询基本构成常见的SPARQL查询算子语义Markup表示语言SPARQL知识图谱查询基本构成 RDF 支持类似数据库的查询语言,叫作SPARQL,它提供了查询RDF 数据的标准语法、处理SPARQL查询的规则以及结果返回形式。 变量,RDF中的资源,以“?”或者“$”指示;…...
重生之我要学后端100--计算机网络部分概念(持续更新)
TCP/IP、DNS、负载均衡器等等 前言一、TCP/IP(传输控制协议/互联网协议)二、DNS(域名系统)三、负载均衡器其他网络概念 前言 了解网络基础知识对于后端开发者至关重要,因为这些知识有助于理解应用程序是如何在更广阔的…...
时空预测+特征分解!高性能!EMD-Transformer和Transformer多变量交通流量时空预测对比
时空预测特征分解!高性能!EMD-Transformer和Transformer多变量交通流量时空预测对比 目录 时空预测特征分解!高性能!EMD-Transformer和Transformer多变量交通流量时空预测对比效果一览基本介绍程序设计参考资料 效果一览 基本介绍…...
Vue 循环内部获取图片高度
在vue循环里面获取图片宽度或者高度,有时候会用到,则可以 <div classconmon v-for"(item, index) in items"><router-link :to"{path: /art/details,query:{artid:item.app_id,item_id:item.image_id}}"><img :src"item.src" al…...
vue动态组件与插件到底是什么?
background: yellow; } 子组件1 <ul><li v-for"item of items" :key"item"><input type"checkbox" />{{ item }}</li></ul>子组件2 PostMail 子组件3 RecycleBin  符号的含义
您已经很好地解释了 SQL 查询中 () 符号的含义,它确实用于表示左外连接(LEFT OUTER JOIN),这是 SQL 中的一种连接操作。以下是对您提供的信息的补充和完善: ### 左外连接(LEFT OUTER JOIN)&…...
基于Vue的MOBA类游戏攻略分享平台
你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:Java技术、SpringBoot框架、B/S模式、Vue.js 工具:MyEclipse、MySQL 系统展示 首页 用…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...
























