文件处理不再难:带你轻松攻克C语言文件操作
嘿嘿,家人们,今天咱们来详细剖析C语言中的文件操作,好啦,废话不多讲,开干!
目录
1:为什么使用文件
2:文件的概念
2.1:程序文件
2.2:数据文件
2.3:文件名
3:二进制文件与文本文件
4:文件的打开与关闭
4.1:流与标准流
4.1.1:流
4.1.2:标准流
4.2:文件指针
4.3:文件的打开与关闭
4.3.1:代码1
4.3.2:代码2
4.4:相对路径与绝对路径
4.4.1:相对路径
4.4.2:绝对路径
5:文件的顺序读写
5.1:文件的顺序读写函数介绍
5.2:fputc函数
5.3:fgetc函数
5.4:fputs函数
5.5:fgets函数
5.6:fscanf函数
5.7:fprintf函数
5.8:fwrite函数
5.9:fread函数
5.95:对比函数
5.95.1:sprntf函数与sscanf函数
6:文件的随机读写
6.1:fseek函数
6.1.1:代码1
6.1.2:代码2
6.2:ftell函数
6.3:rewind函数
7:文本文件与二进制文件
8:文件读取结束的判定
9:文件缓冲区
1:为什么使用文件
如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存就会被操作系统回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件.
2:文件的概念
磁盘上的文件是文件,但是在程序设计中,按照文件功能的角度来进行分类,文件有两种:程序文件、数据文件.
2.1:程序文件
程序文件包括
- 源程序文件(后缀为.c).
- 目标文件(windows环境后缀为.obj).
- 可执行程序(windows环境后缀为.exe).
2.2:数据文件
- 文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件.
- 在本章我们主要讨论的是数据文件
- 在以前我们处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果到显示器上,但是有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存去进行使用,这个时候处理的就是磁盘上的文件.
2.3:文件名
一个文件要有一个唯一的标识符,以便用户识别和使用.
文件名包含以下三部分
- 文件路径.
- 文件名主干.
- 文件后缀.
例如:D:\VS代码\cplusplus\2_Classes_and_objects_part1\2_Classes_and_objects_part1\test.c
- D:\VS代码\cplusplus\2_Classes_and_objects_part1\2_Classes_and_objects_part1是文件路径
- test是文件名主干.
- .c是文件名后缀.
3:二进制文件与文本文件
根据数据的组织形式,数据文件被称为文本文件或者二进制文件.
- 二进制文件:数据在内存中以二进制的形式进行存储,并且不加转换的输出到外存.
- 文本文件:以ASCII字符的形式存储的文件.
一个数据在内存中是怎么进行存储的呢?
- 字符型数据一律以ASCII码的形式进行存储.
- 数值型数据既可以用ASCII码形式存储,也可以使用二进制的形式进行存储.
4:文件的打开与关闭
4.1:流与标准流
4.1.1:流
我们的程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,则抽象出了流的概念,可以把流想象成流淌着字符的星河.C语言针对文件、画面、键盘等的数据输入输出操作都是同流操作的.
- C程序针对文件、画面、键盘等的数据输入输出操作都是同流操作的.
- 一般情况下,如果想要往流里面写入数据,或者从流中读取数据,都是打开留,然后操作.
4.1.2:标准流
那么为什么我们从键盘输入数据,向屏幕上输出数据,并没有打开流呢那是因为C语言在程序启动的时候,默认打开了3个流.
- stdin - 标准输入流,在大多数的环境中从键盘输入.
- stdout - 标准输出流,大多数的环境中输出至显示器界面.
- stderr - 标准错误流,大多数环境中输出到显示器界面.
这是默认打开了这三个流,我们使用scanf,printf等函数就可以直接进行输入输出操作的.
stdin、stdout、stder三个流的类型是:FILE *,通常称为文件指针.
C语言中,就是通过FILE * 的文件指针来维护流的各种操作的.
4.2:文件指针
在缓冲文件系统中,关键的概念是:"文件类型指针",简称"文件指针".
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件的状态以及文件当前的状态等).这些信息是保存在一个结构体变量中的.该结构体类型是系统声明的,取名为FILE.
例如:VS2013编译环境提供的stdio.h头文件中有以下的文件类型声明:
struct _iobuf
{char *_ptr;int _cnt;char *_base;int _flag;int _file;int _charbuf;int _bufsiz;char *_tmpfname;};
typedef struct _iobuf FILE;
不同的C语言编译器的FILE类包含的内容不完全相同,但是大同小异.
每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,那么使用者其实不需要关系细节.
一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样子的话使用起来更加方便.
我们可以创建一个FILE*的指针变量
FILE * pf;
定义pf是一个指向FILE类型数据的指针变量.可以使pf指向某个文件的文件信息区(是一个结构体变量).通过该文件信息区的信息能够访问该文件.也就是说,通过文件指针变量能够间接找到与它关联的文件.

