当前位置: 首页 > article >正文

C语言文件操作,看这一篇就够了!

一、文件的打开1.为什么使用文件我们前面学习结构体时写了通讯录的程序当通讯录运行起来的时候可以给通讯录中增加、删除数据此时数据是存放在内存中当程序退出的时候通讯录中的数据自然就不存在了等下次运行通讯录程序的时候数据又得重新录入如果使用这样的通讯录就很难受。我们在想既然是通讯录就应该把信息记录下来只有我们自己选择删除数据的时候数据才不复存在。这就涉及到了数据持久化的问题我们一般数据持久化的方法有把数据存放在磁盘文件、存放到数据库等方式。使用文件我们可以将数据直接存放在电脑的硬盘上做到了数据的持久化。2.什么是文件磁盘上的文件是文件。但是在程序设计中我们一般谈的文件有两种程序文件、数据文件从文件功能的角度来分类的。①程序文件包括源程序文件后缀为.c目标文件windows环境后缀为.obj何执行程序windows环境后缀为.exe。②数据文件文件的内容不一定是程序而是程序运行时读写的数据比如程序运行需要从中读取数据的文件或者输出内容的文件。本章讨论的是数据文件。③文件名一个文件要有一个唯一的文件标识以便用户识别和引用。文件名包含3部分文件路径文件名主干文件后缀例如:c:\code\test.txtc:\code\ test txt为了方便起见文件标识常被称为文件名。3.文件的打开和关闭struct _iobuf { char *_ptr; int _cnt; char *_base; int _flag; int _file; int _charbuf; int _bufsiz; char *_tmpfname; }; typedef struct _iobuf FILE;①文件指针缓冲文件系统中关键的概念是”文件类型指针”简称”文件指针”。每个被使用的文件都在内存中开辟了一个相应的文件信息区用来存放文件的相关信息如文件的名字文件状态及文件当前的位置等。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的取名FILE.例如VS2013编译环境提供的stdio.h头文件中有以下的文件类型申明不同的C编译器的FILE类型包含的内容不完全相同但是大同小异。每当打开一个文件的时候系统会根据文件的情况自动创建一个FILE结构的变量并填充其中的信息使用者不必关心细节。一般都是通过一个FILE的指针来维护这个FILE结构的变量这样使用起来更加方便。下面我们可以创建一个FILE*的指针变量FILE*pf;//文件指针变量定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区是一个结构体变量。通过该文件信息区中的信息就能够访问该文件。也就是说通过文件指针变量能够找到与它关联的文件。比如②文件的打开和关闭文件在读写之前应该先打开文件在使用结束之后应该关闭文件。在编写程序的时候在打开文件的同时都会返回一个FILE*的指针变量指向该文件也相当于建立了指针和文件的关系。ANSIC规定使用fopen函数来打开文件fclose来关闭文件。1)格式FILE* open (const char* filename,//文件名称 const char* mode) //文件的打开模式读、写……文件的打开模式r读read打开文件进行输入操作。该文件必须存在。w写入write创建一个空文件用于输出操作。如果同名文件已经存在则其内容被丢弃并且该文件被视为一个新的空文件。a附加append在文件末尾打开输出文件。输出操作总是将数据写入文件末尾文件将其扩展。忽略重新定位操作fseek、fsetpos、rewind。如果文件不存在则创建文件不存在。r读/更新read/update打开一个文件进行更新既可输入也可输出。该文件必须存在。w写入/更新write/update创建一个空文件并打开它进行更新既用于输入也用于输出。如果有一个文件同名已存在其内容将被丢弃并且该文件将被视为一个新的空文件。a附加/更新append/update打开一个文件进行更新既可输入也可输出所有输出操作都写入数据在文件的末尾。重新定位操作fseek、fsetpos、rewind会影响下一个输入操作但输出操作会将位置移动回文件末尾。如果文件不存在则会创建该文件。2代码#includestdio.h #includestring.h #includeerrno.h int main() { //1.打开文件 //①相对路径 //FILE* pffopen(test.txt,w); //②如果想打开桌面上的文件 //1要给出绝对路径 //2并且多加一个斜杠防止转义字符 //文件地址C:\Users\abc\Desktop\新建 RTF 文件.rtf FILE* pffopen(C:\\Users\\abc\\Desktop\\新建 RTF 文件.rtf,r); if(pfNULL) { //如果打开失败打印错误信息 printf(%s\n,strerror(errno)); return 1; } //2.读文件 //3.关闭文件 fclose(pf); pfNULL; return 0; }4、文件的顺序读写①写文件int fputc ( int character, FILE * stream ); //字符ASCII值是整数#includestdio.h #includestring.h #includeerrno.h int main() { //打开文件 FILE* pffopen(D:\\C code\\test.txt,w); //注意是w!!! //写文件 if(pfNULL) { printf(%s\n,strerror(errno)); return 1; } //写文件 char i0; for(ia;iz;i) fputc(i,pf); fputc(\n,pf); fputc(y,pf); //关闭文件 fclose(pf); pfNULL; return 0; }②读文件int fgetc ( FILE * stream );#includestdio.h #includestring.h #includeerrno.h int main() { //打开文件 FILE* pffopen(D:\\C code\\test.txt,r); //注意是r!!! if(pfNULL) { printf(%s\n,strerror(errno)); return 1; } //读文件 //1.单个读取 int ch0; chfgetc(pf); printf(%c\n,ch); //2.读取全部 while((chfgetc(pf))!EOF) printf(%c ,ch); //关闭文件 fclose(pf); pfNULL; return 0; }③写一行int fputs ( const char * str, FILE * stream );#includestdio.h #includestring.h #includeerrno.h int main() { //打开文件 FILE* pffopen(D:\\C code\\test.txt,w); if(pfNULL) { printf(%s\n,strerror(errno)); return 1; } //写一行 char ch[]Hello,world!; fputs(ch,pf); //关闭文件 fclose(pf); pfNULL; return 0; }④读一行char * fgets ( char * str, int num,FILE * stream );str指向读取的字符串所复制的字符数组的指针。num复制到 str 的最大字符数包括终止空字符。stream指向标识输入流的 FILE 对象的指针。stdin 可以用作从标准输入读取的参数。#includestdio.h #includestring.h #includeerrno.h int main() { //打开文件 FILE* pffopen(D:\\C code\\test.txt,r); if(pfNULL) { printf(%s\n,strerror(errno)); return 1; } char arr[20]; fgets(arr,5,pf); printf(%s,arr); //hell //最多读5个真正读到4个 //因为还会在空间里放\0 //关闭文件 fclose(pf); pfNULL; return 0; }//printf(%s\n,strerror(errno)); //等价于 perror(fopen);⑤fprintfint fprintf ( FILE * stream, const char * format, ... );#includestdio.h #includestring.h #includeerrno.h struct Student { char name[20]; int age; float score; }; int main() { FILE* pffopen(D:\\C code\\test.txt,w); if(pfNULL) { perror(fopen); return 1; } struct Student stu{zhangsan,18,90.5f}; fprintf(pf,%s %d %f,stu.name,stu.age,stu.score); fclose(pf); pfNULL; return 0; }⑥scanfint fscanf ( FILE * stream, const char * format, ... );#includestdio.h #includestring.h #includeerrno.h struct Student { char name[20]; int age; float score; }; int main() { FILE* pffopen(D:\\C code\\test.txt,r); if(pfNULL) { perror(fopen); return 1; } struct Student stu{0}; fscanf(pf,%s %d %f,stu.name,stu.age,stu.score); printf(%s %d %f,stu.name,stu.age,stu.score); fclose(pf); pfNULL; return 0; }1任何一个程序只要运行起来就会默认打开3个流FILE*stdin-标准输入流键盘FILE*stdout-标准输出流屏幕FILE*stderr-标准错误流屏幕2用fprintf的stdout可以打印到屏幕上struct Student stu{0}; fscanf(pf,%s %d %f,stu.name,stu.age,stu.score); fprintf(stdout,%s %d %f,stu.name,stu.age,stu.score);⑦fwrite以二进制的方式写size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );ptr:指向要写入的元素数组的指针转换为 const void*。size:每个要写入的元素的大小以字节为单位。size_t 是一种无符号整数类型。count:元素的数量每个元素的大小为 size 字节。size_t 是一种无符号整数类型。stream:指向指定输出流的 FILE 对象的指针。#includestdio.h #includestring.h #includeerrno.h struct Student { char name[20]; int age; float score; }; int main() { struct Student stu{zhangsan,18,50.3}; //以二进制的方式写 FILE* pffopen(D:\\C code\\test.txt,wb); if(pfNULL) { perror(fopen); return 1; } fwrite(stu,sizeof(struct Student),1,pf); fclose(pf); pfNULL; return 0; }⑧fread以二进制的方式读#includestdio.h #includestring.h #includeerrno.h struct Student { char name[20]; int age; float score; }; int main() { struct Student stu{0}; //以二进制的方式读 FILE* pffopen(D:\\C code\\test.txt,rb); if(pfNULL) { perror(fopen); return 1; } fread(stu,sizeof(struct Student),1,pf); printf(%s %d %f,stu.name,stu.age,stu.score); fclose(pf); pfNULL; return 0; }⑨区分scanf是针对标准输入的格式化输入语句prinf是针对标准输出的格式化输出语句fscanf是针对所有输入流的格式化输入语句fprintf是针对所有输出流的格式化输出语句sscanf从一个字符串中转化处一个格式化的数据sprintf是把一个格式化的数据转化成字符串序列化和反序列化#includestdio.h #includestring.h #includeerrno.h #includestdlib.h struct Student { char name[20]; int age; float score; }; int main() { struct Student stu{zhangsan,20,22.3f}; char buf[100]; //把stu中的格式化数据转化成字符串放到buf中 sprintf(buf,%s %d %f,stu.name,stu.age,stu.score); printf(%s\n,buf); struct Student tmp{0}; //从字符串buf中获取一个格式化的数据到tmp中 sscanf(buf,%s %d %f,tmp.name,tmp.age,tmp.score); printf(%s %d %f,tmp.name,tmp.age,tmp.score); return 0; }⑩通讯录优化#includestdio.h #includeassert.h #includestdlib.h #includestring.h #define MAX 100 #define DEFAULT_SZ 3 #define INC_SZ 2 struct PeoInfo//人的信息 { char name[20]; int age; char sex; char tel[12]; char add[20]; }; struct Contact//通讯录 { struct PeoInfo* data; int count; int capacity; }; void menu()//菜单 { printf(----------------------------------------\n); printf(----------- 0.exit ------------------\n); printf(----------- 1.add ------------------\n); printf(----------- 2.show ------------------\n); printf(----------- 3.del ------------------\n); printf(----------- 4.sort ------------------\n); printf(----------------------------------------\n); } void CheckCapacity(struct Contact* pc) { assert(pc); if (pc-count pc-capacity) { struct PeoInfo* ptr (struct PeoInfo*)realloc(pc-data, sizeof(struct PeoInfo) * (pc-capacity INC_SZ)); if (ptr NULL) { perror(CheckCapacity); return; } else { pc-data ptr; pc-capacity INC_SZ; printf(增容成功\n); } } } void LoadContact(struct Contact* pc) { FILE* pfRead fopen(My_通讯录.dat, rb); if (pfRead NULL) { perror(LoadContact); return; } struct PeoInfo tmp { 0 }; while (fread(tmp, sizeof(struct PeoInfo), 1, pfRead) 1) {//fread函数返回成功读取元素的个数 CheckCapacity(pc);//考虑要不要增容 pc-data[pc-count] tmp; pc-count; } fclose(pfRead); pfRead NULL; } int InitContact(struct Contact* pc)//初始化通讯录 { assert(pc); pc-count 0; pc-data (struct PeoInfo*)malloc(DEFAULT_SZ * sizeof(struct PeoInfo)); if (pc-data NULL) { perror(InitContact); return 1; } pc-capacity DEFAULT_SZ; LoadContact(pc);// return 0; } void AddContact(struct Contact* pc)//增加联系人 { assert(pc); CheckCapacity(pc); printf(请输入新增联系人的【姓名】\n); scanf(%s, pc-data[pc-count].name); printf(请输入新增联系人的【年龄】\n); scanf( %d, pc-data[pc-count].age); printf(请输入新增联系人的【性别】\n); scanf( %c, pc-data[pc-count].sex); printf(请输入新增联系人的【电话】\n); scanf( %s, pc-data[pc-count].tel); printf(请输入新增联系人的【地址】\n); scanf( %s, pc-data[pc-count].add); pc-count; printf(添加成功\n); } void ShowContact(struct Contact* pc) //展示通讯录 { assert(pc); int i 0; printf(%-5s: , 序号); printf(%-10s , 姓名); printf(%-5s , 性别); printf(%-15s , 电话); printf(%-15s , 地址); printf(\n); for (i 0;i pc-count;i) { printf(%-5d: , i); printf(%-10s , pc-data[i].name); printf(%-5c , pc-data[i].sex); printf(%-15s , pc-data[i].tel); printf(%-15s , pc-data[i].add); printf(\n); } } int find_by_name(struct Contact* pc) //通过名字查找是否在通讯录 { assert(pc); char nam[20]; scanf(%s, nam); int i 0; int ret -1; int cnt -1; for (i 0;i pc-count;i) { ret strcmp(nam, pc-data[i].name); cnt i; } if (ret 0) return cnt; return -1; } void DelContact(struct Contact* pc)//删除联系人 { assert(pc); if (pc-count 0) { printf(通讯录为空没有可以删除的联系人!\n); return; } int i 0; int is_del find_by_name(pc); if (is_del -1) { printf(未找到该联系人\n); return; } printf(请输入要删除联系人的【姓名】\n); for (i is_del;i pc-count;i) pc-data[i] pc-data[i 1]; pc-count--; } int cmp_by_name(const void* e1, const void* e2) //通过名字的字典序比较对通讯录成员进行比较 { assert(e1, e2); struct PeoInfo* a (struct PeoInfo*)e1; struct PeoInfo* b (struct PeoInfo*)e2; return strcmp(a-name, b-name); } void SortContact(struct Contact* pc)//排序通讯录 { assert(pc); qsort(pc-data, pc-count, sizeof(struct PeoInfo), cmp_by_name); printf(排序成功\n); } void SaveContact(struct Contact* pc) { assert(pc); FILE* pfWrite fopen(My_通讯录.dat, wb); if (pfWrite NULL) { perror(SaveContact); return; } int i 0; for(i0;ipc-count;i) fwrite(pc-data[i], sizeof(struct PeoInfo),1, pfWrite); fclose(pfWrite); pfWrite NULL; } void DestoryContact(struct Contact* pc) { free(pc-data); pc-data NULL; } enum Option//枚举选择 { //枚举时用逗号并非分号 EXIT, ADD, SHOW, DEL, SORT }; int main() { struct Contact con; InitContact(con); int i 0; int input 1; while (input) { menu(); scanf(%d, input); switch (input) { //记得写break case ADD: AddContact(con); break; case SHOW: ShowContact(con); break; case DEL: DelContact(con); break; case SORT: SortContact(con); break; case EXIT: SaveContact(con); DestoryContact(con); printf(------------退出通讯录------------\n); break; } } return 0; }5.文件的随机读写①fseek根据文件指针的位置和偏移量来定位文件指针int fseek ( FILE * stream, long int offset, int origin );//流 //偏移量 //起始位置stream:指向识别流的 FILE 对象的指针。offset:二进制文件从原点偏移的字节数。文本文件要么为零要么为 ftell 返回的值。origin:用作偏移量参考的位置。它由 cstdio 中定义的以下常量之一指定专门用作此函数的参数#includestdio.h #includestring.h #includeerrno.h int main() { FILE* pf fopen(My_通讯录.txt, r); if (pf NULL) { perror(foopen); return 1; } fseek(pf, 50, SEEK_SET); //从起始位置偏移50 fseek(pf, 23, SEEK_CUR); //从当前位置偏移23 fseek(pf, -2, SEEK_END); //从末尾偏移-2 int ch fgetc(pf); printf(%c, ch); fclose(pf); pf NULL; return 0; }②ftell返回文件指针相对于起始位置的偏移量long int ftell ( FILE * stream );#includestdio.h #includestring.h #includeerrno.h int main() { FILE* pf fopen(My_通讯录.txt, r); if (pf NULL) { perror(foopen); return 1; } fseek(pf, 5, SEEK_SET); //从起始位置偏移5 int ch fgetc(pf); printf(%c\n, ch); printf(%d\n, ftell(pf));//6 fseek(pf, 3, SEEK_CUR); //从当前位置偏移3 ch fgetc(pf); printf(%c\n, ch); printf(%d\n, ftell(pf));//10 fseek(pf, -2, SEEK_END); //从末尾偏移-2 ch fgetc(pf); printf(%c\n, ch); printf(%d\n, ftell(pf));//179 fclose(pf); pf NULL; return 0; }③rewind让文件指针的位置回到文件的起始位置void rewind ( FILE * stream );#includestdio.h #includestring.h #includeerrno.h int main() { FILE* pf fopen(My_通讯录.txt, r); if (pf NULL) { perror(foopen); return 1; } fseek(pf, 5, SEEK_SET); //从起始位置偏移5 int ch fgetc(pf); printf(%c\n, ch); printf(%d\n, ftell(pf));//6 rewind(pf); printf(%d\n, ftell(pf));//0 fclose(pf); pf NULL; return 0; }6.文本和二进制文件根据数据的组织形式数据文件被称为文本文件或者二进制文件。数据在内存中以二进制的形式存储如果不加转换的输出到外存就是二进制文件。如果要求在外存上以ASCII码的形式存储则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。一个数据在内存中是怎么存储的呢字符一律以ASCII形式存储数值型数据既可以用ASCII形式存储也可以使用二进制形式存储。如有整数10000如果以ASCII码的形式输出到磁盘则磁盘中占用5个字节每个字符一个字节而二进制形式输出则在磁盘上只占4个字节VS2013测试。7.文件读取结束的判定①被错误使用的feof牢记在文件读取过程中不能用feof函数的返回值直接用来判断文件的是否结束。而是应用于当文件读取结束的时候判断是读取失败结束还是遇到文件尾结束。a.文本文件读取是否结束判断返回值是否为EOFfgetc或者NULLfgets。ofgetc判断是否为EOF。fgets判断返回值是否为NULb.二进制文件的读取结束判断判断返回值是否小于实际要读的个数。fread判断返回值是否小于实际要读的个数。8.文件缓冲区ANSIC标准采用“缓冲文件系统”处理的数据文件的所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块”文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据则从磁盘文件中读取数据输入到内存缓冲区充满缓冲区然后再从缓冲区逐个地将数据送到程序数据区程序变量等。缓冲区的大小根据C编译系统决定的。这里可以得出一个结论因为有缓冲区的存在C语言在操作文件的时候需要做刷新缓冲区或者在文件操作结束的时候关闭文件。如果不做可能导致读写文件的问题。

