C语言——文件操作

目录

文件是什么

程序文件

数据文件

二进制文件和文本文件

文件名

文件的作用

文件的打开和关闭

流和标准流

标准流

文件指针

文件打开和关闭

打开文件:fopen

关闭文件:fclose

测试代码

文件具体操作

顺序读写

fputc

​编辑

fgetc

fputs

fgets

fprintf

fscanf

fwrite

fread

对比

随机读写

fseek

ftell

rewind

文件读取结束的判定

文件结束原因

feof

​编辑

ferror和feof

文件缓冲区


文件是什么

磁盘(硬盘)上的⽂件是⽂件。
在程序设计中,我们⼀般从⽂件功能的⻆度来分类 分为 程序⽂件 数据⽂件

程序文件

程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)

数据文件

⽂件的内容不⼀定是程序,也可能是是程序运⾏时读写的数据,⽐如程序运⾏需要从中 读取数据的⽂件,或者输出内容的⽂件

这里我们将会使用到的就是数据文件,我们以前所处理数据的输⼊输出都是以终端为对象的,即从终端的键盘输⼊数据,运⾏结果显⽰到显⽰器(屏幕)上。

二进制文件和文本文件

根据 数据的组织形式 ,数据⽂件分为 ⽂本⽂件 或者 ⼆进制⽂件
数据在内存中以 ⼆进制的形式存储 ,如果不加转换的输出到外存的⽂件中,就是 ⼆进制⽂件
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以 ASCII字符的形式存储 的⽂件就是 ⽂本⽂件
⼀个数据在⽂件中是怎么存储的呢?
字符⼀律以ASCII形式存储,数值型数据既可以⽤ASCII形式存储,也可以使⽤⼆进制形式存储。
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占⽤5个字节(‘1’,‘0’,‘0’,‘0’,‘0’)(每个字符⼀个字节),如果⼆进制形式输出,则在磁盘上只占4个字节,如图所示

文件名

⼀个⽂件要有 一个唯⼀的⽂件标识 ,以便用户识别和引用,这个文件标识就是文件名。
⽂件名包含3部分: ⽂件路径+⽂件名主⼲+⽂件后缀
例如: c:\code\test.txt
.txt为文件后缀
注意:
1.文件名可以不包含后缀名
2.文件名中有一些禁止使用的字符,文件名不能包含这些字符:\/:*?"<>|

3.文件的后缀名决定了一个文件的默认打开方式

4.文件路径指的是从盘符到该文件所经历的路径中各符号名的集合

文件的作用

如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就会失,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的保存,我们就需要使⽤⽂件

文件的打开和关闭

流和标准流

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流 想象成流淌着字符的河。
C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的。
内存中的程序向文件输出内容是写文件,文件向内存中的程序输入是读文件。
⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都需要先打开流,然后操作。

标准流

既然输入输出操作需要通过流来实现,但是当我们从键盘输⼊数据,向屏幕上输出数据,没有打开流 ,这是为什么呢?
事实上,C语⾔程序在启动的时候,默认打开了3个流:
stdin - 标准输⼊流。
在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。
stdout - 标准输出流。
⼤多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出 流中。
stderr - 标准错误流。
⼤多数环境中输出到显⽰器界⾯(屏幕)
正是默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进⾏输⼊输出操作。
stdin、stdout、stderr 三个 流的类型 是: FILE * ,通常称为 ⽂件指针
C语⾔中,就是通过 FILE* 的⽂件指针来维护流的各种操作。

文件指针

每个 被使⽤的⽂件 都在内存中开辟了⼀个 相应的⽂件信息区 ,⽤来 存放⽂件的相关信息 (如⽂件的名字,⽂件状态及⽂件当前的位置等),这些信息是保存在⼀ 个结构体变量 中的,该结构体类型是由系 统声明的,取名 FILE ,而这个结构体类型的指针就是 文件指针 —— FILE*
不同的C编译器的FILE类型包含的内容(结构体成员)不完全相同,但是⼤同⼩异。
每当打开⼀个⽂件的时候, 系统会根据⽂件的情况⾃动创建⼀个FILE结构的变量,并填充其中的信
,⼀般都是通过⼀个FILE的指针来维护这个FILE结构的变量,也就是文件指针,这样使⽤起来也就更加⽅便。
FILE* pf1;//创建⽂件指针变量pf1
定义pf1是⼀个指向FILE类型数据的指针变量,可以使pf1指向某个⽂件的⽂件信息区(是⼀个结构体变 量),通过该⽂件信息区中的信息就能够访问该⽂件。
这样,通过⽂件指针变量能够 间接找到与它关联的⽂件

