嵌入式学习之文件IO和标准IO

IO概述

  • I/O是Input/Output的缩写,指的是输入/输出。在计算机科学和工程领域,I/O是指计算机系统与外部环境或内部组件之间进行数据交换的过程和机制。
  1. 用户I/O
  • 用户通过输入设备与计算机交互。例如,通过键盘输入文字、通过鼠标点击界面等。
  • 用户通过输出设备接收计算机的反馈。例如,显示器显示图像、打印机输出文件等。
  1. 文件I/O
  • 程序通过文件系统进行数据读写操作。例如,从硬盘读取文件数据、将数据写入文件等。
    • 计算机通过网络接口与其他计算机或设备进行数据交换。例如,通过互联网下载文件、发送和接收电子邮件等。
  1. 设备I/O
  • 计算机与各种外部设备之间进行数据传输。例如,读取USB存储设备的数据、与外部传感器通信等。

五层I/O模型概述

  • 五层I/O模型是计算机系统中用于描述数据从应用程序到物理硬件的传输过程的模型。这个模型帮助理解数据在不同层次上的处理方式,以及每一层在I/O操作中的角色。
  1. 应用层(Application Layer)
  2. 系统调用层(System Call Layer)
  3. 文件系统层(File System Layer)
  4. 设备驱动层(Device Driver Layer)
  5. 硬件层(Hardware Layer)

IO函数的定义

标准IO函数
  • 标准IO函数根据ANSI标准,对文件IO函数进行二次封装。例如:printf函数,scanf函数
  • 标准IO函数最终依然会去调用文件IO函数实现数据的输入输出,提高了代码的移植性。
  • 标准I/O函数通常使用缓冲区来临时存储数据。这些缓冲区可以是针对文件、标准输入、标准输出等的内存区域,用于暂时存储数据,以减少与文件或设备的直接交互次数,从而提高效率。
文件IO函数
  • 文件IO函数由操作系统提供的基本函数,与操作系统绑定,可移植性较低,又称为系统调用
  • 例如:读函数在Windows为ReadFile,在Linux中为read
  • 文件IO函数涉及到用户空间到内核空间切换,cpu模式切换,C代码调用汇编指令等等,属于一种耗时操作。应该尽量减少对文件IO函数的使用。
  • 若要直接操作内核,则必须要使用对应操作系统提供的系统调用函数。

标准IO函数

1. 流和指针

  • 流是一个数据传输通道,用于在程序和外部资源(如文件、网络、设备)之间移动数据。流以连续字节流的形式表示数据的输入和输出。
1. 流的分类
  • 标准流

    • stdin:标准输入流,用于从键盘或另一个程序的输出中读取数据。scanf,getchar,gets默认使用的都是stdin对应的缓冲区
    • stdout:标准输出流,用于向屏幕或另一个程序的输入中写入数据。puts,printf,putchar默认使用的都是stdout对应的缓冲区
    • stderr:标准错误流,用于输出错误消息到屏幕或日志文件。
  • 文件流

    通过fopen()函数打开文件时,会创建一个文件流,提供与文件的接口,用于进行文件的读写操作。

2.流指针
  • 流指针是一个指向FILE结构体的指针,用于标识和操作文件流。FILE结构体在C标准库中定义,包含有关文件流的信息,如文件描述符、缓冲区、当前位置等。
  • FILE结构体由系统定义并维护,包含文件流的状态信息。程序员无需手动管理FILE结构体,只需通过标准库函数进行访问和操作。

2.FILE结构体

  • ctags 是一个用于生成 C/C++ 等语言的标记文件的工具,这个文件可以帮助代码编辑器快速跳转到函数、变量、结构体的定义。
sudo apt-get install ctags
cd /usr/include
sudo ctags -R在 ~/.vimrc 文件中添加以下配置,以便 vim 使用生成的标记文件。
set tags+=/usr/include/tags
  • 查找
vi -t FILE输入对应的数字并回车以查看 typedef struct _IO_FILE FILE; 的定义。导航代码:
方法 1:将光标停留在要追踪的符号上,按下 Ctrl + ] 跳转到定义处。
方法 2:按下 Ctrl + 鼠标左键点击要追踪的内容。返回上层:
方法 1:按下 Ctrl + t 返回到之前的代码位置。
方法 2:按 Ctrl + 鼠标右键。
  • 查找结果
    在这里插入图片描述

