【进阶C语言】C语言文件操作
1. 为什么使用文件
2. 什么是文件
3. 文件的打开和关闭
4. 文件的顺序读写
5. 文件的随机读写
6. 文本文件和二进制文件
7. 文件读取结束的判定
8. 文件缓冲区
一、文件与文件的意义
1.文件的意义
文件的意义,无非就是为什么要使用文件?
(1)前面学习写了通讯录的程序,当通讯录运行起来的时候,可以给通讯录中增加、删除数
据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下次运行通讯录程序的时候,数据又得重新录入,如果使用这样的通讯录就很难受(2)使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。
2.文件的定义
(1)文件分类
从文件功能的角度分类:程序文件和数据文件(本节论述的对象)
(1)程序文件:包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe),也就是我们写代码生成的文件。
(2)数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。用来提供数据或者存储数据
如:用函数操作文件(打开、输出等等操作),该文件就是数据文件。并且本节内容讨论的都是数据文件
关系:
(2)文件名
文件名就是文件的一个名字,一个文件要有一个唯一的文件标识,以便用户识别和引用。
文件名包括三个部分:文件路径+文件名主干+文件后缀
如: c:\code\test.txt
c:\code\:表示文件路径 test:表示文件名主干 .txt:表示文件后缀
二、文件的打开与关闭
1.文件指针
定义:
(1)“文件类型指针”,简称“文件指针”。
为什么会有文件指针:
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE.
struct _iobuf {char *_ptr;int _cnt;char *_base;int _flag;int _file;int _charbuf;int _bufsiz;char *_tmpfname;};
typedef struct _iobuf FILE;
FILE就是一个结构体类型,可以用它来创造结构体指针,称为文件指针变量
FILE* pf;//文件指针变量
关于文件打开的知识:
每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,该变量就指向了文件信息区,通过该指针就可以找到文件。使用者不必关心细节。
所以我们需要创造一个文件指针变量来接收打开文件后返回的变量,该指针变量就可以访问该文件。
总结:定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。
图示:
2.文件的打开与关闭
(1)意义:文件在读写之前应该先打开文件,在使用结束之后应该关闭文件
(2)在标准C中规定:使用fopen函数来打开文件,fclose来关闭文件。
(3)fopen:
//打开文件
FILE * fopen ( const char * filename, const char * mode );
函数解析:
文件的打开方式:
文件使用方式 | 含义 | 如果指定文件不存在 |
---|---|---|
“r”(只读) | 为了输入数据,打开一个已经存在的文本文件 | 出错 |
“w”(只写) | 为了输出数据,打开一个文本文件 | 建立一个新的文件 |
“a”(追加) | 向文本文件尾添加数据 | 建立一个新的文件 |
“rb”(只读) | 为了输入数据,打开一个二进制文件 | 出错 |
“wb”(只写) | 为了输出数据,打开一个二进制文件 | 建立一个新的文件 |
“ab”(追加) | 向一个二进制文件尾添加数据 | 出错 |
“r+”(读写) | 为了读和写,打开一个文本文件 | 出错 |
“w+”(读写) | 为了读和写,建议一个新的文件 | 建立一个新的文件 |
“a+”(读写) | 打开一个文件,在文件尾进行读写 | 建立一个新的文件 |
“rb+”(读写) | 为了读和写打开一个二进制文件 | 出错 |
“wb+”(读写) | 为了读和写,新建一个新的二进制文件 | 建立一个新的文件 |
“ab+”(读写) | 打开一个二进制文件,在文件尾进行读和写 | 建立一个新的文件 |
如:
FILE* pf = fopen("data.txt", "r");
(4)fcolse:
//关闭文件
int fclose ( FILE * stream );
函数解析:
(5)打开与关闭
目的:在当前路径以“r”的形式打开:data.txt的文档
#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}fclose(pf);//关闭文件pf == NULL;//将指针置空return 0;
}
运行结果:
表示当前文件不存在或者找不到
当前路径的文件:
添加该(文本)文档后:
结果:
(6)文件打开的两种路径:相对路径和绝对路径
如:需要打开的文档在上一层路径
相对路径:
运行结果:
修改代码:
#include<stdio.h>
int main()
{FILE* pf = fopen("..\\data.txt", "r");if (pf == NULL){perror("fopen");return 1;}fclose(pf);pf == NULL;return 0;
}
相对路径解析:
(1).\\:表示当前路径,不写则默认当前路径
(2)..\\:表示上一层路径。(\\为转义符号,转义后为一个\)
绝对路径:
第一步:找到该文档的路径
第二步:打开文件
#include<stdio.h>
int main()
{FILE* pf = fopen("C:\\gitee代码\\first-warehouse\\data.txt", "r");if (pf == NULL){perror("fopen");return 1;}fclose(pf);pf == NULL;return 0;
}
运行结果:
程序与文件的关系:
三、文件的读写
前面论述了文件的打开与关闭,接下来就是对文件的读写操作了
顺序读写
在顺序读写中,需要用到以下的函数:
功能 | 函数名 | 适用于 |
---|---|---|
字符输入函数 | fgetc | 所有输入流 |
字符输出函数 | fputc | 所有输出流 |
文本行输入函数 | fgets | 所有输入流 |
文本行输出函数 | fputs | 所有输出流 |
格式化输入函数 | fscanf | 所有输入流 |
格式化输出函数 | fprintf | 所有输出流 |
二进制输入 | fread | 文件 |
二进制输出 | fwrite | 文件 |
输入流:文件-->程序 输出流:程序-->文件
大致分类:
(1)字符输入/输出函数:针对字符
(2)文本行输入/输出函数:针对一行数据,如字符串
(3)格式化输入/输出函数:格式化数据,如整形、浮点型
1-3操作的都是文本文件
(4)二进制输入/输出函数:二进制的文件
介绍流的概念:
原因:我们写好的程序(数据)想要输出某个位置(如下图),每个位置的输出方式都不一样,为了统一,我们引入了流的概念。
总结:流就是程序与系统之间的一个通道
为了方便程序员的操作,引入了流:每一个流的类型都是FILE*
我们只需要负责将数据引入流即可,流再负责存入外部设备上。
C语言程序:
C语言程序运行起来,就会自动打开三个流:
1.标准输入流stdin 2.标准输出流stdout 3.标准错误流stderr
这三个流的类型也都是FILE*
如:
(1)scanf函数(从键盘读取数据),会自动打开标准输入流
(2)printf函数(像屏幕打印数据),会自动打开标准输出流
文件:我们操作文件时,流不会自动打开,需要我们自己动手
我们打开文件和关闭文件的操作,相当于打开了一个流。
1.fputc函数
(1)这是输出字符函数,意思是将字符写入文件中,也就是写文件操作。
(2)该函数使用于所有输出流,也可以直接将信息输出到屏幕上。
例子1:输入26字母到文档中
#include<stdio.h>
int main()
{//1.打开文件FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}//2.写文件char ch = 0;for (ch = 'a'; ch <= 'z'; ch++){if (ch % 5 == 0)fputc('\n', pf);fputc(ch, pf);}//3.关闭文件fclose(pf);pf == NULL;return 0;
}
结果:
在输出的时候(写文件),有一个文件状态指针(类似光标)指向该文档,每写入一个文件,该指针就会指向下一个位置。(并不是pf指针)
例子2:利用输出流直接将数据输出到屏幕上
#include<stdio.h>
int main()
{//1.打开文件FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}//2.输出流char ch = 0;for (ch = 'a'; ch <= 'z'; ch++){if (ch % 5 == 0)fputc('\n', stdout);fputc(ch, stdout);}//3.关闭文件fclose(pf);pf == NULL;return 0;
}
运行结果:
2.fgetc函数
字符输入函数,用来将文件中的数据输入到程序中,称为读文件
(1)读取成功,返回该字符的ASCII值
(2)读取失败,返回EOF,并在流上设置一个错误标记,可用perror检测
例子:写一个程序读取文档中的数据并输出到屏幕上
(1)
(2)启动程序
#include<stdio.h>
int main()
{//1.打开文件(以只读的形式)FILE* pf = fopen("data.txt","r");if (pf == NULL){perror(fopen);return 1;}//2.读文件int ch = 0;while ((ch = fgetc(pf))!=EOF){printf("%c",ch);//输出到屏幕上}//3.关闭文件fclose(pf);pf = NULL;return 0;
}
结果展示:
3.fputs函数
例子1:程序输出到文档中
#include<stdio.h>
int main()
{//1.打开文件(不存在则创造文件)FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror(fopen);return 1;}//2.写文件fputs("love\n",pf);fputs("you\n",pf);//3.关闭文件fclose(pf);pf = NULL;return 0;
}
文档结果:
例子2:数据输出到屏幕上
#include<stdio.h>
int main()
{//1.打开文件(不存在则创造文件)FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror(fopen);return 1;}//2.写文件fputs("love\n",stdout);fputs("you\n",stdout);//3.关闭文件fclose(pf);pf = NULL;return 0;
}
结果:
4.fgets函数
读取数据的条件:
(1)遇到\n停止,只会读取一行的数据4
(2)只会读取num-1个数据
例子1:读取超过原有数据的个数
文档内容:
代码:
#include<stdio.h>
int main()
{//1.打开文件(不存在则创造文件)FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror(fopen);return 1;}//2.读文件int arr[100] = { 0 };//存放读取到的数据fgets(arr,100,pf);printf("%s\n",arr);//3.关闭文件fclose(pf);pf = NULL;return 0;
}
运行结果:
遇到\n停止了读取
例子2:读取少于数据个数
#include<stdio.h>
int main()
{//1.打开文件(不存在则创造文件)FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror(fopen);return 1;}//2.读文件int arr[100] = { 0 };//存放读取到的数据fgets(arr,3,pf);printf("%s\n",arr);//3.关闭文件fclose(pf);pf = NULL;return 0;
}
运行结果:
5.fprintf函数
用来把多种格式的数据输出到文件中
例子:
#include<stdio.h>
struct Stu
{float f;char c;int a;
};
int main()
{struct Stu s = {5.20,'a',1314};//1.打开文件FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror(fopen);return 1;}//2.写文件fprintf(pf,"%.2f-%c-%d",s.f,s.c,s.a);//3.关闭文件fclose(pf);pf = NULL;return 0;
}
存入文档后:
6.fscanf函数
例子:从上面的文档中输入,并打印到屏幕上
#include<stdio.h>
struct Stu
{float f;char c;int a;
};
int main()
{struct Stu s = {0};//1.打开文件FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror(fopen);return 1;}//2.读文件fscanf(pf, "%f-%c-%d", &(s.f), &(s.c), &(s.a));printf("%.2f-%c-%d\n", s.f, s.c, s.a);//3.关闭文件fclose(pf);pf = NULL;return 0;
}
结果:
以下函数针对二进制的文件
7.fwrite函数
将ptr中的内容输出到流所指向的文件中。
#include<stdio.h>
int main()
{int arr[5] = {1,2,3,4,5};//1.打开文件FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror(fopen);return 1;}//2.读文件fwrite(arr,sizeof(arr[0]),sizeof(arr)/sizeof(arr[0]),pf);//3.关闭文件fclose(pf);pf = NULL;return 0;
}
文件中的内容:
这是二进制文件,肉眼无法看懂,所以我们可以再用二进制函数输出即可
8.fread函数
返回值解析:fread要求读取count个大小为size大小的数据
(1)真是读取到了count个数据,则返回count
(2)没用读取到count个数据,返回的是真实读取到的完整数据个数
我们读取上面的二进制文件并且打印出来
#include<stdio.h>
int main()
{int arr[5] = {0};//1.打开文件FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror(fopen);return 1;}//2.读文件fread(arr,sizeof(arr[0]), sizeof(arr) / sizeof(arr[0]), pf);int i = 0;for (i=0;i<sizeof(arr)/sizeof(arr[0]);i++){printf("%d ",arr[i]);}//3.关闭文件fclose(pf);pf = NULL;return 0;
}
结果:
9.sscanf函数与sprintf函数
sscanf函数:将字符串转换成格式化的数据
sprintf函数:将格式化的数据转换成字符串
sprintf单独使用:
#include<stdio.h>
struct Stu
{float f;char c;int a;
};
int main()
{struct Stu s = {5.20,'a',520};int arr[20] = { 0 };//存放转换后的字符串sprintf(arr,"%.2f-%c-%d",s.f,s.c,s.a);printf("%s\n",arr);return 0;
}
结果:
配合sscanf函数转回格式化的数据:
#include<stdio.h>
struct Stu
{float f;char c;int a;
};
int main()
{struct Stu s = {5.20,'a',520};int arr[20] = { 0 };//存放转换后的字符串sprintf(arr,"%.2f-%c-%d",s.f,s.c,s.a);printf("%s\n",arr);struct Stu tmp = { 0 };//存放转回来的格式化数据sscanf(arr, "%f-%c-%d", &(tmp.f), &(tmp.c), &(tmp.a));printf("%.2f\n", tmp.f);printf("%c\n", tmp.c);printf("%d\n",tmp.a);return 0;
}
结果:
随机读写
前言:文件的随机读写不是随机读写,而是可以指定读写的位置。下面介绍三个函数
1.fseek函数
作用:根据文件指针的位置和偏移量来定位文件指针。
origin只有下面三种选择:
(1)SEEK_SET:文件的起始位置
(2)SEEK_CUR:文件当前指针(光标)的位置
(3)SEEK_END:文件的末尾位置
而偏移量offset需要计算
具体实例:
(1)在文档中存放数据
(2)代码
#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt","r");if (pf == NULL){perror(fopen);return 1;}//读文件int ch = 0;ch = fgetc(pf);printf("%c\n",ch);ch = fgetc(pf);printf("%c\n", ch);ch = fgetc(pf);printf("%c\n", ch);return 0;
}
下次再输入并且打印,就会是d;但是我们可以通过改变光标的位置,进而改变输入的内容。
#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt","r");if (pf == NULL){perror(fopen);return 1;}//读文件int ch = 0;ch = fgetc(pf);printf("%c\n",ch);//ach = fgetc(pf);printf("%c\n", ch);//bch = fgetc(pf);printf("%c\n", ch);//cfseek(pf,-3, SEEK_CUR);ch = fgetc(pf);printf("%c\n", ch);return 0;
}
结果:
或者:
又或者:
2.ftell函数
作用:返回偏移量
例子:
#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt","r");if (pf == NULL){perror(fopen);return 1;}//读文件int ch = 0;ch = fgetc(pf);printf("%c\n",ch);//ach = fgetc(pf);printf("%c\n", ch);//bch = fgetc(pf);printf("%c\n", ch);//cint pos = ftell(pf);printf("%d\n",pos);return 0;
}
3.rewind函数
作用:让文件指针(光标位置)回到文件的起始位置
例子:
#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt","r");if (pf == NULL){perror(fopen);return 1;}//读文件int ch = 0;ch = fgetc(pf);printf("%c\n",ch);//ach = fgetc(pf);printf("%c\n", ch);//bch = fgetc(pf);printf("%c\n", ch);//crewind(pf);ch = fgetc(pf);printf("%c\n", ch);return 0;
}
结果:
四、文本文件和二进制文件
根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
(1)文本文件:要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。
(2)二进制文件:数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件
【例题】将10000存储到文件中,两种方式
(1)10000在内存中的存储
00000000 00000000 00100111 00010000(补码的形式)
(2)将10000以文本文件的形式存储
语法要求:会将10000当成五个字符,分别以它的ASCII码存储。
如:
(3)将10000以二进制文件的形式存储
语法要求:不需要转换,直接以数据的二进制序列进行存储。
如:
(4)以二进制的形式写入文件
代码:
#include <stdio.h>
int main()
{int a = 10000;FILE* pf = fopen("test.txt", "wb");fwrite(&a, 4, 1, pf);//二进制的形式写到文件中fclose(pf);pf = NULL;return 0;
}
文档内容:
(5)通过操作观察以二进制的形式存入的值:
分析:10 27 00 00是什么?
10000的二进制序列为:00000000 00000000 00100111 00010000
转为十六进制为:0x00 0x00 0x27 0x10
当前机器以小端字节序存储,则:
总结:二进制文件就是数据直接以二进制的形式存储到文件中
五、文件读取结束与文件缓冲区
1.文件读取结束的标志
(1) 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
例如:
fgetc 判断是否为 EOF .
fgets 判断返回值是否为 NULL .(2) 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:
fread判断返回值是否小于实际要读的个数
总结:根据函数的返回值判断是否结束
区别两个函数:
(1)ferror:在文件读取结束后,用来判断文件是否因为读取过程中因为遇到错误而结束(非正常结束)
(2)feof:在文件读取结束后,用来判断文件是否因为读取过程中因为遇到文件结束标志而结束(正常结束)
例子:将文档a的内容拷贝到文档b中
//data1.txt---->data2.txt
#include<stdio.h>
int main()
{//打开文件data1.txtFILE* pfread = fopen("data1.txt","r");if (pfread==NULL){perror(fopen);return 1;}//打开文件data2.txt准备输出数据(输出到文件中)FILE* pfwrite = fopen("data2.txt","w");if (pfwrite == NULL){perror("fopen");fclose(pfwrite);return 1;}//数据拷贝int ch = 0;while ((ch = fgetc(pfread)) != EOF)//当等于EOF,读取结束{fputc(ch,pfwrite);}//关闭文件fclose(pfread);pfread = NULL;fclose(pfwrite);pfwrite = NULL;return 0;
}
拷贝后:
可以利用这个操作,保存程序中的内容
2.文件缓冲区
缓冲区的作用:
(1)从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。
(2)如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)
图解:
代码:
#include <stdio.h>
#include <windows.h>
//VS2013 WIN10环境测试
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;
}
结果说明:存在缓冲区,当在休眠的10秒内,文档中还没有内容
刷新缓冲区的条件:
(1)缓冲区已满
(2)主动调用函数刷新
(3)关闭文件(fclose)
缓冲区的作用:提高代码效率
相关文章:

【进阶C语言】C语言文件操作
1. 为什么使用文件 2. 什么是文件 3. 文件的打开和关闭 4. 文件的顺序读写 5. 文件的随机读写 6. 文本文件和二进制文件 7. 文件读取结束的判定 8. 文件缓冲区 一、文件与文件的意义 1.文件的意义 文件的意义,无非就是为什么要使用文件? (1&…...

Django实现音乐网站 (21)
使用Python Django框架做一个音乐网站, 本篇音乐播放器功能完善及原有功能修改。 目录 播放列表修改 视图修改 删除、清空播放器 设置路由 视图处理 修改加载播放器脚本 模板修改 脚本设置 清空功能实现 删除列表音乐 播放列表无数据处理 视图修改 播放…...
LeetCode 面试题 10.11. 峰与谷
文章目录 一、题目二、C# 题解 一、题目 在一个整数数组中,“峰”是大于或等于相邻整数的元素,相应地,“谷”是小于或等于相邻整数的元素。例如,在数组{5, 8, 4, 2, 3, 4, 6}中,{8, 6}是峰, {5, 2}是谷。现…...

【专题】测试人员为什么需要学会做业务总结?
背景 如何回答以下这个问题的知识支撑:系统的测试重点在哪,难点是什么,怎么攻克,为什么要这样设计?项目交接效率? 同样是做业务测试,为什么有的人是A有的人只能C 二、框架 2.1 测试场景 重点…...

uni-app:实现当前时间的获取,并且根据当前时间判断所在时间段为早上,下午还是晚上
效果图 核心代码 获取当前时间 toString()方法将数字转换为字符串 padStart(2, 0):padStart()方法用于在字符串头部填充指定的字符,使其达到指定的长度。该方法接受两个参数:第一个参数为期望得到的字符串长度,第二个参数为要填充…...
C# .Net6 指定WSDL, 生成Webservice,调用该接口服务
C# .Net6 指定WSDL, 调用该接口服务。 IDE: Microsoft Visual Studio Community 2022 (64 位)平台:.Net6协议:Soap协议 Xml格式 功能 需要开发一个前置机程序, 用于和硬件程序交互,已知条件是:嵌入式同事…...
JS基本小知识:函数
目录 函数的基本概念 函数的定义和调用 函数的定义 函数的调用 函数的参数和返回值 参数的作用域和生命周期 返回值的作用和使用场景 匿名函数和箭头函数 匿名函数 本文将介绍 JavaScript 中的一个知识点:函数。函数是 JavaScript 中非常重要的一个概念&am…...

在Windows下Edge浏览器OA发起流程问题
在Edge浏览器中发起流程 如上图所示,不能正常打开Excel,自动将Excel表格转为了PDF 怎么处理?还得使用IE浏览器来访问,但打开IE后又自动跳转到Edge,根本就不给使用,在Edge下使用IE模式也解决不了这个问题。…...

2020年亚太杯APMCM数学建模大赛A题激光标记舱口轮廓生成求解全过程文档及程序
2020年亚太杯APMCM数学建模大赛 A题 激光标记舱口轮廓生成 原题再现: 激光是20中的一项重要发明世纪,它被称为“最锋利的刀”、“最精确的尺子”和“最不寻常的光”。 激光已越来越多地应用于工业加工, 其中可以是就业在各种加工业务例如作…...
【单元测试】--工具与环境
一、单元测试工具概览 1.1 JUnit JUnit 是一个广泛用于 Java 程序开发的开源测试框架。它是单元测试的标准工具之一,用于编写和运行测试用例,以确保 Java 程序的各个组件按预期工作。以下是一些关键特点和概念,来介绍 JUnit: 注…...

基于Java的汽车维修预约管理系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding) 代码参考数据库参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…...