4.3:文件的打开与关闭
文件在读写之前应该先打开文件,在使用结束之后应该关闭文件.
在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也就相当于建立了指针与文件的关系.ANSIC规定使用fopen函数打开文件,fclose来关闭文件.
//打开⽂件
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件
int fclose ( FILE * stream );
mode表示文件的打开模式,以下均为文件的打开模式.
| 文件使用方式 | 含义 | 如果指定文件不存在 |
| "r"(只读) | 为了输入数据,打开一个已经存在的文本文件 | 出错. |
| "w"(只写) | 为了输出数据,打开一个文本文件. | 建立一个新的文件. |
| "a"(追加) | 向文本文件尾添加数据 | 建立一个新的文件 |
| "rb"(只读) | 为了输⼊数据,打开⼀个⼆进制⽂件 | 出错 |
| "wb"(只写) | 为了输出数据,打开⼀个⼆进制⽂件 | 建⽴⼀个新的⽂件 |
| "ab"(追加) | 向一个二进制文件尾添加数据 | 建立一个新的文件 |
| "r+"(读写) | 为了读和写,打开一个新的文件 | 出错 |
| "w+"(读写) | 为了读和写,建立一个新的文件 | 建立一个新的文件 |
| "a+"(读写) | 打开一个文件,在文件尾进行读写 | 建立一个新的文件 |
| "rb+"(读写) | 为了读和写打开一个二进制文件 | 出错 |
| "wb+"(读写) | 为了读和写,建立一个新的二进制文件 | 建立一个新的文件 |
| "ab+"(读写) | 打开一个二进制文件,在文件尾进行读写 | 建立一个新的文件 |
4.3.1:代码1
#include <stdio.h>int main()
{//打开文件//r模式为只读模式,若文件不存在则进行报错FILE* pf = fopen("data.txt", "r");if (NULL == pf){perror("fopen:");return 1;}/** 关闭文件, 由于关闭文件后文件指针指向的地址还是原来的地址因此如果不将文件指针置为NULL的话那么指针pf会成野指针*/fclose(pf);pf = NULL;return 0;
}

4.3.2:代码2
#include <stdio.h>int main()
{//打开文件//w模式为只读模式,若文件不存在则建立一个新的文件FILE* pf = fopen("data.txt", "w");if (NULL == pf){perror("fopen:");return 1;}/** 关闭文件, 由于关闭文件后文件指针指向的地址还是原来的地址因此如果不将文件指针置为NULL的话那么指针pf会成野指针*/fclose(pf);pf = NULL;return 0;
}

4.4:相对路径与绝对路径
4.4.1:相对路径
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>/*
* 相对路径
* . :表示当前路径.. :表示上一级路径
*/
int main()
{//打开文件;FILE* pf = fopen("..\\data.txt", "r");if (NULL == pf){perror("fopen:");return 1;}printf("该文件存在\n");//关闭文件fclose(pf);pf = NULL;return 0;
}

4.4.2:绝对路径
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>/*
* 绝对路径:从磁盘的位置开始一层一层往下找
*/
int main()
{//打开文件;FILE* pf = fopen("D:\\VS代码\\data-structure\\7_test\\7_test\\data.txt", "r");if (NULL == pf){perror("fopen:");return 1;}printf("该文件存在\n");//关闭文件fclose(pf);pf = NULL;return 0;
}

5:文件的顺序读写
5.1:文件的顺序读写函数介绍
| 函数名 | 功能 | 适用范围 |
| fgetc | 字符输入函数 | 所有输入流 |
| fputc | 字符输出函数 | 所有输出流 |
| fgets | 文本行输入函数 | 所有输入流 |
| fputs | 文本行输出函数 | 所有输出流 |
| fscanf | 格式化输入函数 | 所有输入流 |
| fprintf | 格式化输出函数 | 所有输出流 |
| fread | 二进制输入 | 文件 |
| fwrite | 二进制输出 | 文件 |