相关文章:

C语言文件操作,看这一篇就够了!

一、文件的打开1.为什么使用文件我们前面学习结构体时,写了通讯录的程序,当通讯录运行起来的时候,可以给通讯录中增加、删除数据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了&a…...

PYNQ项目极速安装指南:3步开启嵌入式Python开发新时代

PYNQ项目极速安装指南:3步开启嵌入式Python开发新时代 【免费下载链接】PYNQ 项目地址: https://gitcode.com/gh_mirrors/py/PYNQ PYNQ(Python productivity for Zynq)是一款让嵌入式开发者通过Python轻松控制FPGA的强大框架&#xf…...

Sonar-Java完全指南:从安装到代码质量分析的终极入门教程

Sonar-Java完全指南:从安装到代码质量分析的终极入门教程 【免费下载链接】sonar-java :coffee: SonarSource Static Analyzer for Java Code Quality and Security 项目地址: https://gitcode.com/gh_mirrors/so/sonar-java Sonar-Java是一款强大的Java代码…...

掌握Quokka时间序列分析:窗口函数、ASOF连接与模式识别实战

掌握Quokka时间序列分析:窗口函数、ASOF连接与模式识别实战 【免费下载链接】quokka marsupialtail/quokka: Quokka 是一个轻量级的内容管理系统或静态站点生成器,通常用于快速搭建个人博客、文档网站等,具有简单易用的特点。 项目地址: ht…...

