前言:本期我们就进入C语言的最后一部分——文件操作,说起文件,广大学子可以说苦其久已,但实际上文件这部分要掌握的内容并不多,熟知其原理即可。因为在以后的实际应用中几乎不会使用到C语言的文件,一般都是使用数据库来实现,所以在学习这一章时不必太过紧张,放平心态去细品即可。

目录

1 文件概览

1.1 为什么使用文件

1.2 什么是文件

1.2.1 程序文件

1.2.2 数据文件

1.3 文件名

2 文本文件操作函数

2.1 文件指针

2.2 文件的打开与关闭

2.2.1 fopen 函数 和 fclose 函数

2.2.2 例子

2.3 文件的顺序读写

2.3.1 fputc 函数

2.3.2 fgetc 函数

2.3.3 fputs 函数

2.3.4 fgets 函数

2.3.5 fprintf 函数

2.3.6 fscanf 函数

2.3.7 fwrite 函数

2.3.8 fread 函数

2.3.9 sprintf 函数 和 sscanf 函数

2.4 文件的随机读写

2.4.1 fseek 函数

2.4.2 ftell 函数 和 rewind 函数

3 文本文件和二进制文件

4 文件读取结束的判定

4.1 feof 函数

5 文件缓冲区


1 文件概览

1.1 为什么使用文件

经过前面的学习我们知道,C语言程序是无法保存数据的,在程序退出时数据便自然不在了,这是因为程序运行时存储的数据都在临时空间(内存)上,一旦程序结束,空间便被释放销毁,所以数据无法保存。所以如果我们想将数据持久化,我们该怎么办呢?于是我们想到了使用文件将数据直接放到电脑硬盘上,做到数据的持久化。

1.2 什么是文件

一般我们称,磁盘上的文件就是文件,但是在程序设计中,我们谈的文件可以分为两类:

1.2.1 程序文件

  • ① 源程序文件(后缀为.c)

  • ②目标文件(windows环境后缀为.obj)

  • ③可执行程序(windows环境后缀为.exe)

1.2.2 数据文件

  • ①文件的内容不一定是程序,而是程序运行时读写的数据

  • ②比如:程序运行需要从中读取数据的文件,或者输出内容的文件

因此,本章我们讨论的是数据文件。

1.3 文件名

样例: 文件路径+文件名主干+文件后缀

ex:c:\code\test.txt

2 文本文件操作函数

2.1 文件指针

  • 每个文件先在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息【如文件的名字,文件状态及文件当前的位置等】

  • 而文件信息区在C语言中实则是保存在一个系统声明为FILE结构体变量中。

FILE* pf; //文件指针变量

定义pf是一个指向FILE类型数据的指针变量。这样我们就可以使pf指向某个文件的文件信息区(是一个结构体变量),通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件

2.2 文件的打开与关闭

2.2.1 fopen 函数 和 fclose 函数

FILE * fopen ( const char * filename, const char * mode );
功能介绍:打开文件。
参数介绍:filename 为想要打开文件的文件名。mode 为文件的打开方式。若打开成功,返回值为指向此文件的文件信息区的起始地址的指针,指针类型为FILE* 。否则返回NULL文件打开方式
文件使用方式 含义 如果指定的文件不存在
“r”(只读) 为了输入数据,打开一个已经存在的文本文件 出错
“w”(只写) 为了输出数据,打开一个文本文件 建立一个新的文件
“a”(追加) 向文本文件尾添加数据 建立一个新的文件
“rb”(只读) 为了输入数据,打开一个二进制文件 出错
“wb”(只写) 为了输出数据,打开一个二进制文件 建立一个新的文件
“ab”(追加) 向一个二进制文件尾添加数据 出错
“r+”(读写) 为了读和写,打开一个文本文件 出错
“w+”(读写) 为了读和写,建议一个新的文件 建立一个新的文件
“a+”(读写) 打开一个文件,在文件尾进行读写 建立一个新的文件
“rb+”(读写) 为了读和写打开一个二进制文件 出错
“wb+”(读写) 为了读和写,新建一个新的二进制文件 建立一个新的文件
“ab+”(读写) 打开一个二进制文件,在文件尾进行读和写 建立一个新的文件
int fclose ( FILE * stream );
功能介绍:关闭文件。
参数介绍:stream 为想要关闭的文件的文件指针。若关闭成功,返回值为0 。否则返回EOF(-1)

注意: 要对文件进行操作,一般先打开文件,最后一定要记得关闭文件【即fopenfclose是要搭配来用的,缺一不可】

2.2.2 例子