3.man手册

  • man命令用于查看Linux系统中命令、函数和系统调用的详细文档,包括功能、参数、返回值及其他相关信息。
  • 第一章:可执行程序或Shell命令
    第二章:系统调用(内核提供的函数),如文件IO函数
    第三章:库调用(程序库中的函数),如标准IO函数
    范例
man 3 fwrite //在man手册的第二章查找fwrite函数

4. 标准流指针

  • 在main函数运行之前,操作系统为我们定义好了三个标准流指针,用于处理标准输入、输出和错误输出。
  1. FILE* stdin
    定义:标准输入流指针,通常与键盘输入缓冲区相关联。
    功能:向终端输入的数据会放入到stdin对应的缓冲区中。可以通过stdin读取终端数据。
    默认使用:scanf、getchar、gets默认使用的都是stdin对应的缓冲区。
  2. FILE* stdout
    定义:标准输出流指针,通常与屏幕输出缓冲区相关联。
    功能:希望输出到终端的数据会放入到stdout对应的缓冲区中。可以通过stdout将数据输出到终端。
    默认使用:printf、putchar、puts默认使用的都是stdout对应的缓冲区。
  3. FILE* stderr
    定义:标准错误输出流指针,通常与屏幕输出缓冲区相关联。
    功能:标准错误输出流指针是无缓冲的。缓冲区大小是1字节,因此无需任何刷新方式。
    用途:一般用于打印错误信息。防止缓冲区被错误阻塞,导致数据无法输出。perror函数通常使用stderr。

5. 标准IO函数

  1. fopen
功能
fopen函数用于打开一个文件,并返回一个指向FILE类型的指针,用于后续的文件操作。
原型#include <stdio.h>FILE *fopen(const char *pathname, const char *mode);
参数pathname:指定要打开的文件的路径及名称。mode:指定打开文件的方式,决定文件的读写权限和状态。
文件打开模式
r:以只读的方式打开文件。文件指针定位在文件开头。r+:以读写的方式打开文件。文件指针定位在文件开头。w:以只写的方式打开文件。文件指针定位在文件开头。如果文件不存在,创建新文件。如果文件存在,清空文件内容。w+:以读写的方式打开文件。文件指针定位在文件开头。如果文件不存在,创建新文件。如果文件存在,清空文件内容。a:以追加的方式打开文件。文件指针定位在文件末尾。如果文件不存在,创建新文件。数据将写入文件末尾。a+:以读写追加的方式打开文件。文件指针定位在文件末尾。读则在文件开头(初始位置)//读指针和写指针为同一个如果文件不存在,创建新文件。数据将写入文件末尾。成功:返回指向FILE对象的指针。
失败:返回NULL,并设置errno以指示错误类型。
  1. perror
  • 功能:根据errno打印对应的错误信息;
  • 原型:#include<stdio.h>
    void perror(const char* s );
  • 参数:
    char* s:用于提示的字符串;一般填写报错的函数名字。 在这里插入图片描述
  1. fclose
功能:关闭文件,释放各种资源:缓冲区资源,文件描述符资源
原型: #include<stdio.h>int fclose(FILE *stream);
参数:	FILE* stream指定要啊关闭的文件对应的流指针
返回值:成功返回0失败,返回EOF-1),更新errno

在这里插入图片描述

  1. fprintf
功能:将数据格式化输出到指定文件中
原型 #include <stdio.h>// int printf(const char *format, ...);//printf("hello %d%c%f%s%g \n\t\b\r", 10, 'a', 3.14, "abc", 2.1);int fprintf(FILE *stream, const char *format, ...);
参数:FILE *stream:指定要输出到哪个文件中,就填上文件对应的流指针。该流指针用写的方式打开;char *format:输入到文件中的内容;格式化字符串,其中可以填字符,可以填占位符,可以填转义字符......:不定参数,不定数据类型,不定数据个数,跟着前面的参数来决定。
返回值:成功,返回成功被打印的字符个数;失败,返回负数。
  1. fscanf