5.2:fputc函数

int fputc (int character,FILE * stream);
#include <stdio.h>int main()
{//打开文件//w为只写模式,输出数据FILE* pf = fopen("data.txt", "w");if (NULL == pf){perror("fopen:");return 1;}//写入数据,将26个字符写入进去,每5个为一行,int ch = 0;for (ch = 'a'; ch <= 'z'; ch++){if (0 == ch % 5){fputc('\n', pf);}fputc(ch, pf);}/** 关闭文件, 由于关闭文件后文件指针指向的地址还是原来的地址因此如果不将文件指针置为NULL的话那么指针pf会成野指针*/fclose(pf);pf = NULL;return 0;
}

5.3:fgetc函数
//读取失败则返回EOF
int fgetc (FILE * stream);

#include <stdio.h>int main()
{//打开文件//w为只读模式,输入数据FILE* pf = fopen("data.txt", "r");if (NULL == pf){perror("fopen:");return 1;}int ch = 0;while((ch = fgetc(pf)) != EOF){printf(" %c", ch);}/** 关闭文件, 由于关闭文件后文件指针指向的地址还是原来的地址因此如果不将文件指针置为NULL的话那么指针pf会成野指针*/fclose(pf);pf = NULL;return 0;
}

5.4:fputs函数

int fputs(const char * str,FILE * stream);
//成功则返回一个非负整数
//失败则返回EOF
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>int main()
{//打开文件//w为只写模式,输出数据FILE* pf = fopen("data.txt", "w");if (NULL == pf){perror("fopen:");return 1;}char arr[100] = "0";scanf("%s", arr);//将arr的内容输出到文件指针pf所指向的文件fputs(arr, pf);/** 关闭文件, 由于关闭文件后文件指针指向的地址还是原来的地址因此如果不将文件指针置为NULL的话那么指针pf会成野指针*/fclose(pf);pf = NULL;return 0;
}

5.5:fgets函数

char * fgets(char * str,int num,FILE * stream);
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>int main()
{FILE* pf = fopen("data.txt", "r");if (NULL == pf){perror("fopen");}char arr[100] = "0";//从文件中读取(3 - 1)个字符放到num中fgets(arr, 3, pf);printf("%s", arr);fclose(pf);pf = NULL;return 0;
}

5.6:fscanf函数

int fscanf(FILE * stream,const char * format);
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>struct S
{float a;char b;double d;
};
int main()
{struct S s1 = { 2.0f,'a',180.0};FILE* pf = fopen("data.txt", "r");if (NULL == pf){perror("fopen");return 1;}//读取数据fscanf(pf, "%f %c %lf", &s1.a, &s1.b, &s1.d);printf("%f %c %lf", s1.a, s1.b, s1.d);fclose(pf);pf = NULL;return 0;
}

5.7:fprintf函数

int fprintf(FILE * stream,const char * format);
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct S
{float a;char b;double d;
};
int main()
{FILE* pf = fopen("data.txt", "w");if (NULL == pf){perror("fopen");return 1;}struct S s1 = { 5.0f,'w',250.0 };//向文件指针pf所指向的文件写入数据;fprintf(pf, "%f %c %lf", s1.a, s1.b, s1.d);fclose(pf);pf = NULL;return 0;
}

5.8:fwrite函数

//将ptr指向的数据以二进制的方式写入到文件指针stream中
//size表示元素的大小
//count表示写入的数据数目
size_t fwrite (const void * ptr,size_t size,size_t count,FILE * stream);
#include <stdio.h>int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10};/** 打开文件,wb表示以二进制的方式写入信息*/FILE* pf = fopen("data.txt", "wb");if (NULL == pf){perror("fopen");return 1;}//将数组arr的数据写入到文件指针pf所指向的文件信息区中,第二个参数为元素大小,第三个参数为元素个数fwrite(arr,sizeof(arr[0]),sizeof(arr) / sizeof(arr[0]),pf);return 0;
}

5.9:fread函数