文件打开和关闭

⽂件在读写之前应该先打开⽂件,在使⽤结束之后应该关闭⽂件。
在编写程序的时候,在打开⽂件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建⽴了指针和⽂件的关系。
ANSI C(C语言标准) 规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件,这里我们不清楚如何使用,就可以在C Plus Plus上面寻找答案。

打开文件:fopen

fopen第一个参数是需要打开的文件的文件名,第二个参数是mode,表⽰⽂件的打开模式,在C Plusplus上面也给出了一些文件的打开模式。

下面也对一些打开模式进行了总结

打开方式                含义                                                                    指定文件不存在处理方式

如果打开文件成功,就会返回一个文件指针;如果打开失败,就会返回空指针,所以在打开文件时我们要判断文件是否打开成功。

关闭文件:fclose

这里的参数也就是一个文件指针,通过文件指针找到相应的文件,进行文件的关闭。

测试代码

//文件操作
#include<stdio.h>
int main()
{FILE* fp = fopen("test.txt", "w");//以写write的模式打开//使用一个文件指针来接收if (fp == NULL){perror("fopen");return 1;//打开失败,直接返回不为0的数据}//打开成功//进行读或者写的操作//关闭文件fclose(fp);fp = NULL;//避免fp成为野指针return 0;
}

通过前面我们知道如果以写的形式打开,当前目录指定文件不存在,就会在当前目录下创建一个新文件。

打开文件夹,我们可以看见创建了一个新的文件test.txt

文件具体操作

顺序读写

接下来的这些函数是按顺序来进行读或者写操作的。

fputc

我们先在C Plusplus看看这个函数

我们可以知道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);//关闭文件fclose(fp);fp = NULL;//避免fp成为野指针return 0;
}

我们可以看见成功打开了一个文件,并且进行了字符输入,我们也可以使用循环进行输入

char c = 0;
for (c = 'a'; c <= 'z'; c++)
{fputc(c, fp);
}

我们可以看到,它清空了原来的字符进行了新的写操作,这里需要注意的是

是否清空原来的字符主要是跟我们打开文件的方式有关系,如果你打开文件是w打开的,写入就会清空原来文件内容,如果是想追加写,打开文件方式是a

fgetc

我们依然先在C Plusplus看看这个函数

我们可以知道fgetc是从流中获取一个字符的,这是一个字符输入函数,适用于所有的输入流。我们可以使用它来读文件,如果读取成功就返回读取的字符,如果读取失败就返回文件末尾(EOF)。

我们来使用一下这个函数

#include<stdio.h>
int main()
{//打开文件FILE* fp = fopen("test.txt", "r");if (fp == NULL){//打开失败perror("fopen");return 1;}//打开成功//进行操作printf("%c", fgetc(fp));printf("%c", fgetc(fp));printf("%c", fgetc(fp));printf("%c", fgetc(fp));printf("%c", fgetc(fp));//关闭文件fclose(fp);fp = NULL;//避免fp成为野指针return 0;
}

读取了五次,也就读取到了五个字符(最开始写文件向文件写入了abcd……xyz)

我们可以使用循环来读取全部内容

char c = 0;
while ((c = fgetc(fp)) != EOF)
{printf("%c", c);//没有遇到文件末尾读取就没有结束
}

fputs

我们可以看到我们可以知道fputs是写一个字符串到流中的,这是一个文本行输出函数,适用于所有的输出流

如果写入失败就会返回EOF

//文件操作
#include<stdio.h>
int main()
{//打开文件FILE* fp = fopen("test.txt", "w");if (fp == NULL){//打开失败perror("fopen");return 1;}//打开成功//进行操作fputs("abcdefgh", fp);//关闭文件fclose(fp);fp = NULL;//避免fp成为野指针return 0;
}

