文件操作~

目录

1.为什么使用文件?

2.什么是文件?

2.1 程序文件

2.2 数据文件

2.3 文件名

3.⼆进制文件和文本文件?

4.文件的打开和关闭

4.1 流和标准流

4.1.1 流

4.1.2 标准流

4.2 文件指针

4.3 ⽂件的打开和关闭

5.文件的顺序读写

5.1 顺序读写函数介绍

5.1.1什么是EOF

5.1.2 fputc函数

5.1.3 fgetc函数

5.1.4 fputs函数

5.1.5 fgets

5.1.6 fprintf函数

5.1.7 fscanf函数

5.1.8 fwrite函数

5.1.9fread函数

5.2 对比⼀组函数:

6.文件的随机读写

6.1fseek

6.2ftell

6.3 rewind

7.文件读取结束的判定

7.1 被错误使用的 feof

8. ⽂件缓冲区


1.为什么使用文件?

如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件。

2.什么是文件?

磁盘(硬盘)上的文件是文件。

但是在程序设计中,我们⼀般谈的⽂件有两种:程序文件、数据文件(从文件功能的角度度来分类的)。

2.1 程序文件

程序文件包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。

2.2 数据文件

文件的内容不⼀定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。

本章讨论的是数据文件。

在以前各章所处理数据的输⼊输出都是以终端为对象的,即从终端的键盘输⼊数据,运行结果显示到显示器上。

其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件。

2.3 文件名

⼀个文件要有⼀个唯⼀的文件标识,以便用户识别和引用。

文件名包含3部分:文件路径+文件名主干+文件后缀

例如: c:\code\test.txt

为了方便起见,⽂件标识常被称为文件名。

3.⼆进制文件和文本文件?

根据数据的组织形式,数据文件被称为⼆进制文件和文本文件?

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

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。

⼀个数据在文件中是怎么存储的呢?

字符⼀律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。

如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符⼀个字节),而⼆进制形式输出,则在磁盘上只占4个字节。

用二进制写入,用文本文件不能打开,只能使用二进制的形式打开

#include <stdio.h>
​
int main() {int a = 1000;FILE* pf = fdopen("test.txt", "wb");fwrite(&a, 4, 1, pf); //找到a的地址写入,写入四个字节,写入一次,找到关联的文件fclose(pf);pf = NULL;return 0;
}

4.文件的打开和关闭

4.1 流和标准流

4.1.1 流

流-->一个媒介,连接程序和外部设备

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。

C程序针对文件、画面、键盘等的数据输入输出操作都是通过流操作的。

⼀般情况下,我们要想向流里写数据,或者从流中读取数据,都是要打开流,然后操作,最后关闭流

4.1.2 标准流

那为什么我们从键盘输入数据(在C语言中),向屏幕上输出数据,并没有打开流呢?

那是因为C语⾔程序在启动的时候,默认打开了3个流:

  • stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。

  • stdout - 标准输出流,⼤多数的环境中输出到显示器界面,printf函数就是将信息输出到标准输出流中。

  • stderr - 标准错误流,⼤多数环境中输出到显⽰器界⾯

这是默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进行输入输出操作的。

stdin、stdout、stderr 三个流的类型是: 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;

每当打开⼀个文件的时候,系统会根据文件的情况自动创建⼀个FILE结构的变量,并填充其中的信息,使用者不必关心细节。⼀般都是通过⼀个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。

下⾯我们可以创建⼀个FILE*的指针变量:

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

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

4.3 ⽂件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。

在编写程序的时候,在打开文件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建立了指针和文件的关系。

ANSI C 规定使用 fopen 函数来打开文件, fclose 来关闭文件。

文件操作,文件中有路径的话 最好加上两个斜杠

  • E:\C\Code\Cproject\practice6.17\practice6.17(绝对路径)

  • 如果用相对路径, " . " 表示当前路径 ". ."表示上一级路径

    • 那我们要访问该路径的上一级路径的文件时, " .\ \ ..\ \ test.txt "