int main()
{FILE* pf = fopen("C:\\Users\\Hans\\Desktop\\test.txt", "r");  //如果不写路径默认与编译文件同位置,两个"\"表转义if (pf == NULL){printf("%s\n", strerror(errno));return 1;}//...//读文件//关闭文件fclose(pf);pf = NULL;return 0;
}

2.3 文件的顺序读写

功能 函数名 适用于
字符输入函数 fgetc 所有输入流
字符输出函数 fputc 所有输出流
文本行输入函数 fgets 所有输入流
文本行输出函数 fputs 所有输出流
格式化输入函数 fscanf 所有输入流
格式化输出函数 fprintf 所有输出流
二进制输入 fread 文件流
二进制输出 fwrite 文件流

以上的输入/输出,指的是对文件进行写入/读取。

接下来将对上述函数进行详解:

2.3.1 fputc 函数

int fputc ( int character, FILE * stream );
功能介绍:对文件进行单个字符的写入。
参数介绍:character 为想要写入文件的字符;stream 为指向单个字符写入的文件的地址的指针。
int main()
{FILE* pf = fopen("test.txt", "w");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}//写文件char i = 0;for (i = 'a'; i <= 'z'; i++){fputc(i, pf);}//关闭文件fclose(pf);pf = NULL;return 0;
}

运行截图:

注意:每次以"w"的打开方式打开文件关闭文件后,下次进入程序再用"w"的方式打开的话,文件的内容被重置(即上次写入的内容全部清除了)

2.3.2 fgetc 函数

int fgetc ( FILE * stream );
功能介绍:读取文件的一个字符内容。
参数介绍:stream 为指向想要读取字符的文件的地址的指针。返回的是读取的字符的ASCII值。
//写法1:一个一个读
int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}int ch = fgetc(pf);printf("%c ", ch);ch = fgetc(pf);printf("%c ", ch);ch = fgetc(pf);printf("%c ", ch);ch = fgetc(pf);printf("%c ", ch);fclose(pf);pf = NULL;return 0;
}

运行截图:

//写法2:读取文件全部内容
int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}int ch = 0;while ((ch = fgetc(pf)) != EOF){printf("%c ", ch);}fclose(pf);pf = NULL;return 0;
}

运行截图:

注意:每次使用fgetc函数,读取文件中的一个字符后,文件指针会自动偏移一下,指向下一个字符,方便读取下一个字符。

2.3.3 fputs 函数

int fputs ( const char * str, FILE * stream );
功能介绍:向文件中写入字符串。
参数介绍:str 为想要写入的字符串;stream 为指向写入字符串的文件的地址的指针。
int main()
{FILE* pf = fopen("test.txt", "w");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}//写一行数据fputs("记得关注我\n", pf);fputs("一键三连哦~\n", pf);fclose(pf);pf = NULL;return 0;
}

运行截图:

2.3.4 fgets 函数

char * fgets ( char * str, int num, FILE * stream );
功能介绍:读取文件中的字符串。
参数介绍:str为将从文件中读取的字符串,拷贝到str指向的空间中(一般为数组);num 为读取字符串的个数; stream 为指向想要读取文件的地址的指针。
int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}//读一行数据char arr[5];fgets(arr, 5, pf);printf("%s\n", arr);fclose(pf);pf = NULL;return 0;
}

运行截图:

注意:实际读取的字符个数的字符串会比 num 少一个(因为需要预留一个位置给函数放 \0 到str中);读取的过程类似于fgetc,文件指针一直在随着读取的字符往后走,本次读取过的就不能在读取了,只能往后读取。

2.3.5 fprintf 函数

int fprintf ( FILE * stream, const char * format, ... );
功能介绍:将格式化变量的数据写入文件。
参数介绍:stream 为指向写入格式化数据的文件的地址的指针;format 为写入数据的格式(例:%s、%d……);...为数据的来源。

此处我们可以对比 printf 函数

这里不难发现,这两个函数之间的参数是一样的 ,我们也就更好理解什么是格式化数据了。

struct S
{char arr[10];int age;float score;
};int main()
{struct S s = { "zhangsan", 25, 50.5f };FILE*pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 1;}fprintf(pf, "%s %d %f", s.arr, s.age, s.score);fclose(pf);pf = NULL;return 0;
}

运行截图:

2.3.6 fscanf 函数