DFImageManager核心功能解析:从加载到缓存的完整流程

DFImageManager核心功能解析:从加载到缓存的完整流程 【免费下载链接】DFImageManager Image loading, processing, caching and preheating 项目地址: https://gitcode.com/gh_mirrors/df/DFImageManager DFImageManager是一款功能强大的图片管理框架&#…...

pdoc未来路线图:即将到来的新特性与社区贡献指南

pdoc未来路线图:即将到来的新特性与社区贡献指南 【免费下载链接】pdoc :snake: :arrow_right: :scroll: Auto-generate API documentation for Python projects 项目地址: https://gitcode.com/gh_mirrors/pdoc/pdoc pdoc是一款自动生成Python项目API文档的…...

pfelk日志解析深度剖析:从原始数据到可操作安全情报的转化过程

pfelk日志解析深度剖析:从原始数据到可操作安全情报的转化过程 【免费下载链接】pfelk pfSense/OPNsense Elastic Stack 项目地址: https://gitcode.com/gh_mirrors/pf/pfelk pfelk是一款将pfSense/OPNsense防火墙日志与Elastic Stack完美结合的开源解决方案…...

高级功能探索:PlanetScale database-js的自定义格式化与扩展

高级功能探索:PlanetScale database-js的自定义格式化与扩展 【免费下载链接】database-js A Fetch API-compatible PlanetScale database driver 项目地址: https://gitcode.com/gh_mirrors/da/database-js PlanetScale database-js 是一款兼容 Fetch API 的…...

