Linux-C/C++--标准 I/O 库

news2025/1/21 19:42:15

一、标准 I/O 库简介

        在上一部分介绍应用编程概念时向大家介绍了系统调用与标准 C 语言函数库(以下简称标准 C 库),所谓标准 I/O 库则是标准 C 库中用于文件 I/O 操作(譬如读文件、写文件等)相关的一系列库函数的集合,通常标准 I/O 库函数相关的函数定义都在头文件<stdio.h>中,所以我们需要在程序源码中包含<stdio.h>头文件。

        标准 I/O 库函数是构建于文件 I/Oopen()read()write()lseek()close()等)这些系统调用之上的,譬如标准 I/O 库函数 fopen()就利用系统调用 open()来执行打开文件的操作、fread()利用系统调用 read()来执行读文件操作、fwrite()则利用系统调用 write()来执行写文件操作等等。

        那既然如此,为何还需要设计标准 I/O 库?直接使用文件 I/O 系统调用不是更好吗?事实上,并非如此,在第一章中我们也提到过,设计库函数是为了提供比底层系统调用更为方便、好用的调用接口,虽然标准 I/O 构建于文件 I/O 之上,但标准 I/O 却有它自己的优势,标准 I/O 和文件 I/O 的区别如下:

虽然标准 I/O 和文件 I/O 都是 C 语言函数,但是标准 I/O 是标准 C 库函数,而文件 I/O 则是 Linux系统调用;

标准 I/O 是由文件 I/O 封装而来,标准 I/O 内部实际上是调用文件 I/O 来完成实际操作的;

可移植性:标准 I/O 相比于文件 I/O 具有更好的可移植性,通常对于不同的操作系统,其内核向应用层提供的系统调用往往都是不同,譬如系统调用的定义、功能、参数列表、返回值等往往都是不一样的;而对于标准 I/O 来说,由于很多操作系统都实现了标准 I/O 库,标准 I/O 库在不同的操作系统之间其接口定义几乎是一样的,所以标准 I/O 在不同操作系统之间相比于文件 I/O 具有更好的可移植性。

性能、效率:标准 I/O 库在用户空间维护了自己的 stdio 缓冲区,所以标准 I/O 是带有缓存的,而文件 I/O 在用户空间是不带有缓存的,所以在性能、效率上,标准 I/O 要优于文件 I/O。关于标准 I/O 库相关介绍就到这里了,从下小节开始将正式向大家介绍如何在我们的应用程序中使用标准 I/O 库函数。

二、FILE 指针

        在 之前的章节 中,所介绍的所有文件 I/O 函数(open()read()write()lseek()等)都是围绕文件描述符进行的,当调用 open()函数打开一个文件时,即返回一个文件描述符 fd,然后该文件描述符就用于后续的 I/O 操作。而对于标准 I/O 库函数来说,它们的操作是围绕 FILE 指针进行的,当使用标准 I/O 库函数打开或创建一个文件时,会返回一个指向 FILE 类型对象的指针(FILE *),使用该 FILE 指针与被打开或创建的文件相关联,然后该 FILE 指针就用于后续的标准 I/O 操作(使用标准 I/O 库函数进行 I/O 操作),所以由此可知,FILE 指针的作用相当于文件描述符,只不过 FILE 指针用于标准 I/O 库函数中、而文件描述符则用于文件I/O 系统调用中。

        FILE 是一个结构体数据类型,它包含了标准 I/O 库函数为管理文件所需要的所有信息,包括用于实际I/O 的文件描述符、指向文件缓冲区的指针、缓冲区的长度、当前缓冲区中的字节数以及出错标志等。FILE数据结构定义在标准 I/O 库函数头文件 stdio.h 中。

