当前位置: 首页 > news >正文

C语言 —— 指尖跃迁 刻印永恒 - 文件操作

目录

1. 什么是文件

1.1 程序文件

1.2 数据文件

1.3 文件名 

2. 二进制文件和文本文件

3. 文件的打开与关闭

3.1 流和标准流

3.2 文件指针

3.3 文件的打开与关闭

fopen 

fclose

4. 文件的顺序读写

4.1 fgetc和fputc 

 fgetc

fputc

4.2 fgets和fputs

fgets

fputs 

4.3 scanf / fscanf / sscanf

scanf 

fscanf

sscanf

4.4 printf / sprintf / fprintf

printf

fprintf

 sprintf

4.5 fread和fwrite

fread

fwrite

5. 文件的随机读写

fseek

ftell

rewind

6. 文件读取结束的判定

7. 文件缓冲区


1. 什么是文件

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

        
但是在程序设计中,我们⼀般谈的文件有两种:程序文件、数据文件

1.1 程序文件

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

1.2 数据文件

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

1.3 文件名 

⼀个文件要有⼀个唯⼀的文件标识(文件标识常被称为文件名),以便用户识别和引用,文件名包含3部分:文件路径 + 文件名主干 + 文件后缀

例如: c:\code\test.txt

c:\code\:表示文件路径      test:表示文件名主干      .txt:表示文件后缀


2. 二进制文件和文本文件

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

        

二进制文件二进制文件就是把内存中的数据按其在内存中存储的形式原样存储在磁盘上

        

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

 

数据在内存中如何存储呢?

        

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

        

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

#include<stdio.h>
#include<stdlib.h>
int main()
{int a = 100;FILE* pa = fopen("text.txt", "wb");fwrite(&a, 4, 1, pa);fclose(pa);pa == NULL;return 0;
}


3. 文件的打开与关闭

        

3.1 流和标准流

我们从键盘输入数据,向屏幕上输出数据,并没有打开流呢?那是因为C语言程序在启动的时候,默认打开了3个流:

        

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

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

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

        

头文件为:

        

#include<stdio.h>

stdin、stdout、stderr 三个流的类型是: FILE* ,通常称为文件指针

        
C语言中,就是通过 FILE* 的文件指针来维护流的各种操作的
 

3.2 文件指针

文件类型指针简称件指针

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名FILE

我们可以在编译环境提供的 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*pf;

定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)

        

通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件

3.3 文件的打开与关闭

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

        

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

        

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

fopen 

fopen文档链接:

        

fopen - C++ Referencehttps://legacy.cplusplus.com/reference/cstdio/fopen/?kw=fopen

//打开⽂件
FILE * fopen ( const char * filename, const char * mode );

其功能是使用给定的模式 mode 打开 filename 所指向的文件。文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回 NULL,并把错误代码存在 error 中

fclose

fclose文档链接:

        

fclose - C++ Referencehttps://legacy.cplusplus.com/reference/cstdio/fclose/?kw=fclose

//关闭⽂件
int fclose ( FILE * stream );

返回值如果流成功关闭,fclose 返回 0,否则返回EOF(-1)(如果流为NULL,而且程序可以继续执行,fclose设定error number给EINVAL,并返回EOF)

当时用"w"、"wb"、"w+"、"wb+"这些打开方式时会清除文件原本存储的数据 

/* fopen fclose example */
#include <stdio.h>
int main()
{FILE* pFile;//打开⽂件pFile = fopen("myfile.txt", "w");//⽂件操作if (pFile != NULL){fputs("fopen example", pFile);//关闭⽂件fclose(pFile);}return 0;
}


4. 文件的顺序读写

4.1 fgetc和fputc 

 fgetc

fgetc文档链接:

        

fgetc - C++ Referencehttps://legacy.cplusplus.com/reference/cstdio/fgetc/?kw=fgetc

int fgetc ( FILE * stream );

从文件指针stream指向的文件中读取一个字符,该字符的ASCII值作为函数的返回值,读取一个字节后光标向后移一个字节,若返回值为EOF,说明文件结束,EOF是文件结束标志,值为-1 

int main()
{FILE* pb = fopen("text.txt", "r");//为输入打开一个文本文件if (pb == EOF)//判断是否打开成功{perror("fopen");return 1;}int ch = 0;while ((ch = fgetc(pb)) != EOF)//判断是否成功输入数据{printf("%c", ch);//成功读取则将外部文件中的数据输入到程序中}printf("\n");fclose(pb);//关闭文件pb == NULL;//将pb置为空指针return 0;
}

fputc

fputc文档链接:

        

fputc - C++ Referencehttps://legacy.cplusplus.com/reference/cstdio/fputc/?kw=fputc

int fputc ( int character, FILE * stream );

返回值:

        