功能:从指定文件中格式化读取数据
原型:#include<stdio.h>int fscanf(FILE* stream,const char* format,...);
参数: FILE* stream 指定从文件中读取数据。char *format:格式化字符串,指定如何读取输入数据,包含格式说明符。...:可变参数列表,提供一个或多个指针,用于存储读取到的数据。
返回值:>0,成功,返回成功读取到的字符个数EOF,当前文件读取完成EOF,当前函数运行失败,返回EOF,更新errno;注意事项
在使用scanf和fscanf函数时,需要注意它们对空白字符的处理行为。默认情况下,格式说明符%d、%f和%s会忽略输入中的空格、制表符(\t)和换行符(\n),并在遇到空白字符时停止读取。
例如,%d和%f用于读取整数和浮点数时,会跳过所有初始空白字符,直到遇到有效的数字;%s用于读取字符串,会跳过初始空白字符并读取字符,直到遇到下一个空白字符停止。
而%c格式说明符则不同,它不会忽略空白字符,包括空格、制表符和换行符,所有字符都被视为有效输入。这意味着当使用%c读取字符时,即使输入是空白字符,程序也会将其读入。
因此,在读取单个字符时,尤其是在读取前有其他输入操作时,通常需要调用getchar()以吸收前一个输入中的换行符,防止影响字符的读取结果。了解这些细节有助于更准确地处理输入数据,避免在处理用户输入时出现意外行为。

在这里插入图片描述

  1. fputs和fputc
fputs功能:将字符串输出到指定的文件中; 
fputc功能:将单个字符输出到指定的文件中; 
原型:#include <stdio.h>int fputs(const char *s, FILE *stream);     ---》不会自动换行int fputc(int c,FILE *stream);int puts(const char *s);     ---》会自动打印换行
参数:char *s:指定要输出的字符串的首地址;FILE *stream:;
返回值:成功,返回非负数;失败,返回EOF;fputs("abcd", fp);fputs("1234", fp);
  1. fgets和fgetc
fgets功能:从指定文件中获取字符串
fgetc功能:从指定文件中获取单个字符,会获取空格,会获取制表符,会获取\n字符,且拿完\n字符后会停止读取。在fgets停止读取后,会在读取到的有效字符的后一个位置补\0
原型:#include <stdio.h>char *fgets(char *s, int size, FILE *stream);int fgetc(FILE *stream); //成功则返回读取到的字符对应的整型形式,失败或读取完时,返回EOFchar *gets(char *s);     char str[20];  gets(str);
参数:char *s:该指针指向的空间中会存储获取到的字符串;int size:指定要获取多少个字节; 最多只获取size-1个字节,且在停止获取数据后会自动在获取到的最后一个字符后面补'\0',确保获取到的肯定是字符串。FILE *stream: ;
返回值:成功,返回存储字符串的空间地址。失败,返回NULL;文件读取完毕,且没有任何数据再被读出来时,返回NULL

在这里插入图片描述

  1. fwrite
功能:将数据的二进制形式写入到文件中. 二进制文件:将数据拆分成单个字节,将每个字节转换成对应的字符形式写入到文件中
原型:#include <stdio.h>size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
参数:void *ptr:指定要输出的数据的首地址。void*类型:万能指针,代表可以输出任意类型的数据。size_t size:每个数据所占字节大小size_t nmemb:共输出多少个数据。总之,总输出的字节大小:size*nmemb;int arr[3] ==> size:4   nmemb:31         1212        1FILE *stream:;
返回值:成功,返回成功输出的数据个数;失败,返回<nmemb,或者等于0
  1. fread
功能:从二进制文件中读取数据。还原回指定类型的数据 
原型:#include <stdio.h>size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
参数:void *ptr:该指针指向的内存空间存储读取到的数据;size_t size:每个数据所占字节大小size_t nmemb:共读取多少个数据。总之,总读取的字节大小:size* nmemb; 建议:以1为单位读取n个数据,因为任何数都是1的倍数。避免最后一次剩余的数据不是size的倍数,从而导致最后一次读取数据失败。如下图示例代码所示:FILE *stream;
返回值:成功,返回成功读取到的字节数;失败,返回小于nmemb,或者等于0

在这里插入图片描述

  1. fseek