int fscanf ( FILE * stream, const char * format, ... );
功能介绍:格式化的方式读取文件中的数据。
参数介绍:stream 为指向写入格式化数据的文件的地址的指针;format 为写入数据的格式(例:%s、%d……);...为格式化数据写入的地方。
struct S
{char arr[10];int age;float score;
};int main()
{struct S s = {0};FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}fscanf(pf, "%s %d %f", s.arr, &(s.age), &(s.score));printf("%s %d %f", s.arr, s.age, s.score);fclose(pf);pf = NULL;return 0;
}

运行截图:

小结:

关于流(stream)的介绍

我们在使用文件函数的时候,会自然的想到要打开文件,使用完再关闭文件。那么回想一下以前我们使用scanf、printf函数的时候可从来没说过打开屏幕、打开键盘的这些操作吧。其实任何一个C程序,只要运行起来就会默认打开3个流:

  • FILE* stdin - 标准输入流(键盘)

  • FILE* stdout - 标准输出流(屏幕)

  • FILE* stderr - 标准错误流(屏幕)

那么我们思考一下,fprintf 可以打印到屏幕上吗?

struct S
{char arr[10];int age;float score;
};int main()
{struct S s = {0};FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}fscanf(pf, "%s %d %f", s.arr, &(s.age), &(s.score));//printf("%s %d %f", s.arr, s.age, s.score);fprintf(stdout, "%s %d %f\n", s.arr, s.age, s.score); //打印到屏幕上fclose(pf);pf = NULL;return 0;
}

运行截图:

2.3.7 fwrite 函数

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
功能介绍:对文件进行二进制的写入数据。
参数介绍:ptr 为指向存储要写入到文件的数据的指针;size 为‎要写入的数据的总大小(单位:字节);count 为最多写几个 size 大小为单位的数据(单位:字节);stream 为指向写入数据的文件的地址的指针。
工作原理函数将每次以 count 大小个字节,从 ptr 中拿取数据以二进制的方式写入文件中,一共写入 size 个字节。
struct S
{char arr[10];int age;float score;
};int main()
{struct S s = { "zhangsan", 25, 50.5f };FILE* pf = fopen("test.txt", "wb");if (pf == NULL){perror("fopen");return 1;}//二进制的方式写fwrite(&s, sizeof(struct S), 1, pf);    //1表示只有一个结构体数据fclose(pf);pf = NULL;return 0;
}

运行截图:

打开发现字符串的二进制形式与文本形式一,其他都显示乱码。此时如果我们想查看二进制形式,需按照下面的步骤

2.3.8 fread 函数

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
功能介绍:对文件进行二进制的读取数据。
参数介绍:ptr 为指向存储要读取到文件的数据的指针;size 为‎要读取的数据的总大小(单位:字节);count 为最多读几个 size 大小为单位的数据(单位:字节);stream 为指向读取数据的文件的地址的指针。
工作原理函数将每次以 count 大小个字节,从 ptr 中读取数据以二进制的方式写入文件中,一共读入 size 个字节。
struct S
{char arr[10];int age;float score;
};int main()
{struct S s = { 0 };//以二进制的形式写到文件中FILE* pf = fopen("test.txt", "rb");if (pf == NULL){perror("fopen");return 1;}//二进制的方式读fread(&s, sizeof(struct S), 1, pf);printf("%s %d %f\n", s.arr, s.age, s.score);fclose(pf);pf = NULL;return 0;
}

运行截图:

小结:如果二进制的方式存文件,就要二进制的方式读出来。

2.3.9 sprintf 函数 和 sscanf 函数

int sprintf ( char * str, const char * format, ... );
功能介绍:把一个格式化的数据写到一个字符串里。
参数介绍:stream 为指向将格式化数据写入到字符串的地址的指针;format 为写入数据的格式(例:%s、%d……);...为数据的来源。
int sscanf ( const char * s, const char * format, ...);
功能介绍:把一个字符串读出一个格式化的数据。
参数介绍:stream 为指向存储字符串的地址的指针;format 为写入数据的格式(例:%s、%d……);...为格式化数据写入的地方。

注意:这两个函数不针对文件流

struct S
{char arr[10];int age;float score;
};int main()
{struct S s = { "zhangsan", 20, 55.5f };struct S tmp = { 0 };char buf[100] = { 0 };//把s中的格式化数据转化成字符串放到buf中sprintf(buf, "%s %d %f", s.arr, s.age, s.score);printf("字符串:%s\n", buf);  //"zhangsan 20 55.500000";//从字符串buf中获取一个格式化的数据到tmp中sscanf(buf, "%s %d %f", tmp.arr, &(tmp.age), &(tmp.score));printf("格式化:%s %d %f\n", tmp.arr, tmp.age, tmp.score);return 0;
}

运行截图:

2.4 文件的随机读写