在正常调用情况下,函数返回写入文件的字符的ASCII码值,出错时,返回EOF(-1)。当正确写入一个字符或一个字节的数据后,文件内部写指针会自动后移一个字节的位置

int main()
{FILE* pa = fopen("text.txt", "w");//打开文件,打开方式为输出数据wif (pa == NULL)//判断是否打开成功{perror("fopen");return 1;}for (int i = 0; i < 26; i++)//成功打开后则把程序中的数据输出到外部文件中{int ret = fputc('a' + i, pa);printf("%c", ret);}//判断是否关闭文件成功if (fclose(pa) == EOF){perror("fclose");return 1;}pa == NULL;//将pa置为空指针,防止野指针return 0;

4.2 fgets和fputs

 

fgets

fgets文档链接:

        

fgets - C++ Referencehttps://legacy.cplusplus.com/reference/cstdio/fgets/?kw=fgets

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

从指定的流 stream 读取一行(每次最多只能从文件中读取一行内容,因为 fgets遇到换行符就结束读取,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时或者读取到换行符时又或者到达文件末尾时,它会停止,具体视情况而定

        

如果文件中的该行,不足n-1个字符,则读完该行就结束。如若该行(包括最后一个换行符)的字符数超过n-1,则fgets只返回一个不完整的行

返回值:

        

1. 如果成功,该函数返回str的头指针

        

2. 如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针

        

3. 如果发生错误,返回一个空指针

int main()
{FILE* pc = fopen("text.txt", "r");//为了输入数据打开文件if (pc == NULL)//判断是否打开成功{perror("fopen");return 1;}char arr[30] = { 0 };//创造数组//将读取到的字符串串存储到arr指向的字符串内,如果外部文件中有两行字符串,只需再读取一次fgets(arr, 26 + 1, pc);puts(arr);             //打印字符串fclose(pc);//关闭文件pc = NULL;//置为空指针return 0;
}

fputs 

fputs文档链接:

        

fputs - C++ Referencehttps://legacy.cplusplus.com/reference/cstdio/fputs/?kw=fputs

int fputs ( const char * str, FILE * stream );str:一个数组,包含了要写入的以空字符终止的字符序列stream:指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符串的流

函数功能是向指定的文件写入一个字符串(不自动写入字符串结束标记符‘\0’),成功写入一个字符串后,文件的位置指针会自动后移

        

该函数返回一个非负值,如果发生错误则返回 EOF(-1)

int main()
{FILE* pd = fopen("1.txt", "w");//为了将程序中的数据输入到外部文件,打开文件if (pd == NULL)//判断{perror("fopen");return 1;}char arr[20] = "sjjwdjtmkadkiana";//创建数组if ((fputs(arr, pd)) == EOF)//判断是否输入成功{perror("fputs");return 1;}if (fclose(pd) == EOF)//判断是否关闭成功{perror("fclose");return 1;}pd = NULL;return 0;
}

4.3 scanf / fscanf / sscanf

函数功能
scanf从标准输入流上读取格式化的数据
fscanf从指定的输入流上读取格式化的数据
sscanf在字符串中读取格式化的数据

         

scanf 

scanf文档链接:

        

cplusplus.com/reference/cstdio/scanf/https://cplusplus.com/reference/cstdio/scanf/

int scanf ( const char * format, ... );

 

函数的第一个参数是格式字符串,它指定了输入的格式,并按照格式说明符解析输入对应位置的信息并存储于可变参数列表中对应的指针所指位置

        

每一个指针要求非空,并且与字符串中的格式符一一顺次对应

fscanf

fscanf文档链接:

        

fscanf - C++ Referencehttps://legacy.cplusplus.com/reference/cstdio/fscanf/?kw=fscanf        

fscanf:从指定的输入流上读取格式化的数据

int fscanf ( FILE * stream, const char * format, ... );stream:要读取的文件指针,可以是标准输入流stdin、文件指针或者其他已经打开的文件流format:格式控制字符串,指定了要读取的数据的格式和顺序...:可变参数列表,用于接收读取的数据

fscanf其功能为根据数据格式(format),从输入流(stream)中读入数据,存储到...中,遇到空格和换行时结束,这与fgets有区别,fgets遇到空格不结束

int main()
{FILE* pb = fopen("text.txt", "r");//打开文件//判断是否打开成功if (pb == NULL)                   {perror("fopen1");return 1;}char b = 0; char arr[10] = { 0 };//从文件流中读取数据格式化后分别放到b和arr中fscanf(pb, "%c\n%s", &b, arr);    printf("%c\n", b);                   printf("%s", arr);fclose(pb);                        pb = NULL;                         return 0;
}

sscanf

sscanf文档链接:

        

sscanf - C++ Referencehttps://legacy.cplusplus.com/reference/cstdio/sscanf/?kw=sscanf        

sscanf:在字符串中读取格式化的数据

 

int sscanf ( const char * s, const char * format, ...);str:要解析的字符串      format:格式字符串      ...:可变参数列表,用于接收解析后的数据

 返回值函数将返回成功赋值的字段个数,失败返回0 ,否则返回格式化的参数个数

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>int main()
{char arr[] = "kiana";char arr1[10] = { 0 };//从字符串arr中读取数据放入arr1中sscanf(arr, "%s", arr1);printf("%s\n", arr1);int n = 0;sscanf("kiana 1134", "%s %d", arr1, &n);printf("%s %d", arr1, n);return 0;
}

sscanf的优点:

        

sscanf函数可以根据格式字符串的规则解析不同类型的数据,具有很高的灵活性

        

在使用sscanf函数时,要确保格式字符串与要解析的数据格式匹配,否则可能会导致解析错误或未定义的行为

        

需要注意的是,sscanf函数只会从字符串中解析数据,不会对字符串进行修改

4.4 printf / sprintf / fprintf

函数功能
printf      把数据以格式化的形式打印在标准输出流上
fprintf把数据以格式化的形式打印在指定的输出流上
sprintf把格式化的数据转化成字符串

printf

printf文档链接:

        

printf - C++ Referencehttps://legacy.cplusplus.com/reference/cstdio/printf/?kw=printf        

printf:把数据以格式化的形式打印在标准输出流上

int printf ( const char * format, ... );

fprintf

fprintf文档链接:

        

fprintf - C++ Referencehttps://legacy.cplusplus.com/reference/cstdio/fprintf/?kw=fprintf        

fprintf:把数据以格式化的形式打印在指定的输出流上

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

函数功能:根据指定的格式(format),向输出流(比如文件流)写入数据

        

返回值:如果写入文件成功,则返回写入的总字符数,如果写入文件失败,则返回负值

int main()
{FILE* pa = fopen("text.txt", "w");if (pa == NULL){perror("fopen");return 1;}char arr[] = "kiana";int a = 10;//把格式化数据输出到文件中fprintf(pa, "%s %d", arr, a);fclose(pa);pa == NULL;return 0;
}

 sprintf

sprintf文档链接:

        

sprintf - C++ Referencehttps://legacy.cplusplus.com/reference/cstdio/sprintf/?kw=sprintf        

sprintf:把格式化的数据转化成字符串

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

函数功能是把格式化的数据写入某个字符串中,即发送格式化输出到 str 所指向的字符串 

返回值:

        

如果成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符

        

如果失败,则返回一个负数

int main()
{char arr[] = "kianachuji";int num = 20;char arr1[20] = { 0 };sprintf(arr1, "%s %d", arr, num);//把格式化的数据存放到arr1中puts(arr1);//打印arr1return 0;
}

4.5 fread和fwrite

fread

fread文档链接:

        fread - C++ Referencehttps://legacy.cplusplus.com/reference/cstdio/fread/?kw=fread        

如果我们想要读取多行内容,就可以使用fread函数

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

函数功能从给定输入流stream读取最多count个对象存储到指针ptr指向的数组中,每个对象size个字节,该函数以二进制形式对文件进行操作,不局限于文本文件

返回值

        

返回成功读取的对象个数,若出现错误或到达文件末尾,则可能小于count

        

若size或count为零,则fread返回零且不进行其他动作

        

fread不区分文件尾和错误,因此调用者必须用feof和ferror才能判断发生了什么

fwrite

fwrite文档链接:

        

fwrite - C++ Referencehttps://legacy.cplusplus.com/reference/cstdio/fwrite/?kw=fwrite

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

函数功能把ptr指向的数组中的数据存储count个size字节的数据到输出流stream中,该函数以二进制形式对文件进行操作,不局限于文本文件

返回值:

        

如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型

        

如果该数字与num参数不同,则会显示一个错误

int main()
{FILE* pa = fopen("1.txt", "wb");//以输出二进制数据打开文件int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//输入5个整型放在文件流中fwrite(arr, sizeof(arr), 5, pa);fclose(pa);pa == NULL;FILE* pb = fopen("1.txt", "rb");//以读取二进制数据打开文件int arr1[10] = { 0 };//从文件中读取三个整形存储到arr1中fread(arr1, 4, 3, pb);for (int i = 0; i < 10; i++){printf("%d", arr1[i]);}fclose(pb);pb == NULL;return 0;
}


5. 文件的随机读写

文件的随机读写就是我们可以指定这个文件指针指向的位置,即指向第几个字符,然后从这个字符开始读写

fseek

fseek文档链接:

        

fseek - C++ Referencehttps://legacy.cplusplus.com/reference/cstdio/fseek/?kw=fseek

int fseek ( FILE * stream, long int offset, int origin );stream:文件指针  offset:相对于起始位置的偏移量origin:起始位置

函数功能:根据文件指针的位置和偏移量来定位文件指针

        

返回值:成功返回0,失败返回一个非零值

int main()
{FILE* pa = fopen("1.txt", "w");//写if (pa == NULL){perror("fopen");return 1;}//把字符串输出到文件流中fputs("abcdefgh", pa);//把光标移到起始位置向右偏移量为5的位置fseek(pa, 5, SEEK_SET);//把字符串123输出到文件流中fputs("123", pa);fclose(pa);pa == NULL;return 0;
}

ftell

ftell文档链接:

        

ftell - C++ Referencehttps://legacy.cplusplus.com/reference/cstdio/ftell/?kw=ftell

long int ftell ( FILE * stream );

函数功能:返回文件指针相对于起始位置的偏移量

        

返回值:成功则返回一个偏移量,失败则返回-1

int main()
{FILE* pa = fopen("text.txt", "w");//写if (pa == NULL){perror("fopen");return 1;}//把字符串输出到文件流中fputs("abcdefgh", pa);//把光标移到起始位置向右偏移量为5的位置fseek(pa, 5, SEEK_SET);int a = ftell(pa);printf("%d", a);fclose(pa);pa == NULL;return 0;
}

rewind

rewind文档链接:

        

rewind - C++ Referencehttps://legacy.cplusplus.com/reference/cstdio/rewind/?kw=rewind

void rewind ( FILE * stream );

函数功能:让文件指针的位置回到文件的起始位置

int main()
{FILE* pa = fopen("1.txt", "w");//写if (pa == NULL){perror("fopen");return 1;}//把字符串输出到文件流中fputs("abcdefgh", pa);//把光标移到起始位置向右偏移量为5的位置fseek(pa, 5, SEEK_SET);int a = ftell(pa);printf("重置之前偏移量为%d\n", a);rewind(pa);//把文件指针重置到文件起始位置int b = ftell(pa);printf("重置之后偏移量%d", b);fclose(pa);pa == NULL;return 0;
}


6. 文件读取结束的判定

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

 

feof 的作用是:当文件读取结束之后,判断是读取结束的原因是否是遇到文件尾结束

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

        

例如:

        

fgetc 判断是否为 EOF                fgets 判断返回值是否为 NULL 

文本文件举例:

#include <stdio.h>
#include <stdlib.h>
int main(void)
{int c; // 注意:int,⾮char,要求处理EOFFILE* fp = fopen("1.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);
}

二进制文件的读取结束判断

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

        

fread判断返回值是否小于实际要读的个数,若出现错误或到达文件末尾,则可能小于count,write判断返回值是否等于实际要写入的数据个数

#include<stdio.h>int main()
{FILE* pa = fopen("1.txt", "wb");//以输出二进制数据打开文件int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int ret = fwrite(arr, sizeof(arr), 5, pa);//输入5个整型放在文件流中if (ret != 5)//判断是否写入成功{perror("fwrite");}fclose(pa);//关闭文件pa == NULL;FILE* pb = fopen("text.txt", "rb");//以读取二进制数据打开文件int arr1[10] = { 0 };int rat = fread(arr1, 4, 3, pb);//从文件中读取三个整形存储到arr1中if (rat == 3)//判断返回值是否等于size{printf("返回值等于size\n");}else//不等于的话判断1.到达文件末尾2.读取出错{if (feof(pb)){printf("到达文件末尾");}elseperror("fread error");}for (int i = 0; i < 10; i++)//输入{printf("%d", arr1[i]);}fclose(pb);pb == NULL;return 0;
}


7. 文件缓冲区

ANSIC标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲⽂件系统是指系统自动地在内存中为 程序中每⼀个正在使用的文件开辟⼀块“文件缓冲区”,从内存向磁盘输出数据会先送到内存中的缓 冲区,装满缓冲区后才⼀起送到磁盘上

        

如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输 入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓 冲区的大小根据C编译系统决定的

#include <stdio.h>
#include <windows.h>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语言 —— 指尖跃迁 刻印永恒 - 文件操作

目录 1. 什么是文件 1.1 程序文件 1.2 数据文件 1.3 文件名 2. 二进制文件和文本文件 3. 文件的打开与关闭 3.1 流和标准流 3.2 文件指针 3.3 文件的打开与关闭 fopen fclose 4. 文件的顺序读写 4.1 fgetc和fputc fgetc fputc 4.2 fgets和fputs fgets fputs…...

第二章 DQL查询语句

第一章&#xff1a;基础查询 一、SELECT 语句 作用 SELECT 语句用于从数据库中选取数据。 结果被存储在一个结果表中&#xff0c;称为结果集。 语法 SELECT column1, column2, … FROM table_name; 与 SELECT * FROM table_name; 参数说明&#xff1a; column1, column2, …...

系统与网络安全------弹性交换网络(1)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 Trunk原理与配置 Trunk原理概述 Trunk&#xff08;虚拟局域网中继技术&#xff09;是指能让连接在不同交换机上的相同VLAN中的主机互通。 VLAN内通信 实现跨交换的同VLAN通信&#xff0c;通过Trunk链路&am…...

有哪些哲学流派适合创业二

好的&#xff0c;让我们更深入地探讨如何将‌哲学与数学‌深度融合&#xff0c;构建一套可落地的创业操作系统。以下从‌认知框架、决策引擎、执行算法‌三个维度展开&#xff0c;包含具体工具和黑箱拆解&#xff1a; ‌一、认知框架&#xff1a;用哲学重构商业本质‌ 1. ‌本体…...

Python(18)Python中JSON的妙用:详解序列化与反序列化原理及实战案例

目录 一、背景&#xff1a;为什么Python需要JSON&#xff1f;二、核心技术解析&#xff1a;序列化与反序列化2.1 核心概念2.2 类型映射对照表 三、Python操作JSON的四大核心方法3.1 基础方法库3.2 方法详解1. json.dumps()2. json.loads()3. json.dump()4. json.load() 四、实战…...

Nautilus 正式发布:为 Sui 带来可验证的链下隐私计算

作为 Sui 安全工具包中的强大新成员&#xff0c;Nautilus 现已上线 Sui 测试网。它专为 Web3 开发者打造&#xff0c;支持保密且可验证的链下计算。Nautilus 应用运行于开发者自主管理的可信执行环境&#xff08;Trusted Execution Environment&#xff0c;TEE&#xff09;中&a…...

投资理财_从0到1:如何用1000元开启你的二级市场投资之旅?

投资理财_从0到1&#xff1a;如何用1000元开启你的二级市场投资之旅&#xff1f; 一、前言&#xff1a;投资不是赌博&#xff0c;而是科学与艺术的结合1.1 为什么学习二级市场投资&#xff1f;1.2 本篇博客的目标 二、投资的基本概念&#xff1a;先搞清楚“玩的是什么”2.1 二级…...

有没有适合企业用的局域网即时通讯聊天工具?

随着信息安全问题的日益凸显&#xff0c;用户对于即时通讯工具的安全性与隐私保护提出了更高的要求。 强大的即时通讯能力 BeeWorks提供了专业的IM即时通讯能力&#xff0c;支持多种消息类型&#xff0c;包括文字、语音、图片和文件等&#xff0c;满足不同场景下的沟通需求。…...

Web3技术如何提升用户数据保护

在这个信息爆炸的时代&#xff0c;用户数据保护已成为全球关注的焦点。Web3 技术&#xff0c;作为下一代互联网的代表&#xff0c;以其去中心化、安全性和用户主权等特点&#xff0c;为用户数据保护提供了新的解决方案。本文将探讨 Web3 技术如何提升用户数据保护。 去中心化存…...

CANoe自动化测试用例log保存(专栏:车载网络诊断测试攻略从零开始搭建一个UDS诊断自动化测试CANoe工程)

文章目录 前言实现思路以及对应的CAPL代码1.获取cfg工程路径2.获取系统时间3.html报告路径4.log路径5.保存报告6.用例示例在汽车电子系统的开发与测试中,CANoe作为主流的仿真测试工具,其自动化测试用例生成的Log是问题追溯、合规审计和数据分析的核心依据。然而,许多团队因日…...

理解 results = model(source, stream=True) 的工作原理和优势

1. 核心概念解析 (1) streamTrue 的作用 生成器模式&#xff1a;当处理视频或图像序列时&#xff0c;streamTrue 会将结果包装成一个 生成器&#xff08;Generator&#xff09;&#xff0c;逐帧生成 Results 对象&#xff0c;而不是一次性返回所有结果。内存优化&#xff1a;…...

# 手写数字识别:使用PyTorch构建MNIST分类器

手写数字识别&#xff1a;使用PyTorch构建MNIST分类器 在这篇文章中&#xff0c;我将引导你通过使用PyTorch框架构建一个简单的神经网络模型&#xff0c;用于识别MNIST数据集中的手写数字。MNIST数据集是一个经典的机器学习数据集&#xff0c;包含了60,000张训练图像和10,000张…...

ios app的ipa文件提交最简单的方法

ipa文件是ios的app打包后生成的二级制文件&#xff0c;在上架app store connect或做testflight测试的时候&#xff0c;它提示我们需要使用xcode、transporter或xcode命令行等方式来上传。 而xcode、transporter或xcode命令行的安装都需要使用mac电脑&#xff0c;假如没有mac电…...

与/或形演绎推理——基于王永庆著《人工智能原理与方法》的深度解析

前文&#xff0c;我们已经写了两种演绎推理&#xff1a;自然演绎推理和归结演绎推理。 自然演绎推理&#xff1a;自然演绎推理——基于王永庆著《人工智能原理与方法》的深度解析-CSDN博客 归结演绎推理&#xff1a;归结演绎推理——基于王永庆著《人工智能原理与方法》的深度…...

【Qt】Qt 按钮控件详解,PushButton,RadioButton,CheckBox,ToolButton

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;QT 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f4da;按钮类控件&#x1f351;Push Button &#x1f965;Radio Buttion&#x1f343;click, press, release, toggled 的区别&#x1f341;…...

跨平台开发选Java还是C?应用场景与性能深度对比

&#x1f381;个人主页&#xff1a;User_芊芊君子 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 &#x1f50d;系列专栏&#xff1a;AI 【前言】 在计算机技术快速发展的今天&#xff0c;跨平台开发已经成为众多开发者的核心需求。Java和C作为两种历史悠…...

Node.js 的定义、用途、安装方法

关于 Node.js 的定义、用途、安装方法&#xff0c;以及为什么不能使用 DOM、BOM 和与浏览器不同的顶级对象的简明总结&#xff1a; &#x1f4a1; 一、Node.js 的定义 Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境&#xff0c;它让 JavaScript 不再局限于浏览…...

5、Props:组件间的密语——React 19 数据传递全解

一、密语启封&#xff1a;咒语学徒的困惑 "教授&#xff0c;我的魔法傀儡为什么总是不听指令&#xff1f;"年轻的学徒举着发光的魔杖&#xff0c;组件树中的傀儡们却像打人柳一样混乱。"记住&#xff0c;艾薇&#xff0c;"赫敏的魔杖在空中划出金色数据流…...

LangGraph中预构件,creat_react_agent的实现流程

LangGraph Prebuilt Agent 流程图 本文档展示了LangGraph的prebuilt模块中Agent的实现流程&#xff0c;重点是create_react_agent函数构建的代理系统流程和结构。 ReAct Agent构建流程 #mermaid-svg-ubcEEuBeApApT624 {font-family:"trebuchet ms",verdana,arial,s…...

python-将文本生成音频

将文本生成音频通常需要结合 文本转语音&#xff08;TTS&#xff0c;Text-to-Speech&#xff09; 工具或库来实现&#xff0c;比如 Google TTS (gtts)、Amazon Polly、Microsoft Azure TTS 等。 一、使用 Google TTS (gtts) 将文本生成音频 gtts 是一个简单易用的 Python 库&a…...

【虚幻C++笔记】接口

目录 概述创建接口 概述 简单的说&#xff0c;接口提供一组公共的方法&#xff0c;不同的对象中继承这些方法后可以有不同的具体实现。任何使用接口的类都必须实现这些接口。实现解耦解决多继承的问题 创建接口 // Fill out your copyright notice in the Description page o…...

白酒制造主数据管理全链路解析:业务重塑与AI赋能

作为中国消费领域的支柱产业之一&#xff0c;白酒行业在消费升级、渠道多元化的浪潮下&#xff0c;企业正面临库存积压、串货乱价、质量追溯难等核心痛点。如何通过主数据管理实现业务全链路的标准化与智能化&#xff0c;已成为行业数字化转型的关键命题。 01政策背景与行业现…...

Java与C在典型场景下的性能对比深度剖析

&#x1f381;个人主页&#xff1a;User_芊芊君子 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 &#x1f50d;系列专栏&#xff1a;AI 【前言】 在计算机编程领域&#xff0c;Java和C语言都是举足轻重的编程语言。Java以其跨平台性、自动内存管理和丰富…...

基于springboot+vue的数码产品抢购系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 系统展示 系统首页 商品信…...

芯片封装制造技术分析

封装技术正由单一防护功能向集成化系统发展&#xff0c;核心需统筹电气参数、热耗散能力与生产成本之间的关系。 一、技术定义与基础功能 芯片封装指通过特定制程将半导体晶片封装于保护结构内的技术&#xff0c;核心作用包括&#xff1a; 环境隔离&#xff1a;阻隔机械冲击、…...

Linux:Makefile

编译器gcc 使用方式&#xff1a;gcc [ 选项 ] 要编译的⽂件 [ 选项 ] [ ⽬标⽂件 ] 编译分为以下几个步骤&#xff1a; 1.预处理(进⾏宏替换) 预处理功能主要包括宏定义,⽂件包含,条件编译,去注释等。 预处理指令是以#号开头的代码⾏。 实例: gcc –E hello.c –o hello…...

下篇:《高阶排序算法:分治思想与性能突破》

个人主页&#xff1a;strive-debug 1. 堆排序&#xff08;Heap Sort&#xff09; - **核心思想**&#xff1a;利用 **大根堆&#xff08;升序&#xff09;** 或 **小根堆&#xff08;降序&#xff09;** 进行选择排序。 - **关键步骤**&#xff1a; 1. **建堆**&#xff08;…...

5G时代,视频分析设备平台EasyCVR实现通信基站远程安全便捷管控

一、背景介绍 随着移动通信行业的快速发展&#xff0c;各大运营商不断建设越来越多的无人值守通信基站。这些基站大多位于偏远地区&#xff0c;人烟稀少且交通不便&#xff0c;给日常维护带来了许多不便。特别是安装在空旷地带的基站设备&#xff0c;如空调、蓄电池等&#xf…...

第 4 篇:Motion 拖拽与手势动画(交互篇)—— 打造直觉化交互体验

Framer Motion 的拖拽与手势系统让实现复杂交互变得异常简单。本文将深入解析核心 API&#xff0c;并通过实战案例演示如何创造自然流畅的交互体验。 &#x1f9f2; 拖拽动画基础 1. 启用拖拽 使用 drag 属性即可开启拖拽能力。支持的值有&#xff1a;true&#xff08;全方向…...

TDengine 语言连接器(R语言)

简介 R 语言是一种用于统计分析、绘图和数据挖掘的编程语言和软件环境 。 TDengine 支持 R 语言访问 TDengine 数据库&#xff0c;通过 R 语言中的 RJDBC 库可以使 R 语言程序支持访问 TDengine 数据。 以下是安装过程、配置过程以及 R 语言示例代码。 安装过程 在开始之前&…...

Vue Router(3)- 历史记录模式、路由元信息

历史记录模式 Vue Router 支持多种历史管理模式&#xff0c;主要区别在于 URL 的表现形式和页面刷新/直接访问时的处理方式。 如果需要最好的兼容性或没有服务器配置权限&#xff0c;使用 Hash 模式 如果需要干净的 URL 并能配置服务器&#xff0c;使用 History 模式&#xff…...

android studio 运行java main报错

运行某个带main函数的java文件报错 Could not create task :app:Test.main(). > SourceSet with name main not found. 解决办法&#xff1a;在工程的.idea/gradle.xml 文件下添加&#xff1a; <option name"delegatedBuild" value"false" /&g…...

TDengine 3.3.6.3 虚拟表简单验证

涛思新出的版本提供虚拟表功能&#xff0c;完美解决了多值窄表查询时需要写程序把窄表变成宽表的处理过程&#xff0c;更加优雅。 超级表定义如下&#xff1a; CREATE STABLE st01 (ts TIMESTAMP,v0 INT,v1 BIGINT,v2 FLOAT,v3 BOOL) TAGS (device VARCHAR(32),vtype VARCHAR(…...

什么是进程?

目录 冯诺依曼体系 操作系统(OperatorSystem) 设计OS的目的 进程 task_struct 操作 /proc文件夹 父子进程 创建子进程 了解进程之前&#xff0c;我们先说说冯诺依曼体系结构&#xff0c;这是计算机硬件方面的知识。 冯诺依曼体系 我们常见的计算机&#xff0c;如笔记…...

mysql备份存储过程、函数和事件

背景 今天还原mysql数据库备份发现&#xff0c;数据库中没有存储过程和函数&#xff0c;虽然不推荐研发使用数据库的函数、存储过程&#xff0c;但还是免不了有人偶尔使用&#xff0c;所以整理备份和还原策略。 数据库备份 mysqldump -u user -p --routines --triggers --ev…...

【正点原子STM32MP257连载】第五章 ATK-DLMP257B文件系统简介 #文件系统 #SSH

1&#xff09;实验平台&#xff1a;正点原子ATK-DLMP257B开发板 2&#xff09;浏览产品&#xff1a;https://www.alientek.com/Product_Details/135.html 3&#xff09;全套实验源码手册视频下载&#xff1a;正点原子资料下载中心 文章目录 第五章 ATK-DLMP257B文件系统简介5.1…...

实战5:Python使用循环神经网络生成诗歌

实战5&#xff1a;Python使用循环神经网络生成诗歌 使用依赖加载数据词典构建和文本预处理总代码 在我们学习了课程8后&#xff0c;我们在实战练习一个例子。 你的主要任务&#xff1a;学习如何使用简单的循环神经网络&#xff08;Vanilla RNN&#xff09;生成诗歌。亚历山大谢…...

【网络安全】谁入侵了我的调制解调器?(二)

文章目录 针对 TR-069 协议 REST API 的攻击思路攻击百万台调制解调器意外发现 Cox 后端 API 的授权绕过漏洞确认我们能够进入任何人的设备访问和更新任何Cox商业客户账户通过泄露的加密密钥覆盖任何人的设备设置执行对任何调制解调器的命令影响最后想说阅读本文前,请先行浏览…...

当纺织车间遇上“数字魔法”--天拓四方飞鸟物联平台+边缘计算采集网关的智造革命

在传统印象里&#xff0c;纺织车间总是机器轰鸣、纱线纷飞&#xff0c;工人穿梭其间手动调整参数&#xff0c;次品率全凭经验“拿捏”。但如今&#xff0c;某纺织龙头企业的智能工厂里&#xff0c;一台台纺织机像被施了“聪明咒”&#xff0c;自己会“说话”、会“思考”&#…...

基于PLC的停车场车位控制系统的设计

2.1 设计目标 本课题为基于PLC的停车场车位控制系统来设计&#xff0c;在此将功能确定如下&#xff1a; 针对8个车位的停车场进行设计将停车场分为入口处&#xff0c;车位处、以及出口处三个部分&#xff1b;每个车位都有指示灯指示当前位置是否空闲&#xff0c;方便司机查找空…...

ios接入穿山甲【Swift】

1.可接入的广告&#xff0c;点击右下角查看接入文档 https://www.csjplatform.com/union/media/union/download/groMore 2.进入接入文档&#xff0c;选择最新版本进行接入 pod Ads-CN-Beta,6.8.0.2pod GMGdtAdapter-Beta, 4.15.22.0pod GDTMobSDK,4.15.30pod KSAdSDK,3.3.74.0p…...

【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(二)

自动引用计数 前言ARC规则所有权修饰符**__strong修饰符**__weak修饰符__unsafe_unretained修饰符__autoreleasing修饰符 规则属性数组 前言 上一篇我们主要学习了一些引用计数方法的内部实现&#xff0c;现在我们学习ARC规则。 ARC规则 所有权修饰符 OC中&#xff0c;为了处…...

智能语音识别+1.2用SAPI实现文本转语音(100%教会)

欢迎来到智能语音识别系列的第二篇文章. 上一篇文章的地址在这:智能语音处理1.1下载需要的库(100%实现)-CSDN博客 想必上一篇的操作(文本转语音)已经成功实现了 接下来,我们要学习用SAPI技术去实现文本转语音 一.简单介绍SAPI技术 SAPI是架构在COM基础上的&#xff0c;微软…...

Unity导出微信小游戏后无法调起移动端输入框

参考官方demo 参考demo https://gitee.com/wechat-minigame/minigame-unity-webgl-transform/tree/main/Demo/API_V2 里面有对输入文本框适配的处理方法&#xff0c;还有一些其他功能展示 1 使用Unity打开/Demo/API目录&#xff0c;API示例开发版本为Unity 2022.3.14f1。 2 若…...

16.使用豆包将docker-compose的yaml转为k8s的yaml,安装各种无状态服务

文章目录 docker方式httpbinit-toolslinux-commandmyipreference docker-compose安装k8s方式 docker方式 httpbin A simple HTTP Request & Response Service https://httpbin.org/ https://github.com/postmanlabs/httpbin https://github.com/mccutchen/go-httpbin do…...

每日OJ_牛客_kotori和抽卡(二)_数学_C++_Java

目录 牛客_孩子们的游戏_约瑟夫环 题目解析 C代码 Java代码 牛客_孩子们的游戏_约瑟夫环 孩子们的游戏(圆圈中最后剩下的数)_牛客题霸_牛客网 描述&#xff1a; 每年六一儿童节&#xff0c;牛客都会准备一些小礼物和小游戏去看望孤儿院的孩子们。其中&#xff0c;有个游戏…...

整活 kotlin + springboot3 + sqlite 配置一个 SQLiteCache

要实现一个 SQLiteCache 也是很简单的只需要创建一个 cacheManager Bean 即可 // 如果配置文件中 spring.cache.sqlite.enable false 则不启用 Bean("cacheManager") ConditionalOnProperty(name ["spring.cache.sqlite.enable"], havingValue "t…...

JVM:运行时数据区和线程

一、运行时数据区概述 &#xff08;1&#xff09;整体架构 JVM 启动时&#xff0c;操作系统会为它分配相应的内存空间&#xff0c;接着 JVM 会对分配到的空间进行划分。当 JVM 退出&#xff0c;这些空间会被回收。JVM 将分配到的内存空间主要分成五部分&#xff1a;程序计数器…...

Lucene.NET + Jieba分词:核心词典与停用词配置详解

文章目录 前言一、dict.txt&#xff1a;核心分词词典1. 文件作用2. 文件格式3. 配置方法 二、cn_synonym.txt&#xff1a;同义词扩展库1. 文件作用2. 文件格式3. 在 Lucene 中使用 三、stopwords.txt&#xff1a;停用词表1. 文件作用2. 文件格式3. 配置方法 四、实战&#xff1…...

软件测试之测试数据生成(Excel版)

这是Excel生成测试数据的函数使用 1.时间 1.1.时间 例生成2022-05-01之前一年内任意时间点: =TEXT("2022-05-01"-RAND()-RANDBETWEEN(1,365),"yyyy-mm-dd hh:mm:ss")1.2.年月日 yyyy-mm-dd 以当前时间生成10年的日期 =TEXT(NOW()-RAND()-RANDBETWE…...