//将文件指针stream指向的文件信息区通过二进制的方式读取到ptr中
//size表示元素的大小
//count表示读取的数据数目
size_t fread(void * ptr,size_t size,size_t count,FILE * stream);
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{int arr[10] = { 0 };//rb代表以二进制的方式输入数据(文件向内存输入数据)FILE* pf = fopen("data.txt", "rb");if (NULL == pf){perror("fopen");return 1;}//第二个参数为元素的大小,第三个参数为元素个数fread(arr, sizeof(arr[0]), sizeof(arr) / sizeof(arr[0]), pf);for (int i = 0; i < 10; i++){printf("%d ", arr[i]);}//关闭文件fclose(pf);pf = NULL;return 0;
}

5.95:对比函数
- scanf/fscanf/sscanf
- printf/fprintf/sprintf
- scanf:是格式化的输入函数,针对的是标准输入流(键盘)。
- printf:是格式化的输出函数,针对的是标准输出流(屏幕)。
- fscanf:是针对所有输入流(文件流、标准输出流)的格式化输入函数。
- fprintf:是针对所有输出流(文件流、标准输出流)的格式化输出函数
- sprintf:将格式化的数据转换成字符串.
- sscanf:将字符串转换成格式化的数据.
5.95.1:sprntf函数与sscanf函数

//将格式化的数据转换为字符串
int sprintf(char * str,const char * format);

//将字符串转换为格式化的数据
int sscanf(const char * s,const char * format);
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
typedef struct S
{float a;char b;double c;
}S;
int main()
{char arr[100] = "0";S s1 = { 5.0f,'w',250.0 };S s2 = { 0 };//将结构体s1的数据转换为字符串存储到arr中sprintf(arr, "%f %c %d", s1.a, s1.b, s1.c);printf("%s\n", arr);//将字符串arr的数据格式化存储到s2中sscanf("arr","%f %c %d", &s2.a, &s2.b, &s2.c);printf("%f %c %d\n", s2.a, s2.b, s2.c);return 0;
}

6:文件的随机读写
6.1:fseek函数
//第二个参数为偏移量,第三个参数为设置偏移的位置
int fseek(FILE * stream,long int offset,int origin);
/*
SEEK_SET:从文件光标的开始位置;
SEEK_CUR:从当前位置开始;
SEEK_END:从文件的末尾;
*/
6.1.1:代码1
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r");if(NULL == pf){perror("fopen");return 1;}for(int i = 0; i < 3;i++){int ch = fgetc(pf);printf("%c", ch);}//从当前位置向左偏移两个fseek(pf,-2,SEEK_CUR);int ch = fgetc(pf);printf("%c\n",ch);return 0;
}

6.1.2:代码2
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r");if (NULL == pf){perror("fopen");return 1;}for (int i = 0; i < 3; i++){int ch = fgetc(pf);printf("%c", ch);}printf("\n");//从起始位置开始向右偏移三个位置fseek(pf, 3, SEEK_SET);int ch = fgetc(pf);printf("%c\n", ch);return 0;
}
6.2:ftell函数

long int ftell(FILE * stream);
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r");if (NULL == pf){perror("fopen");return 1;}for (int i = 0; i < 3; i++){fgetc(pf);}int position = ftell(pf);//告知光标的偏移量printf("%d", position);fclose(pf);pf = NULL;return 0;
}

6.3:rewind函数

void rewind(FILE * stream);
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r");if (NULL == pf){perror("fopen");return 1;}fseek(pf, -12, SEEK_END);char ch = fgetc(pf);printf("%c\n", ch);//让文件指针的位置回到文件的起始位置rewind(pf);ch = fgetc(pf);printf("%c\n", ch);fclose(pf);pf = NULL;return 0;
}

7:文本文件与二进制文件
- 根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
- 数据在内存中以二进制的形式存储,如果不加转换地输出到外存,就是二进制文件。
- 如果要求在外上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{int a = 10000;/** 打开文件,wb表示以二进制的方式写入信息*/FILE* pf = fopen("data.txt", "wb");if (NULL == pf){perror("fopen");return 1;}//第二参数表示元素的大小,第三个参数表示元素的个数fwrite(&a, 4, 1, pf);fclose(pf);pf = NULL;return 0;
}