fgets

我们可以知道fgets是从流中获取字符串的,这是一个文本行输入函数,适用于所有的输入流

str:一个字符数组指针接收读取到的字符

num:最大读取到的字符个数

stream:获取字符的流

如果读取成功返回str(存储数据数组的地址),失败会进行判断,有feof和ferror两种可能(后面会有讲解)

接下来,我们来进行使用

#include<stdio.h>
int main()
{//打开文件FILE* fp = fopen("test.txt", "r");if (fp == NULL){//打开失败perror("fopen");return 1;}//打开成功//进行操作char arr[100] = { 0 };/*while (fgets(arr,100,fp)!=NULL){printf("%s ", arr);}*/fgets(arr, 100, fp);printf("%s ", arr);//关闭文件fclose(fp);fp = NULL;//避免fp成为野指针return 0;
}

fprintf

这个我们可以将它与printf进行对比

我们可以看到fprintf只是多了第一个参数,printf是从标准输出流进行读,fprintf是可以从所有的输出流中进行读,是一个格式化输入函数,其他与printf的使用没有很大的差别。

我们来简单使用一下:

#include<stdio.h>
int main()
{//打开文件FILE* fp = fopen("test.txt", "w");if (fp == NULL){//打开失败perror("fopen");return 1;}//打开成功//进行操作char name[10] = "Lily";int num = 123;float weight = 56;fprintf(fp, "%s %d %.2f", name, num, weight);//关闭文件fclose(fp);fp = NULL;//避免fp成为野指针return 0;
}

我们也可以在标准输出流进行输出

fscanf

这个我们可以将它与scanf进行对比

我们可以看到fscanf只是多了第一个参数,scanf是从标准输入流进行读,fscanf是可以从所有的流中进行读,是一个格式化输入函数

#include<stdio.h>
int main()
{//打开文件FILE* fp = fopen("test.txt", "r");if (fp == NULL){//打开失败perror("fopen");return 1;}//打开成功//进行操作//读文件char name[20] = { 0 };int num = 0;float weight = 0;fscanf(fp, "%s %d %f", name, &num, &weight);printf("%s %d %.2f", name, num, weight);//关闭文件fclose(fp);fp = NULL;//避免fp成为野指针return 0;
}

我们在标准输入流和标准输出流进行一个简单的测试

//标准输入流,标准输出流
#include<stdio.h>
int main()
{char name[20] = { 0 };int num = 0;float weight = 0;fscanf(stdin, "%s %d %f", name, &num, &weight);fprintf(stdout,"%s %d %.2f", name, num, weight);return 0;
}

fwrite

fwrite是以⼆进制进行输出,适用于 ⽂件输出流。
ptr:指向要写入数组的指针
size:每一个元素字节大小
count:写的元素个数
stream:流
注意:这里写文件以二进制形式写,打开时是“wb”
#include<stdio.h>
int main()
{FILE* fp = fopen("test.txt", "wb");//以二进制形式写wbif (fp == NULL){perror("fopen");return 1;}int arr[] = { 1,2,3,4,5,6 };int count = sizeof(arr) / sizeof(arr[0]);fwrite(arr, sizeof(arr[0]), count, fp);fclose(fp);fp = NULL;return 0;
}

当以二进制形式写,我们是无法读取到内容的,我们可以使用fread读取二进制信息。

fread

fread是以⼆进制进行输入,适用于⽂件输入流。

#include<stdio.h>
int main()
{FILE* fp = fopen("test.txt", "rb");//以二进制形式读,rbif (fp == NULL){perror("fopen");return 1;}int arr[6] = { 0 };int i = 0;for (i = 0; i < 6; i++){//fread(&arr[i], sizeof(arr[0]), 6, fp);//读取一次打印一次fread(arr + i, sizeof(arr[0]), 6, fp);printf("%d ", arr[i]);}fclose(fp);fp = NULL;return 0;
}

fread读取成功返回值是读取的元素总个数,如果返回值小于要求读取的个数,那就意味着这是最后一次读取。

对比