三、标准输入、标准输出和标准错误

        关于标准输入、标准输出以及标准错误这三个概念在 2.2 小节有所提及,所谓标准输入设备指的就是计算机系统的标准的输入设备,通常指的是计算机所连接的键盘;而标准输出设备指的是计算机系统中用于输出标准信息的设备,通常指的是计算机所连接的显示器;标准错误设备则指的是计算机系统中用于显示错误信息的设备,通常也指的是显示器设备。

        用户通过标准输入设备与系统进行交互,进程将从标准输入(stdin)文件中得到输入数据,将正常输出数据(譬如程序中 printf 打印输出的字符串)输出到标准输出(stdout)文件,而将错误信息(譬如函数调用报错打印的信息)输出到标准错误(stderr)文件。

        标准输出文件和标准错误文件都对应终端的屏幕,而标准输入文件则对应于键盘。

        每个进程启动之后都会默认打开标准输入、标准输出以及标准错误,得到三个文件描述符,即 01、2,其中 0 代表标准输入、1 代表标准输出、2 代表标准错误;在应用编程中可以使用宏 STDIN_FILENO、STDOUT_FILENO 和 STDERR_FILENO 分别代表 012,这些宏定义在 unistd.h 头文件中:

/* Standard file descriptors. */
#define STDIN_FILENO 0 /* Standard input. */
#define STDOUT_FILENO1 /* Standard output. */
#define STDERR_FILENO2 /* Standard error output. */

        0、12 这三个是文件描述符,只能用于文件 I/Oread()write()等),那么在标准 I/O 中,自然是无法使用文件描述符来对文件进行 I/O 操作的,它们需要围绕 FILE 类型指针来进行,在 stdio.h 头文件中有相应的定义,如下:

/* Standard streams. */
extern struct _IO_FILE *stdin; /* Standard input stream. */
extern struct _IO_FILE *stdout; /* Standard output stream. */
extern struct _IO_FILE *stderr; /* Standard error output stream. */
/* C89/C99 say they're macros. Make them happy. */
#define stdin stdin
#define stdout stdout
#define stderr stderr

        所以,在标准 I/O 中,可以使用 stdinstdoutstderr 来表示标准输入、标准输出和标准错误。

四、打开文件 fopen()、fclose()关闭文件

        在 0 所介绍的文件 I/O 中,使用 open()系统调用打开或创建文件,而在标准 I/O 中,我们将使用库函数 fopen()打开或创建文件,fopen()函数原型如下所示:

#include <stdio.h>
FILE *fopen(const char *path, const char *mode);

函数参数和返回值含义如下:

path参数 path 指向文件路径,可以是绝对路径、也可以是相对路径。

mode参数 mode 指定了对该文件的读写权限,是一个字符串,稍后介绍。

返回值:调用成功返回一个指向 FILE 类型对象的指针(FILE *),该指针与打开或创建的文件相关联,后续的标准 I/O 操作将围绕 FILE 指针进行。如果失败则返回 NULL,并设置 errno 以指示错误原因。

新建文件的权限

fopen()函数原型可知,fopen()只有两个参数 path mode,不同于 open()系统调用,它并没有任何一个参数来指定新建文件的权限。当参数 mode 取值为"w""w+""a""a+"之一时,如果参数 path 指定的文件不存在,则会创建该文件,那么新的文件的权限是如何确定的呢?

虽然调用 fopen()函数新建文件时无法手动指定文件的权限,但却有一个默认值:

S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH (0666)

使用示例

        使用只读方式打开文件:

fopen(path, "r");

        使用可读、可写方式打开文件:

fopen(path, "r+");

        使用只写方式打开文件,并将文件长度截断为 0,如果文件不存在则创建该文件:

fopen(path, "w");
fclose() 关闭文件
        调用 fclose() 库函数可以关闭一个由 fopen() 打开的文件,其函数原型如下所示:
#include <stdio.h>
int fclose(FILE *stream);

        参数 stream FILE 类型指针,调用成功返回 0;失败将返回 EOF(也就是-1),并且会设置 errno 来指示错误原因。

五、读文件fread()和写文件fwrite()

        当使用 fopen()库函数打开文件之后,接着我们便可以使用 fread()fwrite()库函数对文件进行读、写操作了,函数原型如下所示:

#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

库函数 fread()用于读取文件数据,其参数和返回值含义如下:

ptrfread()将读取到的数据存放在参数 ptr 指向的缓冲区中;

sizefread()从文件读取 nmemb 个数据项,每一个数据项的大小为 size 个字节,所以总共读取的数据大小为 nmemb * size 个字节。