8:文件读取结束的判定
PS:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。
而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。
1.文本文件读取是否结束,判断返回值是否为EOF(fgetc),或者NULL(fgets):
2.二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:
- (1):fgetc判断是否为EOF;
- (2):fgets判断返回值是否为NULL
例如:
fread判断返回值是否小于实际要读的个数。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{//将文件data的数据拷贝到data2里面去FILE* pfread = fopen("data.txt", "r");if (NULL == pfread){perror("fopen");return 1;}FILE* pfwrite = fopen("data2.txt", "w");if (NULL == pfwrite){perror("fopen");fclose(pfread);pfread = NULL;return 1;}//拷贝数据int ch = 0;//读取pfread里头的数据while ((ch = fgetc(pfread)) != EOF){//将读取的到的数据进行输出fputc(ch, pfwrite);}//关闭文件fclose(pfread);pfread = NULL;fclose(pfwrite);pfwrite = NULL;return 0;
}

9:文件缓冲区
ANSIC标准采用"缓冲文件系统"处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块"文件缓冲区"。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区,然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <Windows.h>
int main()
{FILE* pf = fopen("test.txt", "w");fputs("abcdefg", pf);printf("睡眠10秒-已经写数据了,打开test.txt文件,发现文件没有内容\n");Sleep(10000);printf("刷新缓冲区\n");fflush(pf);//刷新缓冲区时,才能输出缓冲区的数据写到文件(磁盘)printf("再睡眠10秒 - 此时,再次打开test.txt文件,文件有内容了\n");Sleep(10000);fclose(pf);pf = NULL;return 0;
}