printf --针对标准输出流( stdout )的,将数据以格式化的形式, 输出到屏幕上
 scanf ﹣针对标准输入流( stdin )的,从键盘上输入格式化的数据


 fprintf --针对所有输出流的,格式化的输出函数
 fscanf --针对虽有输入流的,格式化输入函数


 sprintf --将格式化的数据转换成字符串
 sscanf -﹣从字符串中提取出格式化的数据

随机读写

fseek

fseek可以根据 ⽂件指针的位置和偏移量 来定位 ⽂件指针 (⽂件内容的光标)
offset代表文件指针的偏移量
origin代表文件指针起始位置
1.SEEK_SET——文件指针的起始位置
2.SEEK_SUR——文件指针的当前位置
3.SEEK_END——文件指针的末尾
我们来进行一个简单的使用,首先我们向文件里面写入“abcdefg”

#include<stdio.h>
int main()
{FILE* fp = fopen("test.txt", "r");if (fp == NULL){perror("fopen");return 1;}//abcdefg// |abcdefg       |代表光标位置fseek(fp, 1, SEEK_SET);//  a|bcdefg//与开头偏移量为1,读取到bchar c1 = fgetc(fp);//使用fgetc光标位置向后面移动//  ab|cdefgprintf("test1:%c\n", c1);fseek(fp, 1, SEEK_CUR);//   abc|defg//与当前位置偏移量为1,读取到dchar c2 = fgetc(fp);printf("test2:%c\n", c2);fseek(fp, -2, SEEK_END);//    abcde|fg//与结尾偏移量为-2,读取到f,向前面走2步char c3 = fgetc(fp);printf("test3:%c\n", c3);fclose(fp);fp = NULL;return 0;
}

我们一起来看看运行结果,是不是我们想的

注意!!! 使用fgetc光标会往后面移动一位
ftell
返回⽂件指针相对于起始位置的偏移量,也就是文件光标到文件起始位置的偏移量,返回类型为long int
接着上面的代码,我们可以知道这个时候 f 相当于起始位置偏移量为6
rewind
让⽂件指针的位置回到⽂件的起始位置,这样方便我们下一次的操作
简单测试rewind
#include<stdio.h>
int main()
{FILE* fp = fopen("test.txt", "r");if (fp == NULL){perror("fopen");return 1;}//abcdefgfseek(fp, -2, SEEK_END);char c3 = fgetc(fp);printf("test3:%c\n", c3);long int ret1 = ftell(fp);printf("ret1:%ld\n", ret1);rewind(fp);//文件光标回到起始位置long int ret2 = ftell(fp);printf("ret2:%ld\n", ret2);fclose(fp);fp = NULL;return 0;
}

文件读取结束的判定

不同函数使用,判断文件结束的方式不一样

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

——fgetc 判断是否为 EOF .(读取正常返回读取字符的ASCII码值)
——fgets 判断返回值是否为 NULL (读取正常返回存储数据数组的地址)
2.⼆进制⽂件的读取结束判断,判断返回值是否⼩于实际要读的个数。
fread读取成功返回值是读取的元素总个数,如果返回值小于要求(实际)读取的个数,那就意味着这是最后一次读取。

文件结束原因

1.遇到文件末尾(正常结束)

2.文件读取失败

feof

文件读取结束有很多种可能,而feof不是用来判断文件是否结束。

feof 的作⽤:
            当⽂件读取结束的时候,判断是读取结束的原因 是否是遇到⽂件尾结束
#include<stdio.h>
int main()
{FILE* fp = fopen("test.txt", "r");if (fopen == NULL){perror("fopen");return 1;}char ch = 0;while ((ch = fgetc(fp)) != EOF){putchar(ch);}printf("\n");//判断读取结束原因if (ferror(fp)){//文件读取遇到错误puts("Meet error when reading");}else if (feof(fp)){//文件读取到末尾puts("End of file reached successfully");}fclose(fp);fp = NULL;return 0;
}

显然,这一段代码是遇到文件末尾结束的。

二进制文件读取结束

