<C语言> 文件操作

news2024/12/25 23:40:47

1 文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名 字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名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指向某个文件的文件信息区(是一个结构体变 量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件

2 文件的打开和关闭

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

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

fopen函数:用于打开文件。

函数原型:

FILE *fopen(const char *filename, const char *mode);
  • filename参数是要打开的文件名,可以是相对路径或绝对路径。
  • mode参数指定打开文件的模式,有如下选项:
打开方式描述如果文件不存在
“r”只读模式,打开一个已存在的文本文件。打开失败,返回 NULL 指针。
“w”写入模式,如果文件存在,则截断文件为0字节,如果文件不存在,则创建一个新文件。创建一个新的空文件。
“a”追加模式,用于在文件末尾添加数据,如果文件不存在,则创建一个新文件。创建一个新的空文件。
“rb”二进制只读模式打开文件。打开失败,返回 NULL 指针。
“wb”二进制写入模式打开文件,如果文件存在,则截断文件为0字节,如果文件不存在,则创建一个新文件。创建一个新的空文件。
“ab”二进制追加模式打开文件,如果文件不存在,则创建一个新文件。创建一个新的空文件。
“r+”读写模式,打开一个已存在的文本文件,允许读取和写入。打开失败,返回 NULL 指针。
“w+”读写模式,如果文件存在,则截断文件为0字节,如果文件不存在,则创建一个新文件,允许读取和写入。创建一个新的空文件。
“a+”读写模式,用于在文件末尾添加数据,如果文件不存在,则创建一个新文件,允许读取和写入。创建一个新的空文件。
“r+b”读写模式,以二进制方式打开一个已存在的文件,允许读取和写入。打开失败,返回 NULL 指针。
“w+b”读写模式,以二进制方式打开文件,如果文件存在,则截断文件为0字节,如果文件不存在,则创建一个新文件,允许读取和写入。创建一个新的空文件。
“a+b”读写模式,以二进制方式在文件末尾添加数据,如果文件不存在,则创建一个新文件,允许读取和写入。创建一个新的空文件。

fclose函数:用于关闭文件。

函数原型:

int fclose(FILE *stream);
  • stream参数是fopen函数返回的指向FILE类型的指针,用于标识要关闭的文件。

实例:

#include <stdio.h>
int main() {
    FILE *pf1 = fopen("HelloWorld.text", "w"); //打开失败返回空指针   在工程下创建文件(相对路径)
    FILE *pf2 = fopen("c:\\code\\1.text", "w");//打开失败返回空指针  在C盘创建文件(绝对路径)

    if (pf1 == NULL) {
        perror("fopen pf1");
        return 1;
    }

    if (pf2 == NULL) {
        perror("fopen pf2");
        return 1;
    }

    //关闭文件
    fclose(pf1);
    fclose(pf2);
    pf1 = NULL;
    pf2 = NULL;
    return 0;
}
// 输出结果:fopen pf2: No such file or directory    C盘没有该目录

在这里插入图片描述

3.文件的顺序读写

3.1 fgetc和fputc

fgetcfputc用于文件读取和写入的标准库函数。它们用于从文件中读取单个字符和将单个字符写入文件。

fgetc函数:

int fgetc(FILE *stream);

fgetc函数用于从给定的文件流(通过FILE指针stream表示)读取一个字符。它会返回读取的字符,如果读取到文件末尾或出现错误,它将返回EOF(End of File)。

示例用法:

#include <stdio.h>
int main() {
    //打开文件
    FILE *pf = fopen("text.text", "w");

    if (pf == NULL) {
        perror("fopen");
        return 1;
    }

    //写文件
    int i = 0;
    for (i = 0; i < 26; i++) {
        fputc('a' + i, pf);
    }

    //关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}

在这里插入图片描述

fputc函数:

int fputc(int character, FILE *stream);

fputc函数用于将一个字符写入指定的文件流(通过FILE指针stream表示)。它会返回写入的字符,如果写入时出现错误,它将返回EOF

示例用法:

#include <stdio.h>
int main() {
    //打开文件
    FILE *pf = fopen("text.text", "r");

    if (pf == NULL) {
        perror("fopen");
        return 1;
    }

    //读文件
    int ch = 0;
    while ((ch = fgetc(pf)) != EOF) {
        printf("%c", ch);
    }
    //每次读取后 pf指针会自动加1

    //关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}

在这里插入图片描述

fgetcfputc是较低级的文件I/O函数,C语言还提供了更高级的文件读写函数,如fgetsfputs,它们更方便处理字符串和一行文本的读写。

3.2 fgets和fputs

fgetsfputs是用于文件读取和写入的标准库函数,它们相对于fgetcfputc更方便处理字符串和一行文本的读写。

fgets函数:

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

fgets函数用于从给定的文件流(通过FILE指针stream表示)读取一行文本,并将其存储在字符数组str中。参数n指定了最大读取的字符数(包括换行符和终止符),以避免缓冲区溢出。读取的文本会包含换行符(如果存在的话),并以空字符\0结尾。

实例用法:

#include <stdio.h>
int main() {
    //打开文件
    FILE *pf = fopen("text.text", "w");

    if (pf == NULL) {
        perror("fopen");
        return 1;
    }

    //写文件
    fputs("hello ", pf);
    fputs("World", pf);
    //如果文件本身有内容 就会清楚原来文件的所有内容  在写入

    //关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}

在这里插入图片描述

fputs函数:

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

fputs函数用于将以空字符\0结尾的字符串str写入到指定的文件流(通过FILE指针stream表示)中。它不会在字符串末尾添加额外的换行符,所以需要手动添加换行符。

示例用法:

#include <stdio.h>
int main() {
    //打开文件
    FILE *pf = fopen("text.text", "r");

    if (pf == NULL) {
        perror("fopen");
        return 1;
    }

    //读文件一行一行读   只读一行
    char arr[20] = "#########";
    fgets(arr, 20, pf);
    printf("%s", arr);
    //关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}

在这里插入图片描述

和之前的fgetcfputc一样,fgetsfputs也应该进行错误检查,并在不需要使用文件指针时关闭文件。它们更适用于处理文本文件和文本行的读写,可以方便地读取一行文本或写入一个带有换行符的字符串。

3.3 fprintf和fscanf

fscanffprintf是用于格式化文件输入和输出的标准库函数。它们与scanfprintf函数类似,但是可以从文件中读取数据和将数据写入文件中。

fprintf函数:

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

fprintf函数用于将格式化的数据按照指定的格式字符串format写入到给定的文件流(通过FILE指针stream表示)中。format参数是一个格式字符串,类似于printf函数中的格式字符串。根据格式字符串中的格式说明符,fprintf将相应的数据转换为字符串并写入文件。

实例:

#include <stdio.h>
struct S {
    char name[20];
    int age;
    float score;
};

int main() {
    struct S s = {"zhangsan", 20, 95.5f};
    //把s中的结构体数据写到文件中
    FILE *pf = fopen("test.text", "w");
    if (pf == NULL) {
        perror("fopen");
        return 1;
    }
    //写文件
    fprintf(pf, "%s %d %f", s.name, s.age, s.score);
    return 0;
}

在这里插入图片描述

fscanf函数:

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

fscanf函数用于从给定的文件流(通过FILE指针stream表示)中按照指定的格式字符串format读取数据。读取的数据将根据格式字符串中的格式说明符进行解析,并将解析后的值存储在对应的变量中。format参数是一个格式字符串,类似于scanf函数中的格式字符串。

示例用法:

#include <stdio.h>
struct S {
    char name[20];
    int age;
    float score;
};

int main() {
    struct S s = {0};
    //把s中的结构体数据读出来
    FILE *pf = fopen("test.text", "r");
    if (pf == NULL) {
        perror("fopen");
        return 1;
    }
    //读文件
    fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));
    printf("%s %d %f", s.name, s.age, s.score);
    return 0;
}

在这里插入图片描述

和之前的函数一样,fscanffprintf也应该进行错误检查,并在不需要使用文件指针时关闭文件。它们使得读取和写入文件中的数据更加方便,并且能够按照指定的格式进行数据的输入和输出。

3.4 fwrite和fread

freadfwrite是用于二进制文件读取和写入的标准库函数。与之前的函数(如fgetsfputsfscanffprintf)不同,这两个函数用于处理二进制数据而不是文本数据。它们通常用于读取和写入二进制文件或二进制数据块。

fwrite函数:

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

fwrite函数将来自由ptr指向的内存区域的数据写入给定的文件流(通过FILE指针stream表示)。参数size表示每个数据项的字节数,而nmemb表示要写入的数据项的数量。函数返回实际成功写入的数据项数量,通常应该与nmemb进行比较,以确保全部数据都被正确写入。

实例:

#include <stdio.h>
struct S {
    char name[20];
    int age;
    float score;
};

int main() {
    struct S s = {"zhangsan", 20, 95.5f};
    //把s中的结构体数据写到文件中
    FILE *pf = fopen("test.text", "wb");
    if (pf == NULL) {
        perror("fopen");
        return 1;
    }
    //写文件
    fwrite(&s, sizeof(s), 1, pf);
    return 0;
}

在这里插入图片描述

fread函数:

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

fread函数从给定的文件流(通过FILE指针stream表示)中读取数据,并将其存储在由ptr指向的内存区域中。参数size表示每个数据项的字节数,而nmemb表示要读取的数据项的数量。函数返回实际成功读取的数据项数量,通常应该与nmemb进行比较,以确保全部数据都被正确读取。

实例:

#include <stdio.h>
struct S {
    char name[20];
    int age;
    float score;
};

int main() {
    struct S s = {0};
    //把s中的结构体数据读到文件中
    FILE *pf = fopen("test.text", "rb");
    if (pf == NULL) {
        perror("fopen");
        return 1;
    }
    //读文件
    fread(&s, sizeof(s), 1, pf);
    printf("%s %d %f\n", s.name, s.age, s.score);
    return 0;
}

在这里插入图片描述

freadfwrite是较低级的文件I/O函数,直接处理二进制数据。在使用它们时,需要注意字节顺序和数据的存储格式,以免在不同平台或环境下出现问题。如果需要处理复杂的数据结构或需要更高级的序列化功能,建议使用专门的库或函数来处理。

对任何一个C程序,只要运行起来就默认打开三个流

stdin - 标准输入流 - 键盘

stdout - 标准输出流 - 屏幕

stderr - 标准错误流 - 屏幕

他们的类型都是FILE*

int main()
{
    int ch = fgetc(stdin);  //键盘输入d
    fputc(ch,stdout);  //d键盘输出d
    return 0;
}
//printf ==  fprintf( ,stdout)

4.对比一组函数sprintf/sscanf

scanf:按照一定的格式从键盘输入数据

printf:按照一定的格式把数据打印(输出)到屏幕上

适用于标准输入/输出流的格式化的输入/输出语句

fscanf:按照一定的格式从输入流(文件/stdin)输入数据

fprintf:按照一定的格式向输出流(文件/stdout)输出数据

适用于所有的输入/输出流的格式化输入输出语句

sscanf

int sscanf(const char *s,const char* format,...

从字符串中按照一定的格式读取出格式化的数据

sprintf

int sprintf(char * str,const char* format,...)

将格式化的数据按照一定的格式转换成字符串

实例:

#include <stdio.h>
struct S {
    char name[10];
    int age;
    float score;
};

int main() {
    char buf[100] = {0};
    struct S tmp = {0};

    struct S s = {"zhangsan", 20, 95.5f};
    //能否把这个结构体的数据转换成字符串
    //转换成 - zhangsan 20 95.5
    sprintf(buf, "%s %d %f", s.name, s.age, s.score);
    printf("%s\n", buf);

    //能否将buf中的字符串还原成一个结构体数据
    sscanf(buf, "%s %d %f", tmp.name, &(tmp.age), &(tmp.score));
    printf("%s %d %f\n", tmp.name, tmp.age, tmp.score);//以结构体的形式打印
    return 0;
}

在这里插入图片描述

5.文件的随机读写

5.1 fseek

fseek() 允许将文件位置指示器移动到文件中的特定位置。这个函数特别适用于当你想从文件的特定位置开始读取或写入数据而不是从开头开始时。

fseek() 函数的原型如下:

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

参数:

  • stream:指向表示你想操作的文件的 FILE 对象的指针。文件必须已经以支持定位的模式打开,比如读取或写入模式。
  • offset:要移动的文件位置指示器的字节数。正值将指示器向前移动,负值将指示器向后移动。通常是 long int 类型。
  • origin:参考位置,从该位置应用偏移量。它可以取以下值之一:
    • SEEK_SET (0):偏移量相对于文件的开头。
    • SEEK_CUR (1):偏移量相对于当前文件指针的位置。
    • SEEK_END (2):偏移量相对于文件的末尾。

返回值:

  • 如果成功,fseek() 返回 0。
  • 如果发生错误,它返回一个非零值,表示失败。

实例:

#include <stdio.h>
int main()
{
    FILE *pf = fopen("test.txt", "r");
    if (pf == NULL)
    {
        perror("fopen()");
        return 1;
    }
    //读文件 - 文件中存放abcdef
    int ch = fgetc(pf);
    printf("%c\n", ch);       // 输出:a  读完后文件指针往后+1 指向b

    fseek(pf, 2, SEEK_CUR); //从当前文件指针往后偏移2个  (当前是b)
    ch = fgetc(pf);
    printf("%c\n", ch); // 输出:d


    fseek(pf, 3, SEEK_SET); //文件首部向后偏移三个
    ch = fgetc(pf);
    printf("%c\n", ch); // 输出:d

    fseek(pf, -3, SEEK_END); //文件首部向前偏移三个  末尾的指针是f的后面
    ch = fgetc(pf);
    printf("%c\n", ch); // 输出:d

    //关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}

fseek() 应该用于二进制文件或者你知道要移动到的确切字节偏移的文本文件。对于文本文件,由于不同平台上换行符的差异,使用 fseek() 可能会导致意外的结果。在这种情况下,最好使用 fgets() 逐行读取文件,或者逐个字符处理文件内容。

5.2 ftell

ftell() 用于在文件中获取当前文件位置指示器的偏移量(即文件指针的位置)。它返回当前位置相对于文件开头的字节数。

函数原型为:

long int ftell(FILE *stream);

参数:

  • stream:一个指向 FILE 对象的指针,表示你要获取当前位置的文件。

返回值:

  • 如果成功,ftell() 返回一个 long int 类型的值,表示当前文件位置指示器相对于文件开头的偏移量(以字节为单位)。
  • 如果发生错误,返回值为 EOF(通常为 -1),表示出现了错误。
#include <stdio.h>
int main() {
    FILE *pf = fopen("test.txt", "r");
    if (pf == NULL) {
        perror("fopen()");
        return 1;
    }
    //读文件 - 文件中存放abcdef
    int ch = fgetc(pf);
    printf("%c\n", ch);// 输出:a  读完后文件指针往后+1 指向b

    fseek(pf, 2, SEEK_CUR);//从当前文件指针往后偏移2个  (当前是b)
    ch = fgetc(pf);
    printf("%c\n", ch);// 输出:d

    int pos = ftell(pf);//当文件指向d的时候 文件指针往后偏移1个 指向了e
    printf("%d\n", pos);//输出:4   e和a相差4个位置
    //关闭文件  
    fclose(pf);
    pf = NULL;
    return 0;
}

ftell() 通常与 fseek() 一起使用,用于确定文件中某个特定位置的偏移量。可以通过先调用 ftell() 获取当前位置,然后使用这个值作为 fseek() 的偏移量来实现定位文件指针到该位置。

5.3 rewind

rewind() 用于将文件位置指示器重新设置为文件的开头。它类似于使用 fseek() 将文件指针移到文件开头,但是 rewind() 是一个更简单的函数,专门用于将文件指针归零。

函数原型为:

void rewind(FILE *stream);

参数:

  • stream:一个指向 FILE 对象的指针,表示你要重新设置文件位置指示器的文件。

返回值:rewind() 函数没有返回值(即返回类型是 void)。

#include <stdio.h>
int main() {
    FILE *pf = fopen("test.txt", "r");
    if (pf == NULL) {
        perror("fopen()");
        return 1;
    }
    //读文件 - 文件中存放abcdef
    int ch = fgetc(pf);
    printf("%c\n", ch);// 输出:a  读完后文件指针往后+1 指向b

    fseek(pf, 2, SEEK_CUR);//从当前文件指针往后偏移2个  (当前是b)
    ch = fgetc(pf);
    printf("%c\n", ch);// 输出:d

    //记录当前偏移量
    int pos = ftell(pf);//当文件指向d的时候 文件指针往后偏移1个 指向了e
    printf("%d\n", pos);// 输出:4

    //偏移量回到初始位置
    rewind(pf);
    ch = fgetc(pf);
    printf("%c\n", ch);// 输出:a
    //关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}

rewind() 函数非常方便,因为无需知道文件的大小或使用具体的偏移量,只需调用这个函数,文件指针就会回到文件的起始位置,从头开始读取或写入数据。

6.文件读取结束的判定

6.1 被错误使用的feof

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

而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。

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

例如:

fgetc - 如果读取正常,会返回读取到的字符的ascll码值,如果读取失败会返回EOF

fgets - 如果读取正常,返回的是读取到的数据的地址,如果读取失败,返回的是NULL

fscanf - 如果读取正常,返回的是格式串中指定的数据的个数,如果读取失败,返回的是小于格式串中指定的数据的个数

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() {
    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);
}

7.文件缓冲区

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

#include <stdio.h>
#include <windows.h>
//VS2013 WIN10环境测试
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.coloradmin.cn/o/807061.html

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

相关文章

windows系统之WSL 安装 Ubuntu

WSL windows10 以上才有这个wsl功能 WSL&#xff1a; windows Subsystem for Linux 是应用于Windows系统之上的Linux子系统 作用很简单&#xff0c;可以在Windows系统中获取Linux系统环境&#xff0c;并完全直连计算机硬件&#xff0c;无需要通过虚拟机虚拟硬件 Windows10的W…

MD-MTSP:斑马优化算法ZOA求解多仓库多旅行商问题MATLAB(可更改数据集,旅行商的数量和起点)

一、斑马优化算法ZOA 斑马优化算法&#xff08;Zebra Optimization Algorithm&#xff0c;ZOA&#xff09;Eva Trojovsk等人于2022年提出&#xff0c;其模拟斑马的觅食和对捕食者攻击的防御行为。斑马优化算法&#xff08;Zebra Optimization Algorithm&#xff0c;ZOA&#x…

海外ASO优化之应用商店本地化

大多数应用可供世界任何地方的用户使用&#xff0c;所以需要以多种不同语言来展示我们的应用。它能够包含在跨地理区域的搜索结果中&#xff0c;从而提高全球可见性和转化率。 1、关键词的研究&#xff0c;对于确定流行的本地关键词至关重要。 在本地化Google Play的应用页面时…

RTPS规范v2.5(中文版)

实时发布订阅协议 DDS互操作性有线协议 &#xff08;DDSI-RTPS&#xff09; 技术规范 V2.5 &#xff08;2022-04-01正式发布&#xff09; https://www.omg.org/spec/DDSI-RTPS/2.5/PDF   目 录 1 范围 8 2 一致性 8 3 规范性参考文献 8 4 术语和定义 9 5 标识 …

HTML5前端开发工程师的岗位职责说明(合集)

HTML5前端开发工程师的岗位职责说明1 职责 1、根据产品设计文档和视觉文件&#xff0c;利用HTML5相关技术开发移动平台的web前端页面; 2、基于HTML5.0标准进行页面制作&#xff0c;编写可复用的用户界面组件; 3、持续的优化前端体验和页面响应速度&#xff0c;并保证兼容性和…

Godot 4 插件 - Utility AI 研究

今天看到一个视频教学 Godot4 | 实现简单AI | Utility AI 插件_哔哩哔哩_bilibili 就看了一下。吸引我的不是插件&#xff0c;是AI这两个字母。这AI与Godot怎么结合&#xff1f;感觉还是离线使用&#xff0c;值得一看。 视频时间不长&#xff0c;15分钟左右&#xff0c;看得…

无涯教程-jQuery - Highlight方法函数

Highlight 效果可以与effect()方法一起使用。这将以特定的颜色突出显示元素的背景&#xff0c;默认为黄色(yellow)。 Highlight - 语法 selector.effect( "highlight", {arguments}, speed ); 这是所有参数的描述- color - 高亮显示颜色。默认值为"#fff…

比memcpy还要快的内存拷贝,了解一下

前言 朋友们有想过居然还有比memcpy更快的内存拷贝吗&#xff1f; 讲道理&#xff0c;在这之前我没想到过&#xff0c;我也一直觉得memcpy就是最快的内存拷贝方法了。 也不知道老板最近是咋了&#xff0c;天天开会都强调&#xff1a;“我们最近的目标就一个字&#xff0c;性能优…

CompletableFuture生产中使用问题

CompletableFuture生产中使用问题 1 背景2 测试3 原因4. 总结 1 背景 接到一个任务,需要优化下单接口,查看完业务逻辑后发现有一些可以并行或异步查询的地方,于是采用CompletableFuture来做异步优化,提高接口响应速度,伪代码如下 //查询用户信息CompletableFuture<JSONObj…

认识 springboot 并了解它的创建过程 - 1

前言 本篇介绍什么是SpringBoot, SpringBoot项目如何创建&#xff0c;认识创建SpringBoot项目的目录&#xff0c;了解SpringBoo特点如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&#xff01; 文章目录 前言1.什么是springboot?2.为什么…

投影仪离线语音识别芯片ic方案,高识别率识别IC,WTK6900H-B-24SS

随着智能科技的不断演进&#xff0c;人工智能已经深入到我们的生活中的方方面面。投影仪作为现代影音娱乐与商务展示的得力工具&#xff0c;为了进一步提升用户与产品的交互体验&#xff0c;深圳唯创知音最新推出WTK6900H-B-24SS离线语音识别芯片IC方案。这项创新技术使得投影仪…

入侵检测——恶意软件、病毒、防病毒、反病毒技术

目录 1. 什么是恶意软件&#xff1f; 2. 恶意软件有哪些特征&#xff1f; 3. 恶意软件的可分为那几类&#xff1f; 3.1.1按照传播方式分类&#xff1a; 3.1.2按照功能分类&#xff1a; 4. 恶意软件的免杀技术有哪些&#xff1f; 5. 反病毒技术有哪些&#xff1f; 5…

左神算法之中级提升(6)

目录 【案例1】 【题目描述】 【思路解析】 【代码实现】 【案例2】 【题目描述】 【思路解析】 【代码实现】 【案例3】 【题目描述】 【思路解析】 【代码实现】 【案例4】 【题目描述】 2018年美团面试题 【思路解析】 【代码实现】 【案例5】 【题目描述】 …

Service Mesh之Istio部署bookinfo

给istio部署插件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 rootk8s-master01:/usr/local# cd istio rootk8s-master01:/usr/local/istio# ls samples/addons/ extras grafana.yaml jaeger.yaml kiali.yaml prometheus.yaml RE…

AMD技术泄露?CPU加密技术面临新的危机

许多AMD CPU中的破解加密、泄露密码的漏洞可能需要几个月才能修复。 “Zenbleed”漏洞影响了所有基于Zen 2架构的Ryzen、Threadripper和EPYC处理器。 技术泄露情况 谷歌零项目安全团队成员Tavis Ormandy称&#xff0c;许多AMD新一代消费级、工作站和服务器处理器最近被曝出漏…

招商银行秋招攻略和考试内容详解

招商银行秋招简介 招商银行是一家股份制商业银行&#xff0c;银行的服务理念已经深入人心&#xff0c;在社会竞争愈来愈烈的今天&#xff0c;招商银行的招牌无疑是个香饽饽&#xff0c;很多人也慕名而至&#xff0c;纷纷向招商银行投出了简历。那么秋招银行的秋招开始时间是多…

感受野(Receptive Field)的理解与计算

一、 定义 在卷积神经网络中&#xff0c;感受野&#xff08;Receptive Field&#xff09;是指特征图上的某个点能看到的输入图像的区域&#xff0c;即特征图上的点是由输入图像中感受野大小区域的计算得到的。 神经元感受野的值越大表示其能接触到的原始图像范围就越大&#…

Java编译期与运行期优化探究

一: 即时编译器优化技术一览 1.编译器策略&#xff08;compiler tactics&#xff09; 延迟编译(delayed compilation) 分层编译(tiered compilation) 栈上替换(on-stack replacement) 延迟优化(delayed reoptimization) 静态单赋值表示(static single assignment representat…

电脑选睡眠、休眠还是关机?

关机 这是大家最熟悉的。关机时&#xff0c;系统首先关闭所有运行中的程序&#xff0c;然后关闭系统后台服务。随后&#xff0c;系统向主板请求关机&#xff0c;主板断开电源的供电使能&#xff0c;让电源切断对绝大多数设备的供电&#xff08;只剩一些内部零件仍会维持电源供应…

(20)(20.4) 飞行前测试控制装置

文章目录 20.4 飞行前测试控制装置 20.5 测试失控保护 20.6 减少控制的滞后性 20.4 飞行前测试控制装置 在第一次飞行之前&#xff0c;你应该测试所有的功能是否工作良好。 要检查上述控制措施的移动方向是否正确&#xff1a; 在操纵杆设置屏幕上单击"启用"按钮…