2.4.1 fseek 函数

int fseek ( FILE * stream, long int offset, int origin );
功能介绍:根据文件指针的位置和偏移量来定位文件指针。
参数介绍:stream 为指向文件的地址的指针;offset 为文件指针的偏移量;origin 为文件指针偏移量的相对起始地址。
工作原理函数将会使文件指针在选定的起始位置 origin 处偏移 offset 个位置,到达外面想让文件指针到达的位置进行访问。
Constant(origin) Reference position
SEEK_SET Beginning of file
SEEK_CUR Current position of the file pointer
SEEK_END End of file  

现在已知 text.txt  存放了 abcdef

int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}//读文件 定位文件指针fseek(pf, 2, SEEK_SET);int ch = fgetc(pf);//cprintf("%c\n", ch);//fseek(pf, 2, SEEK_CUR);   //(方法1)fseek(pf, -1, SEEK_END);  //(方法2)ch = fgetc(pf);//fprintf("%c\n", ch);//关闭文件fclose(pf);pf = NULL;return 0;
}

运行截图:

2.4.2 ftell 函数 和 rewind 函数

long int ftell ( FILE * stream );
功能介绍:返回文件指针相对于起始位置的偏移量。
参数介绍:stream 为指向文件的地址的指针
void rewind ( FILE * stream );
功能介绍:让文件指针的位置回到文件的起始位置。
参数介绍:stream 为指向文件的地址的指针
int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}//读文件 定位文件指针fseek(pf, 2, SEEK_SET);int ch = fgetc(pf);//cprintf("%c\n", ch);printf("%d\n", ftell(pf));//3(当前位置)//fseek(pf, 2, SEEK_CUR);   //(方法1)fseek(pf, -1, SEEK_END);   //(方法2)ch = fgetc(pf);//fprintf("%c\n", ch);//printf("%d\n", ftell(pf));//6(当前位置)rewind(pf);    //(重置)ch = fgetc(pf);//aprintf("%c\n", ch);//关闭文件fclose(pf);pf = NULL;return 0;
}

运行截图:

3 文本文件和二进制文件

介绍:

  • 数据在内存中以二进制的形式存储,如果不加转换的输出,就是二进制文件

  • 如果加以ASCII字符的形式转换,那存储的文件就是文本文件

注意:

  • 字符一律以ASCII形式存储【这也是为什么上述我们讲的二进制读取和文本读取字符的效果一样】

  • 数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储

例如:有整数10000

  • 如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节)

  • 二进制形式输出,则在磁盘上只占4个字节

int main()
{int a = 10000;FILE* pf = fopen("test.txt", "wb");fwrite(&a, 4, 1, pf);//二进制的形式写到文件中fclose(pf);pf = NULL;return 0;
}

运行截图:

4 文件读取结束的判定

4.1 feof 函数

int feof ( FILE * stream );
功能介绍:在文件结束的前提下,判断文件结束是因为遇到文件尾结束,还是读取失败结束。
参数介绍:stream 为指向文件的地址的指针
工作原理函数若文件结束时因为遇到文件尾结束的,则返回非0值;若文件结束不是因为遇到文件尾结束的,则返回0

注意:feof 只能判断是哪种原因结束的,但不能用来判断文件是否结束。

文件读取是否结束,我们根据如下来判断:

  • 文本文件:

    • fgetc 在读取结束时,返回 EOF

    • fgets 在读取结束时,返回 NULL

  • 二进制文件:

    • fread 在读取结束时,返回一个小于实际要读的个数的值

综上:feof 就是判断文件结束是不是因为上述的三个结束标志造成的

//文本文件的例子
int main(void)
{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(void)
{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);
}

5 文件缓冲区

什么是文件缓冲区:

  • 所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”

特别注意:

  • 即从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上

  • 如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)

  • 缓冲区的大小根据C编译系统决定的。

综上:因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件,才能对文件读写正常;否则,如果不做,可能导致读写文件的问题。

OK,以上就是本期知识点“文件操作”的知识啦~~,感谢友友们的阅读。后续还会继续更新,欢迎持续关注哟~

本期封面 ↓ : 最是珠江风物好,晚来惯爱流连。霓虹光转水云边。