nmemb参数 nmemb 指定了读取数据项的个数。

streamFILE 指针。

返回值:调用成功时返回读取到的数据项的数目(数据项数目并不等于实际读取的字节数,除非参数size 等于 1);如果发生错误或到达文件末尾,则 fread()返回的值将小于参数 nmemb,那么到底发生了错误还是到达了文件末尾,fread()不能区分文件结尾和错误,究竟是哪一种情况,此时可以使用 ferror()feof()函数来判断,具体参考 4.7 小节内容的介绍。

库函数 fwrite()用于将数据写入到文件中,其参数和返回值含义如下:

ptr将参数 ptr 指向的缓冲区中的数据写入到文件中。

size参数 size 指定了每个数据项的字节大小,与 fread()函数的 size 参数意义相同。

nmemb参数 nmemb 指定了写入的数据项个数,与 fread()函数的 nmemb 参数意义相同。

streamFILE 指针。

返回值:调用成功时返回写入的数据项的数目(数据项数目并不等于实际写入的字节数,除非参数 size等于 1);如果发生错误,则 fwrite()返回的值将小于参数 nmemb(或者等于 0)。

        由此可知,库函数 fread()、fwrite()中指定读取或写入数据大小的方式与系统调用 read()write()不同,前者通过 nmemb(数据项个数)*size(每个数据项的大小)的方式来指定数据大小,而后者则直接通过一个 size 参数指定数据大小。

        譬如要将一个 struct mystr 结构体数据写入到文件中,可按如下方式写入:

fwrite(buf, sizeof(struct mystr), 1, file);

使用示例

        结合使用本小节与上小节所学内容,我们来编写一个简单地示例代码,使用标准 I/O 方式对文件进行读写操作。示例代码 4.5.1 演示了使用 fwrite()库函数将数据写入到文件中。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
 char buf[] = "Hello World!\n";
 FILE *fp = NULL;
 /* 打开文件 */
 if (NULL == (fp = fopen("./test_file", "w"))) {
     perror("fopen error");
     exit(-1);
 }
 printf("文件打开成功!\n");
 /* 写入数据 */
 if (sizeof(buf) > fwrite(buf, 1, sizeof(buf), fp)) {
     printf("fwrite error\n");
     fclose(fp);
     exit(-1);
 }
 printf("数据写入成功!\n");
 /* 关闭文件 */
 fclose(fp);
 exit(0);
}

        首先使用 fopen()函数将当前目录下的 test_file 文件打开,调用 fopen()mode 参数设置为"w",表示以只写的方式打开文件,并将文件的长度截断为 0,如果指定文件不存在则创建该文件。打开文件之后调用fwrite()函数将"Hello World!"字符串数据写入到文件中。

        写入完成之后,调用 fclose()函数关闭文件,退出程序。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
 char buf[50] = {0};
 FILE *fp = NULL;
 int size;
 /* 打开文件 */
 if (NULL == (fp = fopen("./test_file", "r"))) {
     perror("fopen error");
     exit(-1);
 }
 printf("文件打开成功!\n");
 /* 读取数据 */
 if (12 > (size = fread(buf, 1, 12, fp))) {
 if (ferror(fp)) { //使用 ferror 判断是否是发生错误
     printf("fread error\n");
     fclose(fp);
     exit(-1);
 }
 /* 如果未发生错误则意味着已经到达了文件末尾 */
 }
 printf("成功读取%d 个字节数据: %s\n", size, buf);
 /* 关闭文件 */
 fclose(fp);
 exit(0);
}

        首先同样使用 fopen()打开当前目录下的 test_file 文件得到 FILE 指针,调用 fopen()时其参数 mode 设置为"r",表示以只读方式打开文件。

        接着使用 fread()函数从文件中读取 12 * 1=12 个字节的数据,将读取到的数据存放在 buf 中,当读取到的字节数小于指定字节数时,表示发生了错误或者已经到达了文件末尾,程序中调用了库函数 ferror()来判断是不是发生了错误,该函数将会在 4.7 小节中介绍。如果未发生错误,那么就意味着已经达到了文件末尾,其实也就说明了在调用 fread()读文件时对应的读写位置到文件末尾之间的字节数小于指定的字节数。