解决99%用户困惑:Home Assistant Glow常见问题与故障排除指南

解决99%用户困惑:Home Assistant Glow常见问题与故障排除指南 【免费下载链接】home-assistant-glow ⚡ The power of energy measurements in your house 项目地址: https://gitcode.com/gh_mirrors/ho/home-assistant-glow Home Assistant Glow是一款强大的…...

深入理解drcom-generic协议实现:从抓包分析到代码调试

深入理解drcom-generic协议实现:从抓包分析到代码调试 【免费下载链接】drcom-generic Dr.COM/DrCOM 现已覆盖 d p x三版。 项目地址: https://gitcode.com/gh_mirrors/dr/drcom-generic drcom-generic是一款功能强大的Dr.COM协议实现工具,支持d、…...

揭秘python-mss:比传统工具快3倍的截图技术核心原理

揭秘python-mss:比传统工具快3倍的截图技术核心原理 【免费下载链接】python-mss An ultra fast cross-platform multiple screenshots module in pure Python using ctypes. 项目地址: https://gitcode.com/gh_mirrors/py/python-mss python-mss是一个基于纯…...

PyCaret数据预处理:环境数据预处理方法

PyCaret数据预处理:环境数据预处理方法 【免费下载链接】pycaret An open-source, low-code machine learning library in Python 项目地址: https://gitcode.com/gh_mirrors/py/pycaret PyCaret是一个开源的低代码机器学习库,它提供了简单高效的…...