vscode调试container(进行rocksdb调试)+vscode比较git项目不同分支和fork的哪个分支
vscode调试container(进行rocksdb调试) 参考链接: https://blog.csdn.net/qq_29809823/article/details/128445308#t5 https://blog.csdn.net/qq_29809823/article/details/121978762#t7 使用vscode中的插件dev containners->点击左侧的…...
[python-大语言模型]从浅到深一系列学习笔记记录
整体学习路径参照:点这里 python-机器学习-深度学习-大语言模型-数据开发 面向开发者的LLM入门提示原则 面向开发者的LLM入门 学习链接: github地址:https://github.com/datawhalechina/prompt-engineering-for-developers 在线阅读地址&…...

Android 指定有线网或Wifi进行网络请求
Android 指定有线网或Wifi进行网络请求 文章目录 Android 指定有线网或Wifi进行网络请求一、前言:二、指定网络通讯测试1、 窗口命令 ping -I 网络节点 IP2、Java 代码指定特定网络通讯 三、指定特定网络的demo app 开发1、效果图:2、实际测试结果说明&a…...
消除过期的对象引用
Java虽然有自己的垃圾回收机制,但是并没有那么的智能,对于被引用的对象,就算我们已经不在使用它了,但是Java的回收机制是不会回收它们的,人们称之为“内存泄漏”。 以下为三种不同的内存泄漏场景,极其优化方案 1、只要类自己管理内存,就该警惕内存泄漏问题 例如Stack…...