六、fseek 定位

        库函数 fseek()的作用类似于系统调用 lseek(),用于设置文件读写位置偏移量,lseek()用于文件 I/O,而库函数 fseek()则用于标准 I/O,其函数原型如下所示:

#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);

函数参数和返回值含义如下:

streamFILE 指针。

offsetlseek()函数的 offset 参数意义相同。

whencelseek()函数的 whence 参数意义相同。

返回值:成功返回 0;发生错误将返回-1,并且会设置 errno 以指示错误原因;与 lseek()函数的返回值意义不同,这里要注意!

        调用库函数 fread()fwrite()读写文件时,文件的读写位置偏移量会自动递增,使用 fseek()可手动设置文件当前的读写位置偏移量。

譬如将文件的读写位置移动到文件开头处:

fseek(file, 0, SEEK_SET);

将文件的读写位置移动到文件末尾:

fseek(file, 0, SEEK_END);

将文件的读写位置移动到 100 个字节偏移量处:

fseek(file, 100, SEEK_SET);
使用示例
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
 FILE *fp = NULL;
 char rd_buf[100] = {0};
 char wr_buf[] = "http://xxxxxxxxxxxxx\n";
 int ret;
 /* 打开文件 */
 if (NULL == (fp = fopen("./test_file", "w+"))) {
     perror("fopen error");
     exit(-1);
 }
 printf("文件打开成功!\n");
 /* 写文件 */
 if (sizeof(wr_buf) > fwrite(wr_buf, 1, sizeof(wr_buf), fp)) {
     printf("fwrite error\n");
     fclose(fp);
     exit(-1);
 }
 printf("数据写入成功!\n");
 /* 将读写位置移动到文件头部 */
 if (0 > fseek(fp, 0, SEEK_SET)) {
     perror("fseek error");
     fclose(fp);
     exit(-1);
 }
 /* 读文件 */
 if (sizeof(wr_buf) > (ret = fread(rd_buf, 1, sizeof(wr_buf), fp))) {
     printf("fread error\n");
     fclose(fp);
     exit(-1);
 }
 printf("成功读取%d 个字节数据: %s\n", ret, rd_buf);
 /* 关闭文件 */
 fclose(fp);
 exit(0);
}

        程序中首先调用 fopen()打开当前目录下的 test_file 文件,参数 mode 设置为"w+";接着调用 fwrite()将 wr_buf 缓冲区中的字符串数据 http://xxxxxxxxxxxxx\n"写入到文件中;由于调用了fwrite(),所以此时的读写位置已经发生了改变,不再是文件头部,所以程序中调用了 fseek()将读写位置移动到了文件头,接着调用 fread()从文件头部开始读取刚写入的数据,读取成功之后打印出信息。

七、ftell()、feof()、ferror()函数

1、ftell()函数

        库函数 ftell()可用于获取文件当前的读写位置偏移量,其函数原型如下所示

#include <stdio.h>
long ftell(FILE *stream);

        参数 stream 指向对应的文件,函数调用成功将返回当前读写位置偏移量;调用失败将返回-1,并会设置errno 以指示错误原因。

2、feof()函数

库函数 feof()用于测试参数 stream 所指文件的 end-of-file 标志,如果 end-of-file 标志被设置了,则调用feof()函数将返回一个非零值,如果 end-of-file 标志没有被设置,则返回 0

其函数原型如下所示:

#include <stdio.h>
int feof(FILE *stream);

当文件的读写位置移动到了文件末尾时,end-of-file 标志将会被设置。

if (feof(file)) {
/* 到达文件末尾 */
}
else {
/* 未到达文件末尾 */
}

3、ferror()函数

        库函数 ferror()用于测试参数 stream 所指文件的错误标志,如果错误标志被设置了,则调用 ferror()函数将返回一个非零值,如果错误标志没有被设置,则返回 0

其函数原型如下所示:

#include <stdio.h>
int ferror(FILE *stream);

        当对文件的 I/O 操作发生错误时,错误标志将会被设置。