【C语言详解】——文件操作(建议收藏)相关推荐

  1. C语言详解文件操作(一):文件操作基础概念、按照字符、按照行块、按照格式化和随机位置读写文件

    文章目录 一.文件操作基础概念 二.文件读写:按照字符方式读写 三.文件读写:按行和块读写 四.文件读写:格式化和随机位置 一.文件操作基础概念 C语言中的文件操作的好处:       一个文件通常是 ...

  2. 万字肝完nodejs入门教程,详解入口,建议收藏(更新中)

    nodejs入门教程 1.前言 2.入门教程 2.1 命令行运行node.js脚本 2.2 退出node.js程序 2.3 如何使用 Node.js REPL 2.3.1 使用方式 2.3.2 点命令 ...

  3. 终于有人把 Docker 讲清楚了,万字详解!【建议收藏】

    来源 | cnblogs.com/zhangxingeng/p/11236968.html 一.简介 1.了解Docker的前生LXC LXC为Linux Container的简写.可以提供轻量级的虚 ...

  4. C语言详解 - 文件

    1. 需要了解的概念 需要理解的知识点包括:数据流.缓冲区.文件类型.文件存取方式 1.1 数据流: 指程序与数据的交互是以流的形式进行的.进行C语言文件的存取时,都会先进行"打开文件&qu ...

  5. c语言读取程序内容,C语言详解——文件读取

    1. 需要了解的概念 需要理解的知识点包括:数据流.缓冲区.文件类型.文件存取方式 1.1 数据流: 指程序与数据的交互是以流的形式进行的.进行C语言文件的存取时,都会先进行"打开文件&qu ...

  6. C++数据结构,三万字详解(强烈建议收藏)

    C++常用数据结构 链表内存的申请与释放滑动窗口前缀和/积与后缀和/积差分数组线段树前缀树/字典树(Trie)单调栈单调队列并查集二叉树创建二叉树二叉树的遍历二叉树遍历的变体平衡二叉树(AVL)与二叉 ...

  7. Unix/Linux环境C编程入门教程(41) C语言库函数的文件操作详解

     上一篇博客我们讲解了如何使用Linux提供的文件操作函数,本文主要讲解使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #in ...

  8. 如何用c语言编写stm32的程序吗,STM32入门C语言详解

    <STM32入门C语言详解>由会员分享,可在线阅读,更多相关<STM32入门C语言详解(6页珍藏版)>请在人人文库网上搜索. 1.最新 料推荐阅读 flash : 芯片内部存储 ...

  9. Drools 规则语言详解(上)

    http://www.blogjava.net/guangnian0412/archive/2006/06/09/51574.html http://www.blogjava.net/guangnia ...

  10. 克鲁斯卡尔算法c语言,Kruskal算法(一)之 C语言详解

    最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树. 例如,对于如上图G4所示的连通网可以有多棵权值总和 ...

最新文章

  1. 解决Win8下使用net use命令磁盘映射无效的问题
  2. 【填坑】初识钛极小龟NB-IoT物联网开发套件TiKit
  3. 零基础该如何高效学Java?
  4. 根据ABAP类方法的形式参数名,反查是哪个方法定义了该形式参数
  5. 当你老了,一生最后悔什么?大数据告诉你!
  6. win10只有edge浏览器能上网的解决方法
  7. 关于PHP代码的开始和结束标签书写,关于PHP结束标签?gt;的使用细节
  8. 【干货】房地产基础知识及开发流程.pdf(附下载链接)
  9. Django例子-出版社
  10. 深度学习画图软件收集
  11. win10出现的异常解决
  12. NISP-电子邮件安全
  13. Jpg格式如何变成gif动图?仅需三步快速合成gif
  14. 如何快速有效的复习教师资格证?
  15. oracle下的inventory文件夹,Oracle中Inventory目录作用以及如何重建此目录
  16. js 公历日期转农历带节假日
  17. 识别 Cisco交换机型号
  18. go build在mac系统下生成可执行文件时隐藏终端
  19. 从一个故事说起,谈谈企业应用架构的演变史
  20. 区块链及以太坊入门介绍

热门文章

  1. 卿学姐与诡异村庄(并查集)
  2. 【供应链案例】屈臣氏是如何优化供应链系统的
  3. ubuntu18.04 分辨率突然变小,添加1920x1080分辨率,转完变卡默认成集显llvmpipe改独显方法
  4. 大菠萝 Pinia 持久化方案 Pinia Persist Own
  5. x+=x-=x*x; 和 x-=x*x; x+=x;
  6. 解决Chrome谷歌浏览器Adobe Flash Player 插件已被屏蔽的问题
  7. linux下优盘格式化,linux下格式化u盘
  8. SpringBoot集成腾讯云短信实现注册/登录功能
  9. 开箱即用!中文关键词抽取(Keyphrase Extraction),基于LDA与PageRank(TextRank, TPR, Salience Rank, Single TPR)
  10. java---解惑--