int main() {//1.打开文件//打开成功返回一个有效的指针//打开失败,返回NULL(判断文件指针是否为空)FILE* pf = fopen("test.txt", "w"); //D:\\WeGameApps\\if (pf == NULL) {perror("fopen");return 1;}//2.写文件操作//...
​//关闭文件fclose(pf);
​
}

5.文件的顺序读写

5.1 顺序读写函数介绍

文件按照顺序去读写,光标

5.1.1什么是EOF

在C语言中,EOF(End of File)是一个特殊的标记,用于表示文件的结尾。当我们读取文件或者输入数据时,EOF可以帮助我们确定何时到达了文件的末尾。本文将详细介绍EOF的意义和用法,并提供一些示例代码以帮助理解。

  1. EOF的意义 EOF在C语言中用于标识文件的结尾。当我们从文件中读取数据时,EOF可以告诉我们何时已经读取完了文件中的所有内容。这对于文件的处理非常重要,因为它允许我们在读取文件时判断何时停止读取并继续执行其他操作。

  2. EOF的用法 在C语言中,我们可以使用EOF常量来表示文件的结尾。EOF的值是一个特殊的整数常量,通常被定义为-1。当我们从文件中读取数据时,EOF常量可以与读取的字符进行比较,以确定是否已经到达了文件的结尾。

如下代码从文件中读取所有字符 等于EOF就是到了文件结尾,结束循环

while((ch = fgetc(pf)) != EOF)

5.1.2 fputc函数

写字符操作,一个个字符写入 该函数有两个参数 ---> fputc(i,pf); // i表示要写入的内容 pf 文件指针流

int main() {//1.打开文件//打开成功返回一个有效的指针//打开失败,返回NULL(判断文件指针是否为空)FILE* pf = fopen("test.txt", "w");if (pf == NULL) {perror("fopen");return 1;}//2.写文件操作int i = 0;for (int i = 'a'; i <= 'z'; i++) {fputc(i,pf); // i表示要写入的内容 pf 文件指针流}
​//关闭文件fclose(pf);
​
}

5.1.3 fgetc函数

读字符函数, fgetc(pf), 只有一个参数(文件指针流)

int main() {//1.打开文件//打开成功返回一个有效的指针//打开失败,返回NULL(判断文件指针是否为空)FILE* pf = fopen("test.txt", "r");if (pf == NULL) {perror("fopen");return 1;}//2.读文件操作int ch = fgetc(pf); //读取到一个字符赋值给ch 然后光标就往下printf("%c\n", ch);ch = fgetc(pf);    //再读取一个 赋值给ch 光标再往下printf("%c\n", ch);ch = fgetc(pf);printf("%c\n", ch);
​//关闭文件fclose(pf);pf = NULL;
}

另外一种读 操作 使用EOF

int main() {//1.打开文件//打开成功返回一个有效的指针//打开失败,返回NULL(判断文件指针是否为空)FILE* pf = fopen("test.txt", "r");if (pf == NULL) {perror("fopen");return 1;}//2.读文件操作int ch = 0;while ((ch = fgetc(pf)) != EOF){printf("%c", ch);}
​//关闭文件fclose(pf);
​
}
  • 在上面我们所提到的标准流 stdin和stdout也可以用上面的读写函数,他们适合所有的输入输出流

  • 实现在屏幕输入一个字符,在屏幕输出一个字符

int main() {int ch = fgetc(stdin);fputc(ch, stdout);return 0;
}

5.1.4 fputs函数

int fputs ( const char * str, FILE * stream ); 

文本输入函数, 第一个参数是输入一个字符串,第二个参数是文件指针流

int main() {//1.打开文件FILE* pf = fopen("test.txt", "w");if (pf == NULL) {perror("fopen");return 1;}//2.操作文件fputs("i am a man", pf);//3.关闭文件fclose(pf);pf = NULL;return 0;
}

5.1.5 fgets

char * fgets ( char * str, int num, FILE * stream );

第一个参数用一个字符数组存储读到的字符串,第二个参数,最多读到多少个字符,第三个参数文件指针流

注意:在读字符的时候,实际读到的只是(num-1)个字符因为包含了一个\0,或者遇到换行的时候也会终止读取