if (ferror(file)) {
/* 发生错误 */
}
else {
/* 未发生错误 */
}

4、clearerr()函数

        库函数 clearerr()用于清除 end-of-file 标志和错误标志,当调用 feof()ferror()校验这些标志后,通常需要清除这些标志,避免下次校验时使用到的是上一次设置的值,此时可以手动调用 clearerr()函数清除标志。

        clearerr()函数原型如下所示:

#include <stdio.h>
void clearerr(FILE *stream);

八、格式化I/O

1、格式化输出

        C 库函数提供了 5 个格式化输出函数,包括:printf()fprintf()dprintf()sprintf()snprintf(),其函数 定义如下所示:

#include <stdio.h>
int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int dprintf(int fd, const char *format, ...);
int sprintf(char *buf, const char *format, ...);
int snprintf(char *buf, size_t size, const char *format, ...);
        可以看到,这 5 个函数都是可变参函数,它们都有一个共同的参数 format ,这是一个字符串,称为格式控制字符串,用于指定后续的参数如何进行格式转换,所以才把这些函数称为格式化输出,因为它们可以以调用者指定的格式进行转换输出;学习这些函数的重点就是掌握这个格式控制字符串 format 的书写格式以及它们所代表的意义,稍后介绍 format 参数的格式。
        每个函数除了固定参数之外,还可携带 0 个或多个可变参数。
printf() 函数用于将格式化数据写入到标准输出; dprintf() fprintf() 函数用于将格式化数据写入到指定的文件中,两者不同之处在于,fprintf() 使用 FILE 指针指定对应的文件、而 dprintf() 则使用文件描述符 fd 指定
        对应的文件;sprintf() snprintf() 函数可将格式化的数据存储在用户指定的缓冲区 buf 中。

2、printf()函数

        前面章节内容编写的示例代码中多次使用了该函数,用于将程序中的字符串信息输出显示到终端(也就是标准输出),相信各位读者学习 C 语言时肯定用过该函数,它是一个可变参函数,除了一个固定参数 format外,后面还可携带 0 个或多个参数。
        函数调用成功返回打印输出的字符数;失败将返回一个负值!
        打印“Hello World ”:
printf("Hello World!\n");
打印数字 5
printf("%d\n", 5);

3、fprintf()函数

fprintf() 可将格式化数据写入到由 FILE 指针指定的文件中,譬如将字符串“ Hello World ”写入到标准错误:
fprintf(stderr, "Hello World!\n");
向标准错误写入数字 5
fprintf(stderr, "%d\n", 5);
函数调用成功返回写入到文件中的字符数;失败将返回一个负值!

4、dprintf()函数

dprintf() 可将格式化数据写入到由文件描述符 fd 指定的文件中,譬如将字符串“ Hello World ”写入到标准错误:
dprintf(STDERR_FILENO, "Hello World!\n");
向标准错误写入数字 5
dprintf(STDERR_FILENO, "%d\n", 5);
函数调用成功返回写入到文件中的字符数;失败将返回一个负值!

5、sprintf()函数

sprintf() 函数将格式化数据存储在由参数 buf 所指定的缓冲区中,譬如将字符串“ Hello World ”存放在缓冲区中:
char buf[100];
sprintf(buf, "Hello World!\n");
        当然这种用法并没有意义,事实上,我们一般会使用这个函数进行格式化转换,并将转换后的字符串存放在缓冲区中,譬如将数字 100 转换为字符串 "100" ,将转换后得到的字符串存放在 buf 中:
char buf[20] = {0};
sprintf(buf, "%d", 100);
sprintf() 函数会在字符串尾端自动加上一个字符串终止字符 '\0'
        需要注意的是,sprintf() 函数可能会造成由参数 buf 指定的缓冲区溢出,调用者有责任确保该缓冲区足够大,因为缓冲区溢出会造成程序不稳定甚至安全隐患!
函数调用成功返回写入到 buf 中的字节数;失败将返回一个负值!