功能:修改文件偏移量到指定位置;
原型:#include <stdio.h>int fseek(FILE *stream, long offset, int whence);
参数:FILE *stream:指定要修改哪个文件偏移量;long offset:距离whence偏移多少。向文件开头位置偏移,填负数。向文件结尾位置偏移填正数。int whence:SEEK_SET:文件开头位置,SEEK_CUR:文件当前位置, SEEK_END:文件结尾位置。
返回值:成功,返回0;失败,返回-1;         
功能:将偏移量修改到开头。void rewind(FILE *stream); ===>  fseek(fp, 0, SEEK_SET);long ftell(FILE *stream);
  1. ftell
功能:获取文件当前位置距离开头的偏移量;
原型:#include <stdio.h>long ftell(FILE *stream);
参数:FILE *stream:;
返回值:成功,返回文件当前位置距离开头的偏移量;失败,返回-1,更新errno;
计算文件大小:        fseek(fp, 0, SEEK_END);long size=ftell(fp);

缓冲区

  • 只有标准IO函数有缓冲区
  1. 全缓冲
  • 缓冲区操作对象: 手动用fopen函数打开,得到的缓冲区都是全缓冲。由FILE结构体指针维护
  • 缓冲区大小 4096bytes = 4k
 fputc('a', fp);//操作系统优化,如果只申请不使用,不会真正申请缓冲区printf("%ld\n", fp->_IO_buf_end - fp->_IO_buf_base);  //4096bytes  
  • 刷新缓冲区方式
    i . 缓冲区满:需要多循环一次,才能将前4096个数据刷新出去。第4097个依然放在缓冲区中
    ii. 强制刷新缓冲区:fflush函数
       #include <stdio.h>int fflush(FILE *stream);
fflush(fp);

iii.调用fclose关闭流指针。
iv.程序正常退出。main函数调用return退出
v.调用exit函数退出程序。
功能:目前只需要知道该函数能够将整个程序结束即可。

      #include <stdlib.h>void exit(int status);
参数:int status:目前随便填一个整数即可;exit(0);    
  1. 行缓冲
    1.缓冲区操作对象
    stdin(标准输入流指针) stdout(标准输出流指针)
    2.缓冲区大小
    1024bytes = 1k
    b.printf(“%ld\n”, stdout->_IO_buf_end - stdout->_IO_buf_base);
    3.刷新缓冲区方式

a.缓冲区满:需要多循环一次,才能将前1024个数据刷新出去。第1025个依然放在缓冲区中
b.遇到\n字符刷新。
c.强制刷新缓冲区:fflush函数

    #include <stdio.h>int fflush(FILE *stream);
fflush(fp);
fflush(stdout);

d.调用fclose关闭流指针。
e.程序正常退出。main函数调用return退出
f.调用exit函数退出程序。
g.输入输出转换。
功能:目前只需要知道该函数能够将整个程序结束即可。

      #include <stdlib.h>void exit(int status);
参数:int status:目前随便填一个整数即可;exit(0);    
  1. 无缓冲
    1.缓冲区操作对象
    a. stderr(标准错误输出流指针) -->perror函数
    2.缓冲区大小
    a.1bytes。但是不需要任何刷新方式。

时间相关的函数

1)time

功能:获取1970-1-1日至今的秒数;
原型:#include <time.h>time_t time(time_t *tloc);
参数:time_t *tloc:若该指针不为空,则返回值同样会被存储到该指针指向的内存空间中;     
返回值:返回1970-1-1日至今的秒数;失败,返回((time_t) -1),更新errno;方法1time_t t;time(&t);     可以从参数获取
方法2time_t t2=time(NULL);可以通过返回值获取

2)localtime

功能:将秒数转换成日历格式
原型:#include <time.h>struct tm *localtime(const time_t *timep);
参数:time_t *timep:该指针指向的空间存储着要转换成日历格式的秒数;
返回值:成功,返回struct tm*类型指针失败,返回NULL;更新errno;struct tm {int tm_sec;    /* Seconds (0-60) */int tm_min;    /* Minutes (0-59) */int tm_hour;   /* Hours (0-23) */int tm_mday;   /* Day of the month (1-31) */int tm_mon;    /* Month (0-11) */=tm_mon+1int tm_year;   /* Year - 1900 */=tm_year+1900int tm_wday;   /* Day of the week (0-6, Sunday = 0) */     星期int tm_yday;   /* Day in the year (0-365, 1 Jan = 0) */    一年的第几天};