int main() {//1.打开文件FILE* pf = fopen("test.txt", "r");if (pf == NULL) {perror("fopen");return 1;}//2.操作文件char arr[20] = { 0 };fgets(arr, 5, pf);printf("%s", arr);//3.关闭文件fclose(pf);pf = NULL;return 0;
}

同样以上两个函数同样适合所有的输入输出流,以下实现在屏幕输入和输出字符串

int main() {char arr[20] = {0};fgets(arr, 10, stdin);fputs(arr, stdout);
}

5.1.6 fprintf函数

int fprintf ( FILE * stream, const char * format, ... )

格式化输出函数(所有类型都可以) ,适合所有输出流,该函数和printf函数多了个文件指针流,

int main() {char name[20] = "aaa";int age = 20;float score = 95.7f;//1.打开文件FILE* pf = fopen("test.txt", "w");if (pf == NULL) {perror("fopen");return 1;}//2.操作文件fprintf(pf, "%s %d %.1f", name, age, score);//3.关闭文件fclose(pf);pf = NULL;return 0;
}

我们也可以把数据放到结构体里

struct S
{char name[20];int age;float score;
};
​
​
int main() {struct  S s = { "lisi",18,96.2f };//1.打开文件FILE* pf = fopen("test.txt", "w");if (pf == NULL) {perror("fopen");return 1;}//2.操作文件fprintf(pf, "%s %d %.1f", s.name, s.age, s.score);//3.关闭文件fclose(pf);pf = NULL;return 0;
}

5.1.7 fscanf函数

int fscanf ( FILE * stream, const char * format, ... );

要先把数据读出放到一个结构体中,再输出到屏幕

struct S
{char name[20];int age;float score;
};
​
​
int main() {struct  S s = { 0 };//1.打开文件FILE* pf = fopen("test.txt", "r"); //读文件if (pf == NULL) {perror("fopen");return 1;}//2.操作文件//name不用加&符号,因为本来name就是数组首元素地址//把文件中的数据读出来后放到结构体中fscanf(pf, "%s %d %.1f", s.name, &(s.age), &(s.score)); //再把结构体的数据读出printf(" %s %d %.1f", s.name, s.age, s.score);//3.关闭文件fclose(pf);pf = NULL;return 0;
}

5.1.8 fwrite函数

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

第一个参数,取需要写入文件的数据的地址,第二个参数该数据的大小,第三个参数该数据的个数,

以二进制的形式输出到文件中

struct S
{char name[20];int age;float score;
};
int main() {struct  S s = { "lisi",18,96.2f };//1.打开文件 二进制形式写入FILE* pf = fopen("test.txt", "wb");if (pf == NULL) {perror("fopen");return 1;}//2.操作文件fwrite(&s, sizeof(struct S), 1, pf);//3.关闭文件fclose(pf);pf = NULL;return 0;
}
​

5.1.9fread函数

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

将文件中以二进制的形式读出放到ptr指向的空间里

struct S
{char name[20];int age;float score;
};
int main() {struct  S s = { "lisi",18,96.2f };//1.打开文件 二进制形式写入FILE* pf = fopen("test.txt", "rb");if (pf == NULL) {perror("fopen");return 1;}//2.操作文件fread(&s, sizeof(struct S), 1, pf);printf("%s %d %f", s.name, s.age, s.score);//3.关闭文件fclose(pf);pf = NULL;return 0;
}
​

5.2 对比⼀组函数:

  • scanf/fscanf/sscanf

  • printf/fprintf/sprintf

  • 这里重点介绍sscanf函数和sprintf函数

    1.sprintf函数,将其他类型的数据转化成字符串

    struct S
    {char name[20];int age;float score;
    };
    ​
    int main() {char arr[100] = {0};struct  S s = { "aa",17,96.2f};sprintf(arr, "%s %d %f", s.name, s.age, s.score);printf("%s\n", arr);return 0;
    }

    2.sscanf函数 将字符串转化成其他类型的数据

    struct S
    {char name[20];int age;float score;
    };
    ​
    int main() {char arr[100] = {0};struct  S s = { "aa",17,96.2f};//临时变量struct S tmp = { 0 };
    ​sprintf(arr, "%s %d %f", s.name, s.age, s.score);/*printf("%s\n", arr);*/sscanf(arr, "%s %d %f", tmp.name, &(tmp.age), &(tmp.score));printf("%s %d %f", tmp.name, tmp.age, tmp.score);return 0;
    }