//二进制文件读取结束
#include <stdio.h>
enum { SIZE = 5 };
int main(void)
{double a[SIZE] = { 1.,2.,3.,4.,5. };FILE* fp = fopen("test.txt", "wb"); // 二进制模式打开写文件fwrite(a, sizeof * a, SIZE, fp); // 写 double 的数组fclose(fp);double b[SIZE];fp = fopen("test.txt", "rb");//读文件size_t ret_code = fread(b, sizeof * b, SIZE, fp); // 读 double的数组if (ret_code == SIZE)//判断读取到的元素个数是否与要求读取的相等{puts("Array read successfully, contents: ");for (int n = 0; n < SIZE; ++n)printf("%f ", b[n]);putchar('\n');}//读取不一致判断结束原因else { // error handlingif (feof(fp)){printf("Error reading test.txt: unexpected end of file\n");}else if (ferror(fp)) {perror("Error reading test.txt");}}fclose(fp);
}

可以发现文件正常结束

ferror和feof

  1. 在文件读/写的过程中,如果发生错误,就会将一个错误标记,设置一下
 ferror ():检测这个错误标记是否被设置,如果被设置,就是在读取过程中发生错误


  2.在文件读/写的过程中,如果遇到文件末尾,就会将会有一个文件末尾的标记,设置一下
 feof ()函数:检测这个文件末尾标记是否被设置,如果被设置,就是在读取过程中遇到文件末尾

文件缓冲区

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

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

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

相关文章

【有啥问啥】 Self-Play技术:强化学习中的自我进化之道

Self-Play技术&#xff1a;强化学习中的自我进化之道 在人工智能的快速发展中&#xff0c;强化学习&#xff08;Reinforcement Learning, RL&#xff09;已成为推动智能体自主学习与优化的关键力量。Self-Play技术&#xff0c;作为强化学习领域的一项前沿创新&#xff0c;通过…

【智能大数据分析 | 实验一】MapReduce实验:单词计数

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘&#xff0c;以提取有价值的信息和洞察。它结合了大数据技术、人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&a…

git学习报告

文章目录 git学习报告如何配置vscode终端安装PowerShell安装 Microsoft.Powershell.Preview使用 git的使用关于团队合作 git指令本地命令&#xff1a;云端指令 git学习报告 如何配置vscode 安装powershell调教window终端&#xff0c;使其像Linux一样&#xff0c;通过Linux命令…

现代桌面UI框架科普及WPF入门1

现代桌面UI框架科普及WPF入门 文章目录 现代桌面UI框架科普及WPF入门桌面应用程序框架介绍过时的UI框架MFC (Microsoft Foundation Class)缺点 经典的UI框架**WinForms****QT****WPF** 未来的UI框架**MAUI****AvaloniaUI** WPF相对于Winform&#xff0c;QT&#xff0c;MFC的独立…

SysML图例-病毒检测设备

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> SysML图中词汇 SiNW-FET Silicon nanowire field-effect transistors&#xff0c;硅纳米线-场效应晶体管 更多信息可参见&#xff1a; 用于新冠检测的场效应晶体管生物传…

将CSS OKLCH颜色转换为十六进制HEX颜色和十六进制整数格式

我查找了全网都查不到OKLCH&#xff08;&#xff09;方法是颜色转换方法&#xff0c;那今天小编就给大家分享我的方法&#xff0c;可能会有点点误差&#xff0c;但是大体不影响。 程序员必备宝典https://tmxkj.top/#/示例&#xff1a;oklch(0.253267 0.015896 252.418) 得到H…

YOLOv10改进,YOLOv10主干网络替换为VanillaNet( CVPR 2023 华为提出的全新轻量化架构),大幅度涨点

摘要 基础模型的核心理念是“更多即不同”,这一理念在计算机视觉和自然语言处理领域取得了惊人的成功。然而,变压器模型的优化挑战和固有复杂性呼唤一种向简化转变的范式。在本研究中,引入了 VanillaNet,一种拥抱设计优雅的神经网络架构。通过避免高深度、快捷方式和复杂操…

多级目录SQL分层查询

需求&#xff1a;有多级目录&#xff0c;而目录的层级是不固定的&#xff0c;如下图所示&#xff1a; 数据结构&#xff1a; sql语句&#xff1a; <select id"getList" resultType"com.hikvision.idatafusion.dhidata.bean.vo.knowledgebase.KnowledgeBaseT…