在这里插入图片描述

文件IO函数

  • 文件IO由操作系统提供的基本函数,与操作系统绑定,又称之为系统调用
  • 文件IO是没有缓冲区的。
  • 文件IO函数是通过文件描述符来维护一个文件的。
  1. 文件描述符概念
  • 当尝试打开一个文件的时候,系统会自动给这个文件分配一个编号,通过这个编号可以来描述这个文件。该编号称之为文件描述符。
  • 标准IO是对文件IO函数的二次封装,在文件IO的基础上封装了一个缓冲区,同时会将文件描述符及操作缓冲区的指针一起封装到FILE结构体中。标准IO通过流指针就可以操作文件。
  • 文件IO函数,是通过文件描述符操作文件的。
  • 文件描述符的范围是**[0, 1023]**,共1024个,文件描述符的总量是有上限的,在不使用的情况下一定要关闭!!!文件描述符的总量是可以通过修改Linux的配置文档进行修改的,但是一般不动
  • 文件描述符分配原则:从小到大,依次遍历没有被占用的文件描述符。
    在这里插入图片描述
  • 特殊的文件描述符
特殊的流指针(FILE*)特殊的文件描述符
FILE* stdinstdin->_fileno0
FILE* stdoutstdout->_fileno1
FILE* stderrstderr->_fileno2
  1. 文件描述符个数的计算
  • getdtablesize()函数可以直接计算
    在这里插入图片描述

文件IO函数的使用

  1. open
功能:打开一个文件,获得文件描述符;
原型:#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);
参数:char *pathname:指定要打开的文件对应的路径以及名字;int flags:打开方式O_RDONLY:只读方式, O_WRONLY:只写,O_RDWR:读写----- 以上三种必须,且只能包含一种----O_CREAT:创建,若文件不存在,则创建一个普通文件O_TRUNC:清空,若文件存在,且是一个普通文件,且用写的方式打开文件,则会清空文件O_APPEND:追加。     w:O_WRONLY|O_CREAT|O_TRUNCmode_t mode:指定文件创建时候的权限。如果flags中没有O_CREAT或者O_TEMPFILE则mode选项忽略。
返回值:成功,返回新的文件描述符;失败,返回-1,更新errno;

在这里插入图片描述
2. close

功能:关闭文件
原型:#include <unistd.h>int close(int fd);
参数:int fd:指定要关闭的文件对应的文件描述符;
返回值:成功,返回0;失败,返回-1,更新errno;

在这里插入图片描述
3. write

功能:将数据的二进制形式写入到文件中。例如int a=97,写入到文件中a^@^@^@原型:#include <unistd.h>ssize_t write(int fd, const void *buf, size_t count);
参数:int fd:指定要将数据写入到哪个文件中,就填那个文件对应的文件描述符;void *buf:指定要输出的数据的首地址。void*类型:可以输出任意类型数据;size_t count:指定要输出的数据总大小,以字节为单位。
返回值:成功,返回成功输出的字节数,ssize_t--long int失败,返回-1,更新errno;
  1. read
功能:从指定文件中读取数据;  read函数不会自动补充\0。
原型:#include <unistd.h>ssize_t read(int fd, void *buf, size_t count);
参数:int fd:指定从哪个文件中读取数据,就填那个文件对应的文件描述符;void *buf:指定要将读取到的数据存储到什么位置。void*类型:可以读取任意类型数据;size_t count:指定要读取的数据总大小,以字节为单位;
返回值:>0, 成功读取到的数据个数;=0, 文件读取完毕;=-1,函数运行失败,更新errno; 

在这里插入图片描述

  1. lseek
  • 功能:修改文件偏移量,同时获取修改后的位置距离文件开头的偏移量。
头文件#include <sys/types.h>#include <unistd.h>函数原型off_t lseek(int fd, off_t offset, int whence);
参数int fd: 文件描述符。off_t offset: 距离 whence 指定的位置偏移多少个字节;往文件结尾方向偏移,填正数。往文件开头方向偏移填负数。int whence: 位置参数,可以是以下之一:SEEK_SET: 文件开头。SEEK_CUR: 文件当前位置。SEEK_END: 文件结尾。
返回值成功:返回修改后的位置距离文件开头的偏移量。失败:返回 (off_t) -1,并更新 errno。

