C语言文件操作完全手册:读写·定位·实战
1.什么是文件
1.1文件的概念
文件(File)是计算机中用于持久化存储数据的基本单位。它可以存储文本、图片、音频、程序代码等各种信息,并在程序运行结束后仍然保留数据。
1.2文件名
一个文件要有一个唯一的文件标识,以便用户识别和引用。
文件名包含三部分:文件路径+文件名主干+文件后缀
例如:C:\code\test.txt
为了方便起见,文件标识常被成为文件名
1.3程序文件和数据文件
文件按内容用途划分可以分为程序文件和数据文件。
程序文件 | 数据文件 |
---|---|
使计算机执行特定任务 | 存储程序处理或生成的输入/输出数据 |
包含可执行代码或支持代码执行的资源 | 结构化或非结构化数据 |
示例:源代码文件(.c, .java)可执行文件(.exe, .out)库文件(.dll, .so) | 示例:配置文件(.ini, .json)数据库文件(.db, .sqlite)多媒体文件(.mp3, .jpg) |
本文讨论的是数据文件,在以前我们处理数据的输入输出都是以终端为对象的,即从键盘输入数据,运行结果显示到显示器上。其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件。
1.4二进制文件和文本文件
根据数据的存储方式和内容的可读性,文件还可以分成二进制文件和文本文件。
文本文件 | 二进制文件 |
---|---|
以字符编码(如 ASCII、UTF-8、GBK 等)存储数据,每个字符对应特定的字节序列。 | 以原始字节流(Byte Stream)存储数据,直接对应计算机可识别的二进制格式,不依赖字符编码。 |
内容可直接用文本编辑器(如记事本、Notepad++)打开并查看,人类可理解。 | 内容无法用普通文本编辑器正确解析,直接查看会显示乱码,需用特定软件(如图片查看器、播放器、编译器)处理。 |
如有整数10000,如果以ASCII码的形式输出到磁盘,则在磁盘中占用5个字节(每个字符一个字节),而以二进制形式输出,则在磁盘上只占4个字节。
在vs2022上打开二进制文件:
2.文件的打开和关闭
2.1流和标准流
我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出
操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流
想象成流淌着字符的河。
C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的。
⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后操作。
那为什么我们从键盘输⼊数据,向屏幕上输出数据,并没有打开流呢?
那是因为C语⾔程序在启动的时候,默认打开了3个流:
• stdin -标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。
• stdout - 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出 流中。
• stderr -标准错误流,⼤多数环境中输出到显⽰器界⾯。
这是默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进⾏输⼊输出操作的。
stdin、stdout、stderr 三个流的类型是: FILE* ,通常称为⽂件指针。
C语⾔中,就是通过 FILE* 的⽂件指针来维护流的各种操作的。
2.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* pf;//文件指针变量
定义pf是⼀个指向FILE类型数据的指针变量。可以使pf指向某个⽂件的⽂件信息区(是⼀个结构体变
量)。通过该⽂件信息区中的信息就能够访问该⽂件。也就是说,通过⽂件指针变量能够间接找到与
它关联的⽂件。
2.3文件打开与关闭函数
⽂件在读写之前应该先打开⽂件,在使⽤结束之后应该关闭⽂件。
在编写程序的时候,在打开⽂件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建⽴了指针和⽂件的关系。
ANSI C 规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件。
//打开⽂件
FILE* fopen(const char* filename, const char* mode);
//关闭⽂件
int fclose(FILE* stream);
mode表⽰⽂件的打开模式,下⾯都是⽂件的打开模式:
示例代码:
int main()
{//打开文件FILE* pf = fopen("test1.txt", "w");//如果打开失败,结束程序if (pf == NULL){perror("fopen");return 1;}//写文件fputs("hello world", pf);//关闭文件fclose(pf);pf = NULL;return 0;
}
3.文件的顺序读写
3.1 fgetc 和 fputc
fgetc 是 C 语言标准库中用于从文件流中读取单个字符的函数,其功能简单但在文件操作中非常实用。函数原型如下:
int fgetc(FILE *stream);
参数:
stream 是指向 FILE 类型的指针,表示要读取的文件流(可以是文件或标准输入 stdin)。
返回值:
成功读取时,返回读取到的字符(转换为 int 类型,范围为 0~255)。
到达文件末尾或发生错误时,返回 EOF(一个宏定义,通常为 -1)。
fgetc详细介绍网页
示例代码:
int main()
{//打开文件FILE* pf = fopen("test1.txt", "r");//如果打开失败,结束程序if (pf == NULL){perror("fopen");return 1;}//读文件int ch = 0;while ((ch = fgetc(pf)) != EOF){printf("%c", ch);}//关闭文件fclose(pf);pf = NULL;return 0;
}
注意:返回值类型为 int 而非 char,原因是需要用 EOF(-1)表示错误或文件结束,而 char 类型无法表示负数。因此,必须用 int 类型接收返回值。
fputc 是 C 语言标准库中用于向文件流写入单个字符的函数,与 fgetc 功能对应,是文件操作中最基础的写入工具之一。函数原型如下:
int fputc(int c, FILE *stream);
参数:
c:要写入的字符(整数类型,通常为 char 类型转换而来,范围 0~255)。
stream:指向 FILE 类型的指针,表示目标文件流(可以是文件或标准输出 stdout)。
返回值:
成功写入时,返回写入的字符(转换为 int,即参数 c 的值)。
写入失败时,返回 EOF(宏定义,通常为 -1)。
fputc详细介绍网页
示例代码:
int main()
{//打开文件FILE* pf = fopen("test1.txt", "w");//如果打开失败,结束程序if (pf == NULL){perror("fopen");return 1;}//写文件const char* str = "yuecheng";for (int i = 0; str[i] != '\0'; i++){fputc(str[i], pf);}//关闭文件fclose(pf);pf = NULL;return 0;
}
3.2 fgets 和 fputs
fputs 是 C 语言标准库中用于向文件流写入字符串的函数,是文本文件操作的常用工具之一。它与 fputc(逐字符写入)不同,支持批量写入字符串,适用于高效处理文本数据。函数原型如下:
int fputs(const char *str, FILE *stream);
参数:
str:指向要写入的字符串(以 ‘\0’ 结尾的字符数组或指针)。
stream:指向目标文件流的指针(如文件指针或标准输出 stdout)。
返回值:
成功写入时,返回一个非负整数(具体值未指定,通常视为成功标志)。
写入失败时,返回 EOF(宏定义,值为 -1)。
fputs详细介绍网页
示例代码:
int main()
{//打开文件FILE* pf = fopen("test1.txt", "w");//如果打开失败,结束程序if (pf == NULL){perror("fopen");return 1;}//写文件const char* str1 = "yuecheng";const char* str2 = "boke";fputs(str1, pf);fputs("\n", pf);//手动换行fputs(str2, pf);//关闭文件fclose(pf);pf = NULL;return 0;
}
fgets 是 C 语言标准库中用于从文件流(或标准输入)读取字符串的函数,是文本文件处理和用户输入的重要工具。其核心优势在于安全可控(可指定读取长度,避免缓冲区溢出),适用于逐行读取数据。函数原型如下:
char *fgets(char *str, int num, FILE *stream);
参数:
str:指向字符数组的指针,用于存储读取的字符串(需确保缓冲区足够大)。
num:读取的最大字符数(包括终止符 ‘\0’),即最多读取 num-1 个有效字符,末尾自动添加 ‘\0’。
stream:目标文件流(如文件指针 FILE* 或标准输入 stdin)。
返回值:
成功时,返回指向缓冲区 str 的指针(与输入参数相同)。
遇到文件结束或错误时,返回 NULL。
fgets详细介绍网页
示例代码:
int main()
{//打开文件FILE* pf = fopen("test1.txt", "r");//如果打开失败,结束程序if (pf == NULL){perror("fopen");return 1;}//读文件char buff[500] = { 0 };while (fgets(buff, sizeof(buff), pf)){printf("%s", buff);// 输出读取的行(含换行符)}//关闭文件fclose(pf);pf = NULL;return 0;
}
3.3 fscanf和fprintf
fprintf 是 C 语言标准库中用于向文件流(或标准输出)写入格式化数据的核心函数,功能与 printf 类似,但目标是文件而非控制台。它支持将不同类型的数据(整数、浮点数、字符串等)按指定格式写入文件,是文本文件处理和日志记录的重要工具。函数原型如下:
int fprintf(FILE *stream, const char *format, ...);
参数:
stream:目标文件流指针(如文件指针 FILE* 或标准输出 stdout)。
format:格式化字符串(包含普通字符和格式说明符)。
…:可变参数列表(需与格式说明符一一对应)。
返回值:
成功时,返回实际写入的字符数(不包含终止符 ‘\0’)。
失败时,返回负数(具体值未指定,通常用 ferror(stream) 判断错误)。
fprintf详细介绍网页
示例代码:
int main()
{//打开文件FILE* pf = fopen("test1.txt", "w");//如果打开失败,结束程序if (pf == NULL){perror("fopen");return 1;}//写文件fprintf(pf, "%-10s %-15s %s\n", "ID", "Name", "Score");fprintf(pf, "-------------------------------------------------\n");fprintf(pf, "%-10d %-15s %6.2f\n", 1, "Bob", 85.5);fprintf(pf, "%-10d %-15s %6.2f\n", 2, "Alice", 92.3);//关闭文件fclose(pf);pf = NULL;return 0;
}
fscanf 是 C 语言标准库中用于从文件流(或标准输入)读取格式化数据的核心函数,功能与 scanf 类似,但目标是文件而非控制台。它支持按指定格式解析不同类型的数据(整数、浮点数、字符串等),是处理结构化文件(如配置文件、日志、表格数据)的重要工具。函数原型如下:
int fscanf(FILE *stream, const char *format, ...);
参数:
stream:目标文件流指针(如文件指针 FILE* 或标准输入 stdin)。
format:格式化字符串(包含格式说明符和普通字符)。
…:可变参数列表(需是指针,用于存储读取的数据)。
返回值:
成功时,返回成功匹配的参数个数(可能为 0,表示格式匹配但无数据读取)。
遇到文件结束或错误时,返回 EOF(宏定义,值为 -1)。
fscanf详细介绍网页
int main()
{//打开文件FILE* pf = fopen("test1.txt", "r");//如果打开失败,结束程序if (pf == NULL){perror("fopen");return 1;}//读文件char ch1[10] = { 0 };char ch2[10] = { 0 };char ch3[10] = { 0 };fscanf(pf, "%s %s %s\n", ch1, ch2, ch3);printf("%s %s %s", ch1, ch2, ch3);//关闭文件fclose(pf);pf = NULL;return 0;
}
4. fread 和 fwrite
fwrite 是 C 语言标准库中用于向文件流写入二进制数据块的函数,主要用于高效存储和读取结构化数据(如结构体、数组、二进制文件)。与文本文件操作函数(如 fprintf、fputs)不同,fwrite 直接按字节写入,不进行任何格式转换或字符编码处理,是处理二进制文件的核心工具。函数原型如下:
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
参数:
ptr:指向要写入的数据块的指针(可以是数组、结构体等)。
size:每个数据块的字节大小(如单个元素的大小,如 sizeof(int))。
count:要写入的数据块数量(总字节数为 size × count)。
stream:目标文件流指针(需以 二进制模式 打开,如 wb、ab)。
返回值:
成功时,返回实际写入的数据块数量(类型为 size_t,通常是无符号整数)。
若返回值小于 count,可能是写入错误或文件空间不足,需通过 ferror(stream) 判断。
fwrite详细介绍网页
示例代码:
struct stu {char name[20];int ID;int age;
};int main()
{//打开文件FILE* pf = fopen("test1.txt", "wb");//如果打开失败,结束程序if (pf == NULL){perror("fopen");return 1;}struct stu stu1 = { "zhangsan",20240523,18 };//写文件fwrite(&stu1, sizeof(stu1), 1, pf);//关闭文件fclose(pf);pf = NULL;return 0;
}
fread 是 C 语言标准库中用于从文件流读取二进制数据块的函数,主要用于高效地从文件中恢复结构化数据(如结构体、数组、二进制文件中的数据)。与文本文件读取函数(如 fscanf、fgets)不同,fread 直接按字节读取,不进行任何格式解析或字符编码转换,是处理二进制文件的核心工具。函数原型如下:
size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
参数:
ptr:接收数据的缓冲区指针(如结构体地址、数组名)。
size:单个数据块的字节大小(如 sizeof(int)、sizeof(自定义结构体))。
count:期望读取的数据块数量(总读取字节数 = size × count)。
stream:目标文件流(必须以 二进制模式 打开,如 rb、ab+)。
返回值:实际读取的数据块数量(若小于 count,需通过 feof/ferror 判断是文件结束还是错误)。
fread详细介绍网页
示例代码:
struct stu {char name[20];int ID;int age;
};int main()
{//打开文件FILE* pf = fopen("test1.txt", "rb");//如果打开失败,结束程序if (pf == NULL){perror("fopen");return 1;}struct stu stu2 = { 0 };//读文件fread(&stu2, sizeof(stu2), 1, pf);printf("%s %d %d", stu2.name, stu2.ID, stu2.age);//关闭文件fclose(pf);pf = NULL;return 0;
}
4.文件的随机读写
1.fseek
根据⽂件指针的位置和偏移量来定位⽂件指针。函数原型如下:
int fseek ( FILE * stream, long int offset, int origin );
函数参数
stream:这是一个指向 FILE 对象的指针,该对象标识了要操作的文件流。在使用 fseek 之前,需要使用 fopen 函数打开文件以获取对应的 FILE 指针。
offset:表示相对于 origin 指定的起始位置的偏移量,单位是字节。这个值可以是正数(表示向文件末尾方向移动)、负数(表示向文件开头方向移动)或者零。
origin:指定了偏移量的起始位置,它是一个整数常量,有以下三种取值:
SEEK_SET:表示从文件的开头开始计算偏移量。
SEEK_CUR:表示从文件指针的当前位置开始计算偏移量。
SEEK_END:表示从文件的末尾开始计算偏移量。
返回值
若函数调用成功,fseek 会返回 0。
若调用失败,则返回一个非零值,同时会设置 errno 来指示具体的错误类型。
fseek详细介绍网页
示例代码:
int main ()
{FILE * pFile;pFile = fopen ( "example.txt" , "wb" );fputs ( "This is an apple." , pFile );fseek ( pFile , 9 , SEEK_SET );fputs ( " sam" , pFile );fclose ( pFile );return 0;
}
2.ftell
返回⽂件指针相对于起始位置的偏移量,函数原型如下:
long int ftell ( FILE * stream );
函数参数
stream:这是一个指向 FILE 对象的指针,该对象标识了要操作的文件流。在使用 ftell 之前,需要使用 fopen 函数打开文件以获取对应的 FILE 指针。
返回值
若函数调用成功,ftell 会返回当前文件指针相对于文件开头的偏移量,单位是字节,其类型为 long int。
若调用失败,它会返回 -1L,同时会设置 errno 来指示具体的错误类型。
ftell详细介绍网页
示例代码:
int main()
{FILE* pFile;long size;pFile = fopen("myfile.txt", "rb");//文件内存有A~B26个字母if (pFile == NULL)perror("Error opening file");else{fseek(pFile, 0, SEEK_END); // non-portablesize = ftell(pFile);fclose(pFile);printf("Size of myfile.txt: %ld bytes.\n", size);}return 0;
}
3.rewind
让⽂件指针的位置回到⽂件的起始位置,函数原型如下:
void rewind ( FILE * stream );
函数参数
stream:指向 FILE 对象的指针,该对象代表了要操作的文件流。在调用 rewind 之前,需要使用 fopen 函数打开文件以获取对应的 FILE 指针。
功能描述
rewind 函数会将文件指针移动到文件的起始位置,并且会清除文件流的错误指示器和文件结束指示器。这意味着在调用 rewind 之后,后续的文件操作将从文件开头开始,同时之前可能出现的错误状态也会被重置。
返回值
rewind 函数没有返回值(返回类型为 void)。
rewind详细介绍网页
int main()
{int n;FILE* pFile;char buffer[27];pFile = fopen("myfile.txt", "w+");for (n = 'A'; n <= 'Z'; n++)fputc(n, pFile);rewind(pFile);//将文件指针的位置返回到Afread(buffer, 1, 26, pFile);//从头读取fclose(pFile);buffer[26] = '\0';printf(buffer);return 0;
}
5.feof和ferror
feof 的作⽤是:当⽂件读取结束的时候,判断是读取结束的原因是否是:遇到⽂件尾结束。
牢记:在⽂件读取过程中,不能⽤feof函数的返回值直接来判断⽂件的是否结束。
函数原型如下:
int feof(FILE *stream);
返回值
若文件流已到达文件末尾,feof 函数返回一个非零值(通常为 1)。
若未到达文件末尾,则返回 0。
ferror 函数用于检测文件流是否发生了错误。其原型如下:
int ferror(FILE *stream);
返回值
若文件流发生了错误,ferror 函数返回一个非零值(通常为 1)。
若未发生错误,则返回 0。
⽂本⽂件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
例如:
• fgetc 判断是否为EOF .
• fgets 判断返回值是否为 NULL .
2. ⼆进制⽂件的读取结束判断,判断返回值是否⼩于实际要读的个数。
例如:
• fread判断返回值是否⼩于实际要读的个数。
文本文件示例:
int main()
{int c; // 注意:int,⾮char,要求处理EOFFILE* fp = fopen("test.txt", "r");if (!fp) {perror("File opening failed");return EXIT_FAILURE;}//fgetc 当读取失败的时候或者遇到⽂件结束的时候,都会返回EOFwhile ((c = fgetc(fp)) != EOF) // 标准C I/O读取⽂件循环{putchar(c);}//判断是什么原因结束的if (ferror(fp))puts("I/O error when reading");else if (feof(fp))puts("End of file reached successfully");fclose(fp);
}
二进制文件示例:
enum { SIZE = 5 };
int main()
{double a[SIZE] = { 1.,2.,3.,4.,5. };FILE* fp = fopen("test.bin", "wb"); // 必须⽤⼆进制模式fwrite(a, sizeof * a, SIZE, fp); // 写 double 的数组fclose(fp);double b[SIZE];fp = fopen("test.bin", "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.bin: unexpected end of file\n");else if (ferror(fp)) {perror("Error reading test.bin");}}fclose(fp);
}
6.文件缓冲区
ANSIC 标准采⽤“缓冲⽂件系统” 处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的⼤⼩根据C编译系统决定。
int main()
{FILE* pf = fopen("test.txt", "w");fputs("abcdef", pf);//先将代码放在输出缓冲区printf("睡眠10秒-已经写数据了,打开test.txt⽂件,发现⽂件没有内容\n");Sleep(10000);printf("刷新缓冲区\n");fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到⽂件(磁盘)printf("再睡眠10秒-此时,再次打开test.txt⽂件,⽂件有内容了\n");Sleep(10000);fclose(pf);//注:fclose在关闭⽂件的时候,也会刷新缓冲区pf = NULL;return 0;
}
这⾥可以得出⼀个结论:
因为有缓冲区的存在,C语⾔在操作⽂件的时候,需要做刷新缓冲区或者在⽂件操作结束的时候关闭⽂件。
如果不做,可能导致读写⽂件的问题。
相关文章:
C语言文件操作完全手册:读写·定位·实战
1.什么是文件 1.1文件的概念 文件(File)是计算机中用于持久化存储数据的基本单位。它可以存储文本、图片、音频、程序代码等各种信息,并在程序运行结束后仍然保留数据。 1.2文件名 一个文件要有一个唯一的文件标识,以便用户识别…...
网络协议之详解(Detailed Explanation of Network Protocol)
NFS、FTP、SMB、WebDav、DLNA协议 大家好!今天来和大家聊聊让很多人都感到困惑的 NFS、FTP、SMB、WebDav、DLNA 这几种协议。相信不少人在面对它们的时候,常常是一头雾水,傻傻分不清。别担心,看完这篇文章,你就会对它…...
VICP(Velocity-based ICP):通过运动校准实现精准姿态估计
在三维点云配准的领域,经典的ICP(Iterative Closest Point)算法已经成为广泛使用的方法,尤其是在处理静态环境中的点云配准时,效果非常好。然而,随着动态场景的出现,物体运动和传感器的变动引发…...
典籍知识问答典籍查询界面前端界面设计效果实现
根据组内负责前端界面设计的同学的界面设计,进行典籍查询前端界面的实现 1.实现效果 2.前端代码 ClassicView.vue <template> <div class"classics"> <img className"back" alt"Back" src"https://c.animaapp…...
Megatron - LM 重要文件解析 - /tools/preprocess_data.py
preprocess_data.py 的主要功能。这是 Megatron-LM 的数据预处理脚本,主要用于将原始文本数据转换为模型训练所需的格式。 核心功能: 1. 数据预处理流程: 输入:原始文本文件(JSON格式) 处理:…...
探索RTOS在电力控制系统中的应用价值
电力控制系统对实时性、可靠性和高效性有着严苛要求,实时操作系统(RTOS)凭借其独特性能优势,在其中扮演关键角色。本文深入剖析RTOS在电力控制系统中的重要作用,探讨其应用前景,助力推动电力行业智能化、现…...
第5章-1 优化服务器设置
上一篇:《第4章-5 linux 网络管理》,接着服务器设置 本章我们将解释如何为MySQL服务器创建合适的配置文件。这是一个迂回的旅程,有许多兴趣点和可以俯瞰风景的短途旅程。这些短途旅程是必要的。确定合适配置的最短路径并不是从研究配置选项并…...
进阶篇 第 4 篇:驾驭季节性波动 - SARIMA 模型实战
进阶篇 第 4 篇:驾驭季节性波动 - SARIMA 模型实战 (图片来源: Pixabay on Pexels) 在上一篇中,我们深入探索了经典的 ARIMA(p,d,q) 模型。它通过整合自回归 (AR)、差分 (I) 和移动平均 (MA) 提供了一个强大的框架来对(处理后)平…...
Android调用springboot接口上传大字段,偶现接口超时的优化
介绍 最近有个功能,Android通过okhttp上传实体类,实体类包含一个大字段,上传的字符串长度达到300k,偶现接口超时的情况,大概100次有5次,看日志发现数据并没有到达接口,可能在网络传输中就超时了…...
[特殊字符]【Qt自定义控件】创意开关按钮 - 丝滑动画+自定义样式+信号交互 | 附完整源码
话不多说直接上代码 1、.mybutton.h #ifndef MYBUTTON_H #define MYBUTTON_H#include <QWidget> #include <QPropertyAnimation>class MyButton : public QWidget {Q_OBJECT public:explicit MyButton(QWidget *parent nullptr);protected:void paintEvent(QPain…...
大数据开发的基本流程
大数据开发通常围绕数据的“采集 → 存储 → 处理 → 分析 → 展示”几个阶段来展开。下面是一个典型的大数据开发基本流程(适用于离线或实时场景): 一、数据采集(Data Ingestion) 目标:从各种来源采集原始…...
关于创建UNIX/Linux daemon进程的笔记
Linux daemon程序简单说就是Linux后台服务进程。 传统的、标准的创建方法:2次fork setsid 详细步骤 进程1(父进程)调用fork,创建子进程2,进程1退出。 1)这个步骤是为第二部做铺垫。 2)此时&a…...
国产紫光同创FPGA实现SDI视频编解码,基于HSSTHP高速接口,提供3套工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目本博已有的 SDI 编解码方案本方案在Xilinx--Artix7系列FPGA上的应用本方案在Xilinx--Kintex系列FPGA上的应用本方案在Xilinx--Zynq系列FPGA上的应用本方案在Xilinx--U…...
Oracle--SQL性能优化与提升策略
前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、导致性能问题的内在原因 系统性能问题的底层原因主要有三个方面: CPU占用率过高导致资源争用和等待内存使用率过高导致内存不足并需…...
drupal7可以从测试环境一键部署到生产环境吗
Drupal 7 本身并没有“内建的一键部署功能”,所以“从测试环境一键部署到生产环境”不能完全自动化完成,尤其是涉及数据库、配置和文件系统时。但你可以通过一些工具和方法实现接近“一键部署”的效果 ✅ 🚧 为什么不能直接一键部署ÿ…...
vue项目中axios统一或单独控制接口请求时间
先说统一 这里将请求时间统一控制在12秒 // 使用由库提供的配置的默认值来创建实例 // 此时超时配置的默认值是 0 const axiosInstance axios.create()// 覆写库的超时默认值 // 现在,在超时前,所有请求时间统一控制在10秒 axiosInstance.defaults.ti…...
chromedp 反反爬设计方案
二、基础防护层实现 1. 浏览器特征伪装 opts : append(chromedp.DefaultExecAllocatorOptions[:],// 禁用自动化特征chromedp.Flag("disable-blink-features", "AutomationControlled"),chromedp.Flag("useAutomationExtension", false),// 随…...
OpenLDAP 管理 ELK 用户
文章目录 一、新建 ELK 相关用户组二、配置 Elasticsearch2.1 修改 elasticsearch.yml 配置2.2 使用 API 接口建立角色和用户映射 三、Kibana 验证用户登录 一、新建 ELK 相关用户组 由于后续要将 LDAP 的用户与 ELK 的角色进行映射,所以需先创建几个以 ELK 的角色…...
深度解析MQTT源码架构与AIGC场景融合实战
一、结构体内存优化:支撑千万级设备连接 1.1 紧凑内存布局设计 classDiagramclass MQTTClient_message {char struct_id[4]int struct_versionvoid* payloadint payloadlenint qosint retainedint dupint msgidMQTTProperties properties}note for MQTTClient_mes…...
Node.js 操作 ElasticSearch 完整指南:从安装到实战
本文将手把手教你如何搭建 ElasticSearch 环境,并通过 Node.js 实现高效数据检索。包含 10 个可直接复用的代码片段,助你快速掌握搜索、聚合等核心功能! 环境搭建篇 1. ElasticSearch 安装要点 下载 es下载连接 下载下来后,进…...
Python+区块链:如何打造智能化资产管理系统?
Python+区块链:如何打造智能化资产管理系统? 在当今数字经济时代,区块链资产管理已成为金融科技、去中心化金融(DeFi)以及企业资金流转的关键应用。传统的资产管理往往依赖于中心化机构,存在数据透明度低、效率受限、管理成本高等问题,而区块链技术的出现,为资产管理提…...
Sentinel源码—8.限流算法和设计模式总结一
大纲 1.关于限流的概述 2.高并发下的四大限流算法原理及实现 3.Sentinel使用的设计模式总结 1.关于限流的概述 保护高并发系统的三把利器:缓存、降级和限流。限流就是通过限制请求的流量以达到保护系统的目的,比如秒杀抢购。具体就是对并发请求进行限…...
SpringMVC入门
1、SpringMVC概念 SpringMVC是在Spring框架的基础上引入MVC模式的思想,SpringMVC即是一种框架,也是一种思想,将前后端彻底分离,后端不再需要关注前端的代码。前后端分工明确 我们原先学习的MVC三层架构,MVC是web开发…...
MYSQL之库的操作
创建数据库 语法很简单, 主要是看看选项(与编码相关的): CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 1. 语句中大写的是…...
并发设计模式实战系列(3):工作队列
🌟 大家好,我是摘星! 🌟 今天为大家带来的是并发设计模式实战系列,第三章工作队列(Work Queue),废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 生产者-消费者架构 …...
已安装爱思助手和Apple相关驱动,但仍无法有线连接iPhone热点,且网络适配器没有Apple Mobile Device Ethernet,问题解决
已安装爱思助手和Apple相关驱动,但仍无法有线连接iPhone热点,且网络适配器没有Apple Mobile Device Ethernet 问题解决: 用爱思助手连接手机,点击工具箱 - iTunes及驱动 点击高级修复 在系统存储的旧驱动文件项右侧࿰…...
用 Go 优雅地清理 HTML 并抵御 XSS——Bluemonday
1、背景与动机 只要你的服务接收并回显用户生成内容(UGC)——论坛帖子、评论、富文本邮件正文、Markdown 等——就必须考虑 XSS(Cross‑Site Scripting)攻击风险。浏览器在解析 HTML 时会执行脚本;如果不做清理&#…...
MySQL基本查询与数据操作全面解析
目录 1. CRUD操作概述 2. Create操作详解 2.1 表的创建 2.2 单行数据插入 2.3 多行数据插入 2.4 插入冲突处理 3. Retrieve操作详解 3.1 基础查询 全列查询(慎用) 指定列查询 表达式查询 结果去重 3.2 条件查询(WHERE子句&#…...
《C++ 模板:泛型编程的核心》
C模板详解 模板是C中实现泛型编程的重要特性,它允许你编写与数据类型无关的代码。模板可以分为函数模板和类模板两种。 1. 函数模板 函数模板允许你定义一个可以处理多种数据类型的函数。 基本语法 template <typename T> T functionName(T parameter1, T…...
Web3实战:从零开发你的ERC20代币合约
区块链技术的普及让代币发行不再是金融巨头的专利。本文将以Solidity 0.8.20和OpenZeppelin 5.0为技术栈,手把手教你开发具备铸造、销毁、权限管理等进阶功能的ERC20代币,并部署到以太坊Sepolia测试网。以下是完整开发路线图: 一、ERC20代币的…...
简述大疆无人机对接
文章目录 概述MSDK对接MSDK简介MSDK集成步骤直播推流获取飞机实时数据 UX SDK上云API上云API简介上云API对接步骤Pilot上云Pilot怎么安装配置三方云平台地址直播获取飞机数据 Dock上云Dock上云简介直播方案设备管理 如何对接多个飞机引用 概述 一般而言,对接大疆的…...
docker-compose搭建kafka
1、单节点docker-compose.yml version: 3 services:zookeeper:image: zookeeper:3.8container_name: zookeeperports:- "2181:2181"volumes:- ./data/zookeeper:/dataenvironment:ZOO_MY_ID: 1ZOO_MAX_CLIENT_CNXNS: 100kafka:image: bitnami/kafka:3.7container_na…...
FramePack V2版 - 支持首尾帧生成,支持LoRA,支持批量,支持50系显卡,一个强大的AI视频生成软件 本地一键整合包下载
FramePack 是斯坦福大学主导开发的视频生成框架,是一种用于视频生成的下一帧(下一帧部分)预测神经网络结构,可以逐步生成视频。FramePack 主要开发者之一,就是业内大名鼎鼎的张吕敏大佬,AI领域的“赛博佛祖…...
开发网页程序时预览时遇到跨域问题解决方法
CocosCreator 开发h5游戏要用接口、开发html程序网页程序在chrome中预览时都会遇到跨域问题,怎么办? 网上有很多方法,主要是通过服务器端去配置,但那个相对来说消弱安全问题,这个不建议,因为是开发,个人行业,我们知道问题所以,简单点就主要是通过chrome的参数来禁用: 关闭 Ch…...
【音视频】FFmpeg内存模型
FFmpeg内存模型 从现有的Packet拷贝一个新Packet的时候,有两种情况: 两个Packet的buf引用的是同一数据缓存空间,这时候要注意数据缓存空间的释放问题;两个Packet的buf引用不同的数据缓存空间,每个Packet都有数据缓存…...
基于nlohmann/json 实现 从C++对象转换成JSON数据格式
C对象的JSON序列化与反序列化 基于JsonCpp库实现C对象序列化与反序列化 JSON 介绍 JSON作为一种轻量级的数据交换格式,在Web服务和应用程序中广泛使用。 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读…...
在线视频转 AVI 的便捷之选,便捷操作,无需下载软件,在线使用
在视频处理的众多需求中,将视频转换为 AVI 格式是不少用户的刚需。小白工具网(https://www.xiaobaitool.net/videos/convert-to-avi/ )的在线视频转 AVI 功能,以其显著优势,多格式支持、便捷操作、数据安全保障以及广泛…...
【MCP Node.js SDK 全栈进阶指南】初级篇(3):MCP资源开发基础
引言 在前两篇文章中,我们已经详细介绍了MCP开发环境的搭建以及基础服务器开发。本文作为MCP TypeScript-SDK系列的第三篇,将聚焦于MCP资源开发基础,包括静态资源与动态资源的开发、资源模板设计与参数提取、资源列表与发现机制,以及常见资源类型与最佳实践。通过本文的学…...
L2-1、打造稳定可控的 AI 输出 —— Prompt 模板与格式控制
一、为什么需要 Prompt 模板? 在与 AI 模型交互时,我们经常会遇到输出不稳定、格式混乱的问题。Prompt 模板帮助我们解决这些问题,通过结构化的输入指令来获得可预测且一致的输出结果。 模板的作用主要体现在: 固定输出格式&am…...
Java集成Zxing和OpenCV实现二维码生成与识别工具类
Java集成Zxing和OpenCV实现二维码生成与识别工具类 本文将介绍如何使用Java集成Zxing和OpenCV库,实现二维码的生成和识别功能。识别方法支持多种输入形式,包括File对象、文件路径和Base64编码。 一、环境准备 添加Maven依赖 <dependencies><…...
jenkins pipeline ssh协议报错处理
一、jenkins版本 jenkins:2.492.3 openssh:OpenSSH_9.8p1, OpenSSL 3.3.1 # grep jenkins /etc/passwd jenkins:x:996:994:Jenkins Automation Server:/var/lib/jenkins:/bin/false 二、报错 三、处理 步骤1:手动添加目标主机密钥到Jenk…...
当OCR遇上“幻觉”:如何让AI更靠谱地“看懂”文字?
在数字化的世界里,OCR(光学字符识别)技术就像给机器装上了“电子眼”。但当这项技术遇上大语言模型,一个意想不到的问题出现了——AI竟然会像人类一样产生“幻觉”。想象一下,当你拿着模糊的财务报表扫描件时ÿ…...
vue watch监听路由,第一次进入不触发解决办法
“第一次进入的时候没触发,第二次就触发了”非常典型,它印证了路由监听(无论是 watch $route 还是 beforeRouteUpdate)主要是为了监听变化,而不是处理首次加载时的初始状态。 当你通过 this.$router.push 导航到一个新…...
JVM考古现场(二十四):逆熵者·时间晶体的永恒之战
"警告!时间晶体正在吞噬GC日志!" 我腰间的太极八卦镜突然迸发出刺目的量子辉光,终南山之巅的星宿大阵浮现出诡异的四维克莱因瓶拓扑——这是逆熵者文明穿越时空的拜帖! 楔子:时间晶体的觉醒 🕯️…...
spring中使用netty-socketio部署到服务器(SSL、nginx转发)
spring中使用netty-socketio部署到服务器(SSL、nginx转发) 本文实现前端socket.io-client连接后端netty-socketio,并且部署到服务器上的示例,以及说明一些实现过程中可能遇到的错误。 socketio默认基于的路径是/socket.io 传输…...
qt.tlsbackend.ossl: Failed to load libssl/libcrypto.
我的环境是windows,QT6.3.2(msvc2019_64/mingw_64) 出错原因 QT没有正确加载OpenSSL。 解决过程 1、确保安装的有openssl。 文章结尾有个注意,是其他方式安装过openssl,环境变量有,但是QT找不到的问题。…...
【Python爬虫基础篇】--3.cookie和session
目录 1.cookie 1.1.定义 1.2.参数 1.3.分类 2.session 3.使用cookie登录微博 4.使用session登录 1.cookie 由于http是一个无状态的协议,请求与请求之间无法相互传递或者记录一些信息,cookie和session正是为了解决这个问题而产生。 例子࿱…...
uView的u-modal不显示问题
问题分析:在项目中,其他页面显示正常,在这个页面显示不正常。 问题解决: 一般的原因,诸如层级遮挡控制器true后,被其他逻辑又改为了false最可恨的一个原因 :showshow被编辑器的提示功能误写成了v-modal&qu…...
联易融科技:以科技赋能驱动经营反转与价值重估
行业去重周期下,轻量化发展成破局关键。当前,供应链金融行业正经历从"规模扩张"到"价值深耕"的转型期,降本增效、轻资产运营成为行业共识。联易融公告表示,截至2024年末,公司现金储备高达51亿元,显示出财务状况健康良好,流动资金持续充裕。 董…...
Office文档图片批量提取工具
Office.Files.Images 是一款专注于从 Word、Excel、PPT 等 Office 文档中批量提取图片的轻量级工具,支持 .docx、.xlsx、.pptx 格式文件。该软件体积仅 343KB,无需安装即可运行,通过拖拽操作实现快速解析与导出,尤其适合需批量…...