6、snprintf()函数

        sprintf()函数可能会发生缓冲区溢出的问题,存在安全隐患,为了解决这个问题,引入了 snprintf() 函数;在该函数中,使用参数 size 显式的指定缓冲区的大小,如果写入到缓冲区的字节数大于参数 size 指定的大小,超出的部分将会被丢弃!如果缓冲区空间足够大,snprintf() 函数就会返回写入到缓冲区的字符数,与sprintf()函数相同,也会在字符串末尾自动添加终止字符'\0'
        若发生错误,snprintf() 将返回一个负值!
本小节内容到此结束。感谢。。。

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

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

相关文章

Comment(爆破+git泄漏+二次注入)

通过爆破密码的后三位&#xff0c;获得账号为&#xff1a;zhangwei666 F12查看控制台 使用bugscanteam的githack工具&#xff0c;下载泄漏的源码&#xff0c;根据控制台的提示&#xff0c;完整源码还在历史的commit中 git log –reflog 查看历史记录 查看最新的提交记录&#…

C++otlv4连接sql serveer使用记录(注意点)

C使用otlv4在做插入时&#xff0c;有一些设计的坑需要注意 插入数据&#xff1a; 当要给表中插入单个字符时&#xff0c;数据库表设计使用varchar(1)是合理的&#xff0c;但是otlv4一直报错char。 后续查很久才知道&#xff0c;otlv4所写的绑定的字符数组的长度应该实际数组…

2024又是一年的CSDN之旅-总结过去展望未来

一、前言 一年就这样在忙忙碌碌的工作和生活中一晃而过&#xff0c;总结今年在CSDN上发表的博客&#xff0c;也有上百篇之多&#xff0c;首先感谢CSDN这个平台&#xff0c;能让我有一个地方记录工作中的点点滴滴&#xff0c;也在上面学到了不少知识&#xff0c;解决了工作中遇到…

JDK长期支持版本(LTS)

https://blogs.oracle.com/java/post/the-arrival-of-java-23 jdk长期支持版本&#xff08;LTS&#xff09;&#xff1a;JDK 8、11、17、21&#xff1a;

大数据学习(37)- Flink运行时架构

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…

“AI 大模型内容安全审核软件系统:守护网络世界的卫士

在如今这个信息爆炸的互联网时代&#xff0c;网络上的内容那是五花八门、层出不穷。这时候&#xff0c;咱就得靠 AI 大模型内容安全审核软件系统来给咱把把关了。 咱就说社交媒体平台吧&#xff0c;每天都有海量的用户在上面发布文字、图片、视频啥的。要是没有一个靠谱的审核系…

pyspark连接clickhouse数据库的方式(其它数据库同样适用)

目录 一、背景简记二、pyspark连接clickhouse方式记录三、结语参考学习博文 一、背景简记 实际工作中&#xff0c;大部分所用的数据存储地址都是在数据库中&#xff0c;如我司现在常用的数据库是clickhouse&#xff0c;相关数据的统计分析都在此上操作。如果想用pyspark连接cl…

C 语言雏启:擘画代码乾坤,谛观编程奥宇之初瞰

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。* 这一课主要是让大家初步了解C语言&#xff0c;了解我们的开发环境&#xff0c;main函数&#xff0c;库…

nacos2.3.0 接入pgsql或其他数据库

首先尝试使用官方插件进行扩展&#xff0c;各种报错后放弃&#xff0c;不如自己修改源码吧。 一、官方解决方案 1、nocos 文档地址&#xff1a;Nacos 配置中心简介, Nacos 是什么 | Nacos 官网 2、官方解答&#xff1a;nacos支持postgresql数据库吗 | Nacos 官网 3、源码下载地…

随遇随记篇

vue 函数 unref() 获取原始值 ref 定义的属性 需要 .value 才能拿到值&#xff0c;unref 直接返回原始值&#xff1b;若属性不是ref 定义的&#xff0c;也是直接返回原始值&#xff1b; /* description: 是否必填*/required?: boolean | Ref<boolean>.....let value …

网站HTTP改成HTTPS

您不仅需要知道如何将HTTP转换为HTTPS&#xff0c;还必须在不妨碍您的网站自成立以来建立的任何搜索排名权限的情况下进行切换。 为什么应该从HTTP转换为HTTPS&#xff1f; 与非安全HTTP于不同&#xff0c;安全域使用SSL&#xff08;安全套接字层&#xff09;服务器上的加密代…