6.文件的随机读写

6.1fseek

根据⽂件指针的位置和偏移量来定位⽂件指针(⽂件内容的光标)。

 int fseek ( FILE * stream, long int offset, int origin );

offsetof --- 计算结构体成员相比于起始位置的偏移量

我们看下面代码 如果想单独读字符e就会比较麻烦,我们可以用fseek函数

int main() {FILE* pf = fopen("test.txt", "rb");if (pf == NULL) {perror("fopen");return 1;}//2.读文件int ch = fgetc(pf); //读取到一个字符赋值给ch 然后光标就往下printf("%c\n", ch);ch = fgetc(pf);    //再读取一个 赋值给ch 光标再往下printf("%c\n", ch);ch = fgetc(pf);printf("%c\n", ch);
​fclose(pf);pf = NULL;return 0;
}

fseek函数,第三个参数可以有三种选项

SEEK_SET文件开头位置
SEEK_CUR文件指针指向的当前位置
SEEK_END文件末尾
int main() {FILE* pf = fopen("test.txt", "rb");if (pf == NULL) {perror("fopen");return 1;}//2.读文件int ch = fgetc(pf); //读取到一个字符赋值给ch 然后光标就往下printf("%c\n", ch);ch = fgetc(pf);    //再读取一个 赋值给ch 光标再往下printf("%c\n", ch);fseek(pf, 2, SEEK_CUR);//在当前位置偏移两个位置找到ech = fgetc(pf);    printf("%c\n", ch);fclose(pf);pf = NULL;return 0;
}

6.2ftell

返回文件指针相对于起始位置的偏移量

我们看下面代码,读完e之后往下一光标,输出偏移量为5

int main() {FILE* pf = fopen("test.txt", "rb");if (pf == NULL) {perror("fopen");return 1;}//2.读文件int ch = fgetc(pf); //读取到一个字符赋值给ch 然后光标就往下printf("%c\n", ch);ch = fgetc(pf);    //再读取一个 赋值给ch 光标再往下printf("%c\n", ch);fseek(pf, 2, SEEK_CUR);ch = fgetc(pf);    printf("%c\n", ch);//输出文件指针相比于文件的起始位置的偏移量printf("%d", ftell(pf));fclose(pf);pf = NULL;return 0;
}

6.3 rewind

让文件指针的位置回到文件的起始

void rewind ( FILE * stream );

7.文件读取结束的判定

7.1 被错误使用的 feof

牢记:在文件读取过程中,不能用feof函数的返回值直接来判断文件的是否结束。

因为文件结束有两种,1.遇到文件结尾,2.遇到错误

feof 的作用是:当文件读取结束的时候,再判断是读取结束的原因是否是:遇到文件尾结束。

feof的返回值,如果没有设置就默认返回0(还没到文件末尾),返回1的话代表已经到达文件末尾

1.文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )

例如:

  • fgetc 判断是否为 EOF .

  • fgets 判断返回值是否为 NULL .

2.二进制文件的读取结束判断,判断返回值是否小于实际要读的个数

例如:fread判断返回值是否小于实际要读的个数。

文本文件例子:

include <stdio.h>
#include <stdlib.h>
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);
}

二进制的例子

#include <stdio.h>
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);
}
  • ferro函数,如果返回一个非零的整数值,说明读取出问题;返回一个0则表示没有问题

小练习:写一个程序将一个txt文件的内容复制到另外一个txt文件

int main() {//打开文件FILE* pfread = fopen("test.txt", "r");if (pfread == NULL) {perror("fopen\n");return 1;}FILE* pfwrite = fopen("test2.txt","w");if (pfwrite == NULL) {perror("fopen\n");fclose(pfread); //如果打开文件操作出错,则关闭pfread流return 1;}//读或写文件int ch = 0; //返回值要为int类型while ((ch = fgetc(pfread)) != EOF) {fputc(ch, pfwrite); //ch表示要写入的字符}//关闭文件fclose(pfread);pfread = NULL;fclose(pfwrite);pfwrite = NULL;
}