瑞芯微RK3566鸿蒙开发板Android11修改第三方输入法为默认输入法

本文适用于触觉智能所有支持Android11系统的开发板修改第三方输入法为默认输入法。本次使用的是触觉智能的Purple Pi OH鸿蒙开源主板&#xff0c;搭载了瑞芯微RK3566芯片&#xff0c;类树莓派设计&#xff0c;是Laval官方社区主荐的一款鸿蒙开发主板。 一、安装输入法并查看输入…

Fyne ( go跨平台GUI )中文文档-Fyne总览(二)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2​​​​​​​ 这是一个系列文章&#xff1a; Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne…

大数据-146 Apache Kudu 安装运行 Dockerfile 模拟集群 启动测试

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

BERT训练环节(代码实现)

1.代码实现 #导包 import torch from torch import nn import dltools #加载数据需要用到的声明变量 batch_size, max_len 1, 64 #获取训练数据迭代器、词汇表 train_iter, vocab dltools.load_data_wiki(batch_size, max_len) #其余都是二维数组 #tokens, segments, vali…

OceanBase 3.X 高可用 (一)

OceanBase 3.X 高可用&#xff08;一&#xff09; 一、分布式核心 OceanBase 3.x 采用的是paxos 协议&#xff0c;与raft协议相比。其复杂程度高&#xff0c;实现技术难度大。 Paxos 协议允许事务日志乱序发送&#xff0c;顺序提交。raft允许事务顺序发送&#xff0c;顺序提…

关于 NLP 应用方向与深度训练的核心流程

文章目录 主流应用方向核心流程&#xff08;5步&#xff09;1.选定语言模型结构2.收集标注数据3.forward 正向传播4.backward 反向传播5.使用模型预测真实场景 主流应用方向 文本分类文本匹配序列标注生成式任务 核心流程&#xff08;5步&#xff09; 基本流程实现的先后顺序…

聊聊Thread Local Storage

聊聊ThreadLocal 为什么需要Thread Local StorageThread Local Storage的实现PThread库实现操作系统实现GCC __thread关键字实现C11 thread_local实现JAVA ThreadLocal实现 Thread Local Storage 线程局部存储&#xff0c;简称TLS。 为什么需要Thread Local Storage 变量分为全…

MySQL程序

目录 MySQL程序 常用的MySQL的程序 mysqld程序 mysql客户端 客户端命令的常用的选项 配置文件 配置文件语法 MySQL客户端命令 ​编辑 .sql 文件中执行SQL语句 mysqlcheck &#xff08;表维护程序&#xff09; Mysqldump&#xff08;数据库备份程序&#xff09; mysql…

[数据集][目标检测]基于yolov5增强数据集算法mosaic来扩充自己的数据集自动生成增强图片和对应标注无需重新标注

【算法介绍】 YOLOv5最引人注目的增强技术之一是马赛克增强&#xff0c;它将四张不同的图像拼接成一张图像。 思路&#xff1a;首先&#xff0c;从数据集中随机选择四张图像&#xff0c;然后将它们缩放、随机裁剪&#xff0c;并按马赛克模式拼接在一起。这种方式允许模型看到…

10. 排序

一、排序的概念及引用 1. 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录…

无人机之编程基础原理

无人机编程基础原理涉及多个方面&#xff0c;主要包括无人机的基本原理、飞行控制算法、编程语言及算法应用等。以下是对这些方面的详细阐述&#xff1a; 一、无人机基本原理 无人机的基本原理是理解其结构、飞行原理、传感器和控制系统等的基础。无人机通常由机身、动力系统&…

企业如何利用短视频平台做口碑塑造和品牌营销?

抖音和小红书作为短视频平台的代表&#xff0c;吸引了大量的用户和品牌。如何利用抖音、小红书等短视频平台进行品牌塑造和口碑营销呢&#xff1f;小马识途营销顾问分析&#xff0c;短视频平台的用户以年轻人为主&#xff0c;他们具有高度的社交性和消费意愿。短视频平台提供了…