【Shell】环境变量 自定义变量 特殊变量
Shell变量:环境变量 目标 1、理解什么是系统环境变量? 2、掌握常用的系统环境变量都有哪些? Shell变量的介绍 变量用于存储管理临时的数据, 这些数据都是在运行内存中的. 变量类型 系统环境变量 自定义变量 特殊符号变量 系统环境变…...
Maven 打包 jar、war 包配置
1、导出 jar 包配置 <build><finalName>weaver-customerservice-distribution-component</finalName><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></inc…...
感悟:一个小小的摄像头APP,也解决了很多BUG
本来以为,简单的测试一下就行了,应该没有几个BUG。应该是比较轻松的。 然而现实是每天干活时,都能发现几个BUG。这BUG不解决还不行。六石管理学告诉我们四大容易:说容易,看容易,看别人容易,会了…...

顺序表第三节(通讯录基础版)
目录 可以先看一遍第二节在看这个 顺序表(第二节)实现和解析-CSDN博客 1.顺序表的头文件 2.初始化通讯录 3.添加通讯录 特殊:查找对应姓名的通讯录的序号 4.删除通讯录 5.展示通讯录 6.查找通讯录 7.修改通讯录 8.销毁通讯…...
数字ID和字符串ID互相转化
对于想隐藏真实id的需求,比如想加密userId等 使用示例: * 不指定长度* AlphaIDCustom(12354); //会将数字转换为字母。* AlphaIDCustom(PpQXn7COf,true);//会将字母ID转换为对应的数字。* 指定长度* Alpha…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

CSS3相关知识点
CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...
LangChain【6】之输出解析器:结构化LLM响应的关键工具
文章目录 一 LangChain输出解析器概述1.1 什么是输出解析器?1.2 主要功能与工作原理1.3 常用解析器类型 二 主要输出解析器类型2.1 Pydantic/Json输出解析器2.2 结构化输出解析器2.3 列表解析器2.4 日期解析器2.5 Json输出解析器2.6 xml输出解析器 三 高级使用技巧3…...
手动给中文分词和 直接用神经网络RNN做有什么区别
手动分词和基于神经网络(如 RNN)的自动分词在原理、实现方式和效果上有显著差异,以下是核心对比: 1. 实现原理对比 对比维度手动分词(规则 / 词典驱动)神经网络 RNN 分词(数据驱动)…...