结论:
因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。
如果不做,能导致读写文件问题
好啦,uu们,C语言的文件这部分滴详细内容博主就讲到这里啦,如果uu们觉得博主讲的不错的话,请动动你们滴小手给博主点点赞,你们滴鼓励将成为博主源源不断滴动力,同时也欢迎大家来指正博主滴错误~
相关文章:
文件处理不再难:带你轻松攻克C语言文件操作
嘿嘿,家人们,今天咱们来详细剖析C语言中的文件操作,好啦,废话不多讲,开干! 目录 1:为什么使用文件 2:文件的概念 2.1:程序文件 2.2:数据文件 2.3:文件名 3:二进制文件与文本文件 4:文件的打开与关闭 4.1:流与标准流 4.1.1:流 4.1.2:标准流 4.2:文件指针 4.3:文件的…...
Unity3D 单例模式
Unity3D 泛型单例 单例模式 单例模式是一种创建型设计模式,能够保证一个类只有一个实例,提供访问实例的全局节点。 通常会把一些管理类设置成单例,例如 GameManager、UIManager 等,可以很方便地使用这些管理类单例,…...
解析TMalign文本文件中的转换矩阵
TM-align 将两个蛋白质结构通过旋转和位移对齐后: TMalign test1.pdb test2.pdb -m mtx.txt 输出转换矩阵,文件内容为: ------ The rotation matrix to rotate Chain_1 to Chain_2 ------ m t[m] u[m][0] u[…...
vue.js组建开发
Vue.js是一个用于构建用户界面的渐进式JavaScript框架。它采用了组件化的开发方式,将UI界面拆分成多个可重用的组件,通过组合这些组件来构建复杂的应用程序。在本文中,我们将探讨Vue.js组件开发的相关概念和技术。 一、组件化开发的优势 组件…...
D29【python 接口自动化学习】- python基础之输入输出与文件操作
day29 格式化输出 学习日期:20241006 学习目标:输入输出与文件操作﹣-41 格式化输出:如何将执行结果通过屏幕输出? 学习笔记: 三种常用的格式化输出方式 百分号方式 format函数方式 总结 1. 格式化输出…...
jQuery——平滑翻页
平滑翻页 param next true:下一页 false:下一页 本文分享到此结束,欢迎大家评论区相互讨论学习,下一篇继续分享jQuery中循环翻页的学习。...
二叉树--DS
1. 树 1.1 树的定义 树是一种非线性的数据结构,它是由n (n > 0)个有限结点组成的一个具有层次关系的集合。之所以将它称为“树”,是因为它像一颗倒挂起来的树,也就是说它是根朝上,叶子在下的。 参考上面的图片,…...
State of ChatGPT ---- ChatGPT的技术综述
声明:该文总结自AI菩萨Andrej Karpathy在youtube发布的演讲视频。 原视频连接:State of GPT | BRK216HFS 基础知识: Transformer原文带读与代码实现https://blog.csdn.net/m0_62716099/article/details/141289541?spm1001.2014.3001.5501 H…...
构建高效新闻推荐系统:Spring Boot的力量
1系统概述 1.1 研究背景 如今互联网高速发展,网络遍布全球,通过互联网发布的消息能快而方便的传播到世界每个角落,并且互联网上能传播的信息也很广,比如文字、图片、声音、视频等。从而,这种种好处使得互联网成了信息传…...
如何使用ipopt进行非线性约束求目标函数最小值(NLP非线性规划)内点法(inner point method)
非线性规划,一般用matlab调用cplex和gurobi了,但这两个一般用于线性规划和二次规划 线性规划LP,二次规划(quadratic programming),如果要求更一般的非线性规划IPOT是个很好的选择,求解器很多&a…...
【Unity学习笔记】解决疑似升级Win11或使用Unity6导致Unity旧版本无法打开的问题
【Unity学习笔记】解决疑似升级Win11或使用Unity6导致Unity旧版本无法打开的问题 一句话省流: 确保项目地址没有任何中文,重新申请个许可证,然后该咋就咋,完事。 ——————————————————————————————…...
回归分析在数据挖掘中的应用简析
一、引言 在数据驱动的时代,数据挖掘技术已成为从海量数据中提取有价值信息的关键工具。 回归分析,作为一种经典的统计学习方法,不仅在理论研究上有着深厚的基础,而且在实际 应用中也展现出强大的功能。 二、回归分析基础 2.1 回…...
【Node.js】worker_threads 多线程
Node.js 中的 worker_threads 模块 worker_threads 模块是 Node.js 中用于创建多线程处理的工具。 尽管 JavaScript 是单线程的,但有时候在处理计算密集型任务或长时间运行的操作时,单线程的运行会导致主线程被阻塞,影响服务器性能。 为了…...
贪心算法c++
贪心算法C概述 一、贪心算法的基本概念 贪心算法(Greedy Algorithm),又名贪婪法,是一种解决优化问题的常用算法。其基本思想是在问题的每个决策阶段,都选择当前看起来最优的选择,即贪心地做出局部最优的决…...
【STM32】 TCP/IP通信协议(3)--LwIP网络接口
LwIP协议栈支持多种不同的网络接口(网卡),由于网卡是直接跟硬件平台打交道,硬件不同则处理也是不同。那Iwip如何兼容这些不同的网卡呢? LwIP提供统一的接口,底层函数需要用户自行完成,例如网卡的…...
15分钟学 Python 第39天:Python 爬虫入门(五)
Day 39:Python 爬虫入门数据存储概述 在进行网页爬虫时,抓取到的数据需要存储以供后续分析和使用。常见的存储方式包括但不限于: 文件存储(如文本文件、CSV、JSON)数据库存储(如SQLite、MySQL、MongoDB&a…...
使用Pytorch构建自定义层并在模型中使用
使用Pytorch构建自定义层并在模型中使用 继承自nn.Module类,自定义名称为NoisyLinear的线性层,并在新模型定义过程中使用该自定义层。完整代码可以在jupyter nbviewer中在线访问。 import torch import torch.nn as nn from torch.utils.data import T…...
学习记录:js算法(五十六):从前序与中序遍历序列构造二叉树
文章目录 从前序与中序遍历序列构造二叉树我的思路网上思路 总结 从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示…...
qt使用QDomDocument读写xml文件
在使用QDomDocument读写xml之前需要在工程文件添加: QT xml 1.生成xml文件 void createXml(QString xmlName) {QFile file(xmlName);if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate |QIODevice::Text))return false;QDomDocument doc;QDomProcessin…...
Oracle架构之表空间详解
文章目录 1 表空间介绍1.1 简介1.2 表空间分类1.2.1 SYSTEM 表空间1.2.2 SYSAUX 表空间1.2.3 UNDO 表空间1.2.4 USERS 表空间 1.3 表空间字典与本地管理1.3.1 字典管理表空间(Dictionary Management Tablespace,DMT)1.3.2 本地管理方式的表空…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...