CarouselView扩展实战:实现无限轮播与网络图片加载

CarouselView扩展实战:实现无限轮播与网络图片加载 【免费下载链接】carouselview A simple library to add carousel view in android app. 项目地址: https://gitcode.com/gh_mirrors/ca/carouselview CarouselView是一个简单易用的Android轮播图库&#x…...

从0到1:使用Appz构建你的第一个跨应用交互功能

从0到1:使用Appz构建你的第一个跨应用交互功能 【免费下载链接】Appz 📱 Launch external apps, and deeplink, with ease using Swift! 项目地址: https://gitcode.com/gh_mirrors/ap/Appz Appz是一个强大的Swift框架,让开发者能够轻…...

NohBoard高级技巧:鼠标事件监控与游戏直播场景应用

NohBoard高级技巧:鼠标事件监控与游戏直播场景应用 【免费下载链接】NohBoard A Keyboard Visualizer 项目地址: https://gitcode.com/gh_mirrors/no/NohBoard NohBoard是一款功能强大的键盘可视化工具,不仅支持键盘按键的实时显示,还…...

终极PS4漏洞托管工具:ps4-exploit-host核心功能详解与优势分析

终极PS4漏洞托管工具:ps4-exploit-host核心功能详解与优势分析 【免费下载链接】ps4-exploit-host Easy Exploit Hosting 项目地址: https://gitcode.com/gh_mirrors/ps/ps4-exploit-host ps4-exploit-host是一款功能强大的本地漏洞托管工具,专为…...