8. ⽂件缓冲区

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

简单来说,就是不能一直让操作系统处理数据,先把数据存起来,再一次过处理,而不是每发一次就处理一次

#include <stdio.h>
#include <windows.h>
//VS2022 WIN11环境测试
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;
}

因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。如果不做,可能导致读写文件的问题,防止信息丢失

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/864334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT+winodow 代码适配调试总结(二)

已经好多年了&#xff0c; linux环境下不同版本的QT程序开发和部署&#xff0c;突然需要适配window环境程序调试&#xff0c;一堆大坑&#xff0c;还真是一个艰巨的任务&#xff0c;可是kpi下的任务计划&#xff0c;开始吧&#xff01;&#xff01; 1、首先我们自定义的动态库…

【PYTORCH,TENSORFLOW环境配置,安装,自用代码】

conda -V&#xff08;查看版本&#xff0c;这步不要也罢&#xff09; conda create -n test python3.7&#xff08;创建环境&#xff09; conda activate test&#xff08;激活&#xff09; conda env list&#xff08;查看自己的环境&#xff09; nvidia-smi&#xff08;查…

以太网电缆专家手册:掌握RJ45连接器压接的艺术与科学

在这个日新月异的数字时代&#xff0c;正确的连接方式至关重要&#xff0c;而RJ45连接器正是实现这一点的关键工具之一。无论您是在家中布置办公网络&#xff0c;还是在公司部署复杂的IT基础架构&#xff0c;或是进行任何需要设备间高效数据传输的活动&#xff0c;掌握如何正确…

【深度学习】调整加/减模型用于体育运动评估

摘要 一种基于因果关系的创新模型&#xff0c;名为调整加/减模型&#xff0c;用于精准量化个人在团队运动中的贡献。该模型基于明确的因果逻辑&#xff0c;将个体运动员的价值定义为&#xff1a;在假设情景下&#xff0c;用一名价值为零的球员替换该球员后&#xff0c;预期比赛…

获取onnx模型输入输出结构信息的3种方式:ONNX、onnxruntime、netron

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

每日Attention学习7——Frequency-Perception Module

模块出处 [link] [code] [ACM MM 23] Frequency Perception Network for Camouflaged Object Detection 模块名称 Frequency-Perception Module (FPM) 模块作用 获取频域信息&#xff0c;更好识别伪装对象 模块结构 模块代码 import torch import torch.nn as nn import to…

【Python函数编程实战】:从基础到进阶,打造代码复用利器

文章目录 &#x1f68b;前言&#x1f680;一、认识函数&#x1f308;二、函数定义❤️三、函数调用⭐四、实参与形参&#x1f4a5;1. 形式参数&#x1f6b2;2. 实际参数&#x1f525;1. 位置参数☔2. 关键字参数&#x1f3ac;3. 默认参数&#x1f525;4. 可变数量参数(不定长参…

Nomad Web 1.0.12还能这样

大家好&#xff0c;才是真的好。 前几天讲代码和开发&#xff0c;忽略了大家的真实感受&#xff0c;那就是不爱开。我也记起来我们很久没有讲Notes/Domino产品的更新&#xff0c;因为除了补丁程序外&#xff0c;确实没多少更新。 不过就在前两天&#xff0c;有一项产品得到了…

零成本、高效率:免费可视化工具的魅力所在

在如今这个数据驱动的时代&#xff0c;免费可视化工具越来越受到人们的欢迎。这些工具不仅降低了数据分析的门槛&#xff0c;还为用户提供了强大的功能和极高的灵活性&#xff0c;使得各行各业的人们都能够轻松地利用数据做出明智的决策。首先&#xff0c;免费可视化工具的零成…

【Qt】认识Qt界面Hello world小程序

一.认识Qt界面 1.左边栏 在编辑模式下&#xff0c;左边竖排的两个窗⼝叫做 "边栏" 。 ① 是项⽬⽂件管理窗⼝ ② 是打开⽂件列表窗⼝。 边栏⾥的窗⼝数⽬可以增加&#xff0c;边栏⼦窗⼝标题栏有⼀排⼩按钮&#xff0c;最右边的是关闭按钮&#xff0c;倒数第⼆个是 …