微软Win10 RP 19045.5435(KB5050081)预览版发布!

系统之家1月20日最新报道&#xff0c;微软面向Release Preview频道的Windows Insider项目成员&#xff0c;发布了适用于Windows10 22H2版本的KB5050081更新&#xff0c;更新后系统版本号将升至19045.5435。本次更新增加了对GB18030-2022标准的支持&#xff0c;同时新版日历将为…

从提供的 package.json 文件可以看出,项目已经集成了 vue-cli-service lint --fix,并且配置了相关的工具和脚本

文章目录 1. 确认 vue-cli-service lint 已集成2. 确认 lintOnSave 是否启用示例&#xff1a;vue.config.js 3. 确认 ESLint 配置4. 确认 Git 钩子配置5. 如何实现保存时自动修复&#xff08;1&#xff09;启用 lintOnSave&#xff08;2&#xff09;配置编辑器的 ESLint 插件&a…

2024年博客之星主题创作|Android 开发:前沿技术、跨领域融合与就业技能展望

目录 引言 一、推动 Android 应用创新的核心力量 1.1 人工智能与机器学习的崛起 1.2 增强现实&#xff08;AR&#xff09;与虚拟现实&#xff08;VR&#xff09;的应用扩展 1.3 5G技术的推动 1.4 跨平台开发技术的成熟 1.4.1 React Native 1.4.2 Flutter 1.4.3 Taro …

mac 安装mongodb

本文分享2种mac本地安装mongodb的方法&#xff0c;一种是通过homebrew安装&#xff0c;一种是通过tar包安装 homebrew安装 brew tap mongodb/brew brew upate brew install mongodb-community8.0tar包安装 安装mongodb 1.下载mongodb社区版的tar包 mongdb tar包下载地址 2…

Nvidia Blackwell架构深度剖析:深入了解RTX 50系列GPU的升级

在CES 2025上&#xff0c;英伟达推出了基于Blackwell架构的GeForce RTX 50系列显卡&#xff0c;包括RTX 5090、RTX 5080、RTX 5070 Ti和RTX 5070。一段时间以来&#xff0c;我们已经知晓了该架构的各种细节&#xff0c;其中许多此前还只是传闻。不过&#xff0c;英伟达近日在20…

抽奖系统(4——活动模块)

1. 活动创建 需求回顾 创建的活动信息包含&#xff1a; 活动名称活动描述关联的一批奖品&#xff0c;关联时需要选择奖品等级&#xff08;一等奖、二等奖、三等奖&#xff09;&#xff0c;及奖品库存圈选一批人员参与抽奖 tip&#xff1a;什么时候设置奖品数量和奖品等级&am…

Oracle 深入学习 Part 14:Managing Password Security and Resources(管理密码安全性和资源)

Profiles Profile 是一个以名称标识的集合&#xff0c;用于管理 密码 和 资源限制。 每个用户都对应一个profiles&#xff0c;可以通过 CREATE USER 或 ALTER USER 命令分配给用户。 Profiles 可以启用或禁用。 Profiles 可以关联到默认的 DEFAULT Profile。 密码管理&…

Qt 5.14.2 学习记录 —— 십칠 窗口和菜单

文章目录 1、Qt窗口2、菜单栏设置快捷键添加子菜单添加分割线和菜单图标 3、工具栏 QToolBar4、状态栏 QStatusBar5、浮动窗口 QDockWidget 1、Qt窗口 QWidget&#xff0c;即控件&#xff0c;是窗口的一部分。在界面中创建控件组成界面时&#xff0c;Qt自动生成了窗口&#xf…

计算机视觉模型的未来:视觉语言模型

一、视觉语言模型 人工智能已经从识别数据中的简单模式跃升为理解复杂的多模态数据。该领域的发展之一是视觉语言模型 (VLM) 的兴起。这类模型将视觉和文本之间联系起来,改变了我们理解视觉数据并与之交互的方式。随着 VLM 的不断发展,它们正在为计算机视觉设定一个新的水平…