intellij-swagger插件架构解析:核心组件与实现原理深度剖析

intellij-swagger插件架构解析:核心组件与实现原理深度剖析 【免费下载链接】intellij-swagger A plugin to help you easily edit Swagger and OpenAPI specification files inside IntelliJ IDEA 项目地址: https://gitcode.com/gh_mirrors/in/intellij-swagger…...

AutoX完全入门:3分钟学会用JavaScript编写第一个安卓自动化脚本

AutoX完全入门:3分钟学会用JavaScript编写第一个安卓自动化脚本 【免费下载链接】AutoX A UiAutomator on android, does not need root access(安卓平台上的JavaScript自动化工具) 项目地址: https://gitcode.com/gh_mirrors/auto/AutoX AutoX是一款强大的安…...

react-router-cache-route完全指南:像Vue的<keep-alive>一样缓存React路由组件

react-router-cache-route完全指南:像Vue的一样缓存React路由组件【免费下载链接】react-router-cache-route Route with cache for react-router V5 like in Vue 项目地址: https://gitcode.com/gh_mirrors/re/react-router-cache-route react-router-cache…...

pkgcloud存储服务实战:跨云平台文件上传下载最佳实践

pkgcloud存储服务实战:跨云平台文件上传下载最佳实践 【免费下载链接】pkgcloud pkgcloud is a standard library for node.js that abstracts away differences among multiple cloud providers. 项目地址: https://gitcode.com/gh_mirrors/pk/pkgcloud 在当…...