嵌入式学习——硬件(IIC、ADC)——day56

1. IIC 1.1 定义&#xff08;同步串行半双工通信总线&#xff09; IIC&#xff08;Inter-Integrated Circuit&#xff09;又称I2C&#xff0c;是是IICBus简称&#xff0c;所以中文应该叫集成电路总线。是飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备…

猫头虎 Gemma和Gemini模型的区别是什么?

猫头虎 &#x1f42f; Gemma和Gemini模型的区别是什么&#xff1f; 摘要&#x1f4d8; 在这篇文章中&#xff0c;我们将深入探讨Gemma和Gemini这两个由Google开发的AI模型。我们会对比它们的参数规模、计算资源需求和集成难度&#xff0c;帮助大家了解这两者之间的主要区别。…

【解锁未来:深入了解机器学习的核心技术与实际应用】

解锁未来&#xff1a;深入了解机器学习的核心技术与实际应用 &#x1f48e;1.引言&#x1f48e;1.1 什么是机器学习&#xff1f; &#x1f48e;2 机器学习的分类&#x1f48e;3 常用的机器学习算法&#x1f48e;3.1 线性回归&#xff08;Linear Regression&#xff09;&#x1…

Redis集群-主从复制、哨兵

●主从复制&#xff1a;主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制基础上实现高可用的。 主从复制主要实现了数据的多机备份&#xff0c;以及对于读操作的负载均衡和简单的故障恢复。缺陷&#xff1a;故障 恢复无法自动化&#xff1b;写操作无法负载均…

幻兽帕鲁服务器如何安装模组安装

由于模组多数为Window版本的&#xff0c;所以本教程以服务端为Window的作为演示&#xff08;Linux服务端的也是一样的操作&#xff09;百度莱卡云开服 如果你你是Linux版本的&#xff0c;请点击跳转切换服务端教程 接下来是本地安装模组包的方法&#xff08;服务器自带&#xf…

妙笔 WonderPen 专业版会员值得购买吗?

在信息爆炸的时代&#xff0c;写作已经是一项重要技能。无论是学生、职场人士还是自由职业者&#xff0c;都经常需要写点东西。 一个好的工具能让写作成为享受&#xff0c;今天就为大家推荐专业写作工具&#xff1a;妙笔。为长文写作设计&#xff0c;且有云服务功能&#xff0…

自闭症儿童能不能用药

在星贝育园自闭症儿童康复学校&#xff0c;我们一直秉持着谨慎且保守的态度对待自闭症儿童的用药问题。我们坚定地认为&#xff0c;在大多数情况下&#xff0c;药物并非自闭症儿童康复的首选。 自闭症是一种神经发育障碍&#xff0c;其核心症状包括社交沟通障碍、重复刻…

为什么网络爬虫广泛使用HTTP代理?

一、引言 网络爬虫作为自动抓取互联网信息的重要工具&#xff0c;在现代社会中发挥着不可或缺的作用。然而随着网络环境的日益复杂&#xff0c;网站反爬虫技术的不断进步&#xff0c;网络爬虫在获取数据的过程中面临着越来越多的挑战。为了应对这些挑战&#xff0c;HTTP 代理成…

C++专业面试真题(1)学习

进程有多少种状态&#xff0c;如何转换 创建&#xff1a;一个进程启动&#xff0c;首先进入创建状态&#xff0c;需要获取系统资源创建进程管理科PCB完成资源分配。就绪态&#xff1a;在创建完成后&#xff0c;进程已经准备好&#xff0c;处于就绪状态&#xff0c;但是还未获得…

Linux内核——Linux内核体系模式(二)

1 Linux系统的中断机制 Linux内核将中断分为两类&#xff1a;硬件中断和软件中断&#xff08;异常&#xff09;。每个中断是由0-255之间的一个数字进行标识。 中断int0-int31&#xff08;0x00-0x1f&#xff09;作为异常int32-int255由用户自己设定 int32-int47对应与8259A中断…