文件属性相关函数

头文件#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>
原型int stat(const char *path, struct stat *buf);*const char path: 文件路径。*struct stat buf: 存储文件属性信息的结构体指针。
返回值成功:返回 0。失败:返回 -1,并设置 errno。
  • struct stat 结构体(用vi -t 查)
struct stat {dev_t     st_dev;     // 文件所在设备的IDino_t     st_ino;     // 节点号mode_t    st_mode;    // 文件的类型和权限nlink_t   st_nlink;   // 硬链接数uid_t     st_uid;     // 所有者的用户IDgid_t     st_gid;     // 所有者的组IDdev_t     st_rdev;    // 设备ID(如果是特殊文件)off_t     st_size;    // 文件大小(以字节为单位)blksize_t st_blksize; // 文件系统I/O块大小blkcnt_t  st_blocks;  // 分配给文件的块数time_t    st_atime;   // 最近一次访问时间time_t    st_mtime;   // 最近一次修改时间time_t    st_ctime;   // 最近一次状态改变时间
};

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

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

相关文章

图片怎么裁剪成想要的尺寸?图片裁剪的几个常用方法

裁剪图片到精准且令人满意的尺寸&#xff0c;是每一位图像编辑爱好者、社交媒体达人以及专业设计师在日常工作中不可或缺的技能。在这个视觉为王的时代&#xff0c;一张完美适配各种平台的图片&#xff0c;能够瞬间抓住观众的眼球&#xff0c;传递出最精准的信息与情感。从手机…

Vue3项目创建及相关配置

Vue是一种用于构建用户界面的JavaScript框架。它采用了一种称为MVVM&#xff08;Model-View-ViewModel&#xff09;的架构模式。 MVVM是一种将用户界面与业务逻辑和数据分离的设计模式。它包括三个部分&#xff1a; Model&#xff08;模型&#xff09;&#xff1a;表示应用程序…

混合现实技术在虚拟培训、销售展示及教育科研等领域的应用方向

混合现实技术是虚拟现实技术的进一步发展方向&#xff0c;与传统的沉浸式虚拟现实技术相比混合现实技术能够为用户提供更多元化的观看场景。通过将虚拟物体与现实世界融合的全新形式为&#xff0c;包括虚拟训练、产品销售、教育科研等领域赋能。 混合现实技术中最为重要的是显示…

【JUC】并发编程与源码分析 1-7章

1 线程基础知识复习 1把锁&#xff1a;synchronized&#xff08;后面细讲&#xff09; 2个并&#xff1a; 并发&#xff08;concurrent&#xff09;&#xff1a;是在同一实体上的多个事件&#xff0c;是在一台机器上“同时”处理多个任务&#xff0c;同一时刻&#xff0c;其…

程序员保碗之策

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 1. **持续深化技术实力&#xff1a;从基础到前沿**夯实基础紧跟技术前沿跨领域融合 2. **提升实战能力&#xff1a;从项目到产品**参与实际项目自主实践产品思维 3. **建立个人品牌与影响力&#xff…

vs+qt一些问题

一直遇到的两个问题&#xff0c;今天解决了 1、 因为前后端分离&#xff0c;前端写完了&#xff0c;后端还在一直修改&#xff0c;但是每次都是单独打开的后端的sln&#xff0c;所以会出现这个&#xff0c;把前端的模块删掉就好了。 2、打开vs项目&#xff0c;很多报错&#…

sql注入靶场sqli-labs常见sql注入漏洞详解

目录 sqli-labs-less1 1.less1普通解法 1.在url里面填写不同的值&#xff0c;返回的内容也不同&#xff0c;证明&#xff0c;数值是进入数据库进行比对了的&#xff08;可以被注入&#xff09; 2.判断最终执行的sql语句的后面还有内容吗&#xff0c;并且能够判断是字符型的拼接…

MySQL:VIEW视图

概述 MySQL 视图&#xff08;View&#xff09;是一种虚拟存在的表&#xff0c;同真实表一样&#xff0c;视图也由列和行构成&#xff0c;但视图并不实际存在于数据库中。行和列的数据来自于定义视图的查询中所使用的表&#xff0c;并且是在使用视图时动态生成的。 数据库中只…