obsidian_vault_template_for_researcher模板库更新与个性化定制:打造属于你的科研笔记系统

obsidian_vault_template_for_researcher模板库更新与个性化定制:打造属于你的科研笔记系统 【免费下载链接】obsidian_vault_template_for_researcher This is an vault template for researchers using obsidian. 项目地址: https://gitcode.com/gh_mirrors/ob/…...

Mocker:革命性Swift网络请求模拟库,让单元测试彻底离线运行

Mocker:革命性Swift网络请求模拟库,让单元测试彻底离线运行 【免费下载链接】Mocker Mock Alamofire and URLSession requests without touching your code implementation 项目地址: https://gitcode.com/gh_mirrors/mo/Mocker Mocker是一款专为…...

Swaks配置文件详解:环境变量与命令行选项的灵活运用

Swaks配置文件详解:环境变量与命令行选项的灵活运用 【免费下载链接】swaks Swaks - Swiss Army Knife for SMTP 项目地址: https://gitcode.com/gh_mirrors/sw/swaks Swaks(Swiss Army Knife for SMTP)是一款功能强大的SMTP测试工具&…...

2026年代理IP与指纹浏览器协同架构及网络安全优化方案

一、引言在 2026 年的多账号安全运营体系中,代理 IP 与指纹浏览器已经形成高度耦合的整体架构。代理 IP 负责提供网络身份,指纹浏览器负责提供设备身份,两者协同工作,才能构建完整、安全、真实的虚拟环境。实际运营中,…...

PyCaret模型解释:媒体推荐系统可解释性的终极指南

PyCaret模型解释:媒体推荐系统可解释性的终极指南 【免费下载链接】pycaret An open-source, low-code machine learning library in Python 项目地址: https://gitcode.com/gh_mirrors/py/pycaret 在当今数据驱动的时代,媒体推荐系统已成为我们日…...

2026年指纹浏览器环境仿真与AI风控对抗技术完整解析

一、引言进入 2026 年,互联网平台的账号风控体系已经全面进入 AI 驱动时代。无论是电商平台、社交媒体、内容分发平台还是跨境业务系统,都在使用基于设备指纹、环境一致性、行为序列、网络特征的多维度检测模型。传统的多开工具、简单 IP 修改、表层 UA …...

VLC for iOS开发指南:如何为开源媒体播放器贡献代码

VLC for iOS开发指南:如何为开源媒体播放器贡献代码 【免费下载链接】vlc-ios VLC for iOS/iPadOS and tvOS official mirror 项目地址: https://gitcode.com/gh_mirrors/vl/vlc-ios VLC for iOS 是一款功能强大的开源媒体播放器应用,支持 iOS、i…...

如何用炉石传说脚本实现智能卡牌决策?2024最新配置指南

如何用炉石传说脚本实现智能卡牌决策?2024最新配置指南 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本)(2024.01.25停更至国服回归) 项目地址: https://gitcode.com/gh_mirrors/he/Hearthsto…...

IpaDownloadTool:重新定义iOS应用分发的智能管理方案

IpaDownloadTool:重新定义iOS应用分发的智能管理方案 【免费下载链接】IpaDownloadTool 输入下载页面链接自动解析ipa下载地址,支持本地下载,支持第三方和自定义下载页面(通过拦截webView的itms-services://请求获取plist文件,支持…...

软件测试用例详解

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、通用测试用例八要素  1、用例编号;   2、测试项目;  3、测试标题;4、重要级别;   5、预置条件&#xff1…...