Unity物理模块 之 2D效应器

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​ 1.什么是效应器 2D 效应器 - Unity 手册 2D 效应器是与 2D 碰撞器一起使用的组件&#xff0c;相当于预先编写好的插…

⭕️【论文阅读】《Interactive Class-Agnostic Object Counting》

[2309.05277] Interactive Class-Agnostic Object Counting (arxiv.org) code&#xff1a; cvlab-stonybrook/ICACount: [ICCV23] Official Pytorch Implementation of Interactive Class-Agnostic Object Counting (github.com) 目录 Abstract Abstract 我们提出了一个新…

【合并 K 个升序链表】python刷题记录

R4-分治篇 目录 最小堆方法 分治法 ps: 如果只是数组就很好处理了 # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def mergeKLists(self, lists…

Spring AOP 源码剖析

一.AOP基础概念 切面&#xff08;Aspect&#xff09;&#xff1a;切面是跨越多个类的关注点模块化&#xff0c;如事务管理。切面由切点和通知组成。连接点&#xff08;Join Point&#xff09;&#xff1a;在程序执行过程中某个特定的点&#xff0c;如方法调用或异常抛出。在Sp…

kafka基础概念二

1.Kafka中主题和分区的概念 1.主题Topic 主题-topic在kafka中是一个逻辑的概念&#xff0c;kafka通过topic将消息进行分类。不同的topic会被订阅该topic的消费者消费 但是有一个问题&#xff0c;如果说这个topic中的消息非常非常多&#xff0c;多到需要几T来存&#xff0c;因…

区块链的搭建和运维4

区块链的搭建和运维4 (1) 搭建基于MySQL分布式存储的区块链 1.构建单群组网络节点 使用开发部署工具构建单群组网络节点&#xff0c;命令如下&#xff1a; bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,85452. 启动 MySQL 并设置账户密码 输入如下命令&#xff0c;…

关于Git使用不成功的问题解决方案记录

关于Git使用不成功的问题解决方案记录 前言代理连接不成功总结 前言 项目中建立了Git小仓库&#xff0c;但是在使用中出现了无法push新的代码&#xff0c;显示端口出现问题&#xff0c;发现网站和端口都没有问题&#xff0c;可以打开网站。但是还是连接失败&#xff0c;无法下…

MySQL笔记(十):MySQL管理

一、用户管理 #用户管理 -- 原因&#xff1a;当我们做项目开发时&#xff0c;可以根据不同的开发人员&#xff0c;赋给她相应的mysql操作权限。 -- 所以&#xff0c;mysql数据库管理人员&#xff08;root&#xff09;&#xff0c;根据需要创建不同的用户&#xff0c;赋给相应的…

android中打包apk体积优化方案

1.在配置文件AndroidManifest中新增 android:extractNativeLibs"true" 2.在模块build文件下配置支持的cpu,一般配置64的就行了,多配一种so库体积大一倍&#xff0c;择优。 ndk { abiFilters arm64-v8a } 3.在模块builde文件下配置混淆除去无用的资源文件 注:三种…

【Kubernetes】Deployment 的状态

Deployment 的状态 Deployment 控制器在整个生命周期中存在 3 3 3 种状态&#xff1a; 已完成&#xff08;Complete&#xff09;进行中&#xff08;Progressing&#xff09;失败&#xff08;Failed&#xff09; 通过观察 Deployment 的当前特征&#xff0c;可以判断 Deploym…

Win32注册表操作

注册表的概念 注册表是一个存储计算机配置信息的数据库&#xff0c;用于存储计算机上的硬件、安装的软件、系统设置以及用户账户配置等重要信息。对注册表的编辑不当可能会影响计算机的正常运行。应用程序可以调用API函数来对注册表进行增、删等操作。 注册表结构 运行Regedi…

Linux学习笔记:Linux基础知识汇总(个人复习版)

常用命令&#xff1a; 1、ls -a&#xff1a;显示所有文件&#xff08;包括隐藏文件&#xff09;&#xff0c;简洁版 -l&#xff1a;显示所有文件&#xff0c;详细版 -R&#xff1a;显示所有文件以及子目录下文件&#xff0c;简洁版 可以搭配使用。 2、netstat -i&#x…