【C语言】—— 文件操作(下)

  

前言:

  
  
  在 【C语言】—— 文件操作(上) 一文中,我们对文件有了一个简单的了解,并学会了如何打开和关闭文件,下面就让我们一起来学学如何对文件进行读写吧。
  
  

五、文件的顺序读写

5.1、 顺序读写函数介绍

函数名功能适用于
fgetc字符输入函数所有输入流
fputc字符输出函数所有输出流
fgets文本行输入函数所有输入流
fputs文本行输出函数所有输出流
fscanf格式化输入函数所有输入流
fprintf格式化输出函数所有输出流
fread二进制输入文件
fwrite二进制输出文件

  注:上面说的适用于所有输入流一般指适用于标准输入流和其他输入流(如文件输入流);所有输出流一般指适用于标准输出流和其他输出流(如文件输出流)

  下面我们对上述函数一一进行介绍
  

5.2、 f p u t c fputc fputc 函数

在这里插入图片描述

  • 函数功能将一个字符写入流中,这个流其实就是文件流
  • 函数参数
    • i n t int int c h a r a c t e r character character要写入的字符,字符的本质就是 A S C I I ASCII ASCII 码值,因此这里参数类型为 i n t int int 没有问题
    • F I L E FILE FILE * s t r e a m stream stream :指向要写入文件的文件指针
  • 返回类型:返回类型是 int:当写入成功,返回写入的值,当写入失败,返回EOF(-1)
      

函数使用:

#include<stdio.h>int main()
{FILE* pf = NULL;//打开文件pf = fopen("test.txt", "w");//文件操作if (NULL == pf){perror("fopen fail");return 1;}//写文件fputc('a', pf);fputc('b', pf);fputc('c', pf);//写入26个字母char ch = 0;for (ch = 'a'; ch <= 'z'; ch++){fputc(ch, pf);}//关闭文件fclose(pf);pf = NULL;
}

在这里插入图片描述

  这样,字符就写好了。
  
  当写入字符时,还有一些细节需要注意:当一个文件打开时,最开始其实是有一个光标指向第一个位置,每当用 f p u t c fputc fputc 函数写入一个字符光标则后退一格。光标是用来维护此时此刻我们这个文件写到哪的,而且是按照一定的顺序往后走的,因此叫做顺序读写

  

5.3、 f g e t c fgetc fgetc 函数

在这里插入图片描述

  • 函数功能:从流(文件)中获取一个字符
  • 返回值:返回类型为 i n t int int 。如果成功,就会将读到的字符返回,如果读取失败或者遇到文件末尾返回EOF(-1)
    • 为什么返回类型是 int 呢?正是因为它会返回两种类型的值:字符的 A S C I I ASCII ASCII码 值EOF;如果返回类型为 char,则 EOF 无法返回
        

函数使用:

#include<stdio.h>int main()
{FILE* pf = NULL;//打开文件pf = fopen("test.txt", "r");//文件操作if (NULL == pf){perror("fopen fail");return 1;}//读文件int ch = 0;while ((ch = fgetc(pf)) != EOF){printf("%c ", ch);}printf("\n");//关闭文件fclose(pf);pf = NULL;
}

运行结果:

在这里插入图片描述

  而同样,以只读的方式打开文件,刚开始光标是在第一个位置,即指向 a a a每读一个字符,光标向后退一位

  

5.4、 f p u t s fputs fputs 函数

在这里插入图片描述

  • 函数功能将 str 字符串写入文件流中,直至遇到 ‘\0’ 停止(‘\0’不会被写入)

   注:多次调用该函数,并不会实现主动换行,要想换行应主动输入‘\n’
  
函数使用:

#include<stdio.h>int main()
{//打开文件FILE* pf = NULL;pf = fopen("test.txt", "w");if (NULL == pf){perror("fopen fail");return 1;}//写文件fputs("hello", pf);fputs("world\n", pf);fputs("hello csdn\n", pf);//关闭文件fclose(pf);pf = NULL;return 0;
}

运行结果:
在这里插入图片描述
  我们可以看到,加了换行符后,文件的光标是直接落到下一行的。

  

5.5、 f g e t s fgets fgets 函数

在这里插入图片描述

  • 函数功能从流中最多读取 num 个字符,并放在 str 所指向的空间中
    • 函数读 n u m num num 个字符,但是最多只能读取 n u m num num - 1个,因为最后一个位置函数会自己加上 ‘\0’
    • 该函数不会换行读取。当 n u m num num 大于字符数时,遇到换行符 ‘\n’,将 ‘\n’ 读取后,不再往下读取,自己加上 ‘\0’ 后停止。
    • 当函数读取成功,返回的是目标空间的地址;读取失败则返回空指针(NULL)

  
函数使用:

#include<stdio.h>int main()
{//打开文件FILE* pf = NULL;pf = fopen("test.txt", "r");if (NULL == pf){perror("fopen fail");return 1;}//读文件char arr1[10] = "xxxxxxxxx";fgets(arr1, 8, pf);char arr2[10] = "xxxxxxxxx";fgets(arr2, 8, pf);//关闭文件fclose(pf);pf = NULL;return 0;
}

运行结果:

在这里插入图片描述

  

5.6、 f p r i n t f fprintf fprintf 函数

在这里插入图片描述

  
  该函数的功能是将数据以格式化的形式写入流中(以文本的形式)
  
  其实, f p r i n t f fprintf fprintf 函数 p r i n t f printf printf 函数是非常相像的,让我们来对比一下
  

在这里插入图片描述

  
  他们的区别仅仅是第一个参数的有无而已,其他都是一模一样的,所以你会用 p r i n t f printf printf你就会用 f p r i n t f fprintf fprintf
  
  多的一个参数是什么呢?是文件流,你需要将数据输出到的那个文件流
  

#include<stdio.h>struct S
{char name[20];int age;float score;
};
int main()
{struct S s = { "张三", 20, 75.5f };//打开文件FILE* pf = NULL;pf = fopen("test.txt", "w");if (NULL == pf){perror("fopen fail");return 1;}//写文件fprintf(pf, "%s %d %f", s.name, s.age, s.score);//关闭文件fclose(pf);pf = NULL;return 0;
}

运行结果:
在这里插入图片描述
  

5.7、 f s c a n f fscanf fscanf 函数

在这里插入图片描述

  
  该函数的功能是从文件流中读取格式化的数据。
  
  不难发现, f s a n f fsanf fsanf s c a n f scanf scanf 函数很像,我们来对比一下

  

在这里插入图片描述

  
  同 f p r i n t f fprintf fprintf 一样, f s c a n f fscanf fscanf s c a n f scanf scanf 只是相差一个参数而已,你会用 s c a n f scanf scanf 自然也就会用 f s c a n f fscanf fscanf 函数,第一个参数即是你所要读取的文件流
  

#include<stdio.h>struct S
{char name[20];int age;float score;
};
int main()
{struct S s = { 0 };//打开文件FILE* pf = NULL;pf = fopen("test.txt", "r");if (NULL == pf){perror("fopen fail");return 1;}//读文件fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));//printf("%s %d %.2f\n", s.name, s.age, s.score);fprintf(stdout, "%s %d %.2f\n", s.name, s.age, s.score);//关闭文件fclose(pf);pf = NULL;return 0;
}

  
运行结果:

在这里插入图片描述

  注意看,上述代码用了 f p r i n t f fprintf fprintf 来将数据打印在屏幕上

  还记得最开始的表格中, f p r i n t f fprintf fprintf 最后一列写的是所有输出流吗?这所有输出流就包括了文件流标准输出流,既然 f p r i n t f fprintf fprintf 可以输出到文件中,那么自然也就可以输出到屏幕中,完成 p r i n t f printf printf 一样的功能。

  而同理,前面讲的 f p u t c fputc fputc f g e t s fgets fgets f s c a n f fscanf fscanf 等函数也可以从标准输入(输出)流中获取(输出)数据。

  

5.8、 p r i n t f / f p r i n t f / s p r i n t f printf/fprintf/sprintf printf/fprintf/sprintf 函数对比

  
通过我们前面的学习,我们已经知道了 p r i n t f printf printf f p r i n t f fprintf fprintf 函数的作用:

  • p r i n t f printf printf:把数据以格式化的形式打印在标准输出流
  • f p r i n t f fprintf fprintf : 把数据以格式化的形式打印在 指定的输出流

那么 s p r i n t f sprintf sprintf 函数又是作什么的呢?我们一起来看看

在这里插入图片描述

  
  该函数的作用是:将数据以格式化的形式写到字符串。其实就是把格式化的数据转换成字符串
  

#include<stdio.h>struct S
{char name[20];int age;float score;
};
int main()
{struct S s = { "张三", 20, 75.5f };char buf[50] = { 0 };sprintf(buf, "%s %d %f", s.name, s.age, s.score);printf("%s\n", buf);return 0;
}

运行结果:
在这里插入图片描述
  该代码完全是以 %s 的形式打印的,说明数据已经完全转换成字符串了。

  

5.9、 s c a n f / f s c a n f / s s c a n f scanf/fscanf/sscanf scanf/fscanf/sscanf 函数对比

  同样,通过我们前面的学习,我们已经知道了 s c a n f scanf scanf f s c a n f fscanf fscanf 函数的作用:

  • s c a n f scanf scanf:从 标准输入流 中读取格式化的数据
  • f s c a n f fscanf fscanf:从 指定输入流 中读取格式化的数据

  那 s s c a n f sscanf sscanf 的功能又是什么呢?学习了 s p r i n t f sprintf sprintf ,我们猜测,其应该是从字符串中读取格式化数据,是不是呢?我们一起来看看
  

在这里插入图片描述

  
函数功能从字符串中读取格式化数据
  

#include<stdio.h>struct S
{char name[20];int age;float score;
};
int main()
{struct S s = { "张三", 20, 75.5f };char buf[50] = { 0 };sprintf(buf, "%s %d %f", s.name, s.age, s.score);struct S a = { 0 };sscanf(buf, "%s %d %f", s.name, &(s.age), &(s.score));printf("%s %d %f\n", s.name, s.age, s.score);return 0;
}

运行结果:

在这里插入图片描述

  
  

5.10、 f w r i t e fwrite fwrite 函数

在这里插入图片描述

  • 函数功能:以二进制的形式将内存块中的数据入文件中
  • 参数介绍
    • c o n s t const const v o i d void void * p t r ptr ptr p t r ptr ptr 是指向要写入数据的数组的指针
    • s i z e size size_ t t t s i z e size size:表示要写入的每个元素的大小
    • s i z e size size_ t t t c o u n t count count:表示要写入元素的个数

  
下面我们直接上代码:

#include<stdio.h>int main()
{int arr[] = { 1,2,3,4,5 };int sz = sizeof(arr) / sizeof(arr[0]);FILE* pf = NULL;pf = fopen("test.txt", "wb");if (NULL == pf){perror("fopen fail");return 1;}fwrite(arr, sizeof(arr[0]), sz, pf);fclose(pf);pf = NULL;return 0;
}

  
我们以二进制的方式打开:

在这里插入图片描述

  

5.11、 f r e a d fread fread 函数

在这里插入图片描述

  该函数的作用是:以二进制的形式读取数据到内存中

  我们可以看到,这函数的参数与 f w r i t e fwrite fwrite 是大同小异的,这里就不一一介绍了,我们直接上代码

#include<stdio.H>int main()
{int arr[5] = { 0 };FILE* pf = NULL;pf = fopen("test.txt", "rb");if (NULL == pf){perror("fopen fail");return 1;}fread(arr, sizeof(arr[0]), 5, pf);for (int i = 0; i < 5; i++){printf("%d ", arr[i]);}printf("\n");fclose(pf);pf = NULL;return 0;
}

运行结果:

在这里插入图片描述

  但是,上面代码是我提前知道了总共的数据个数,当我不知道数据具体个数是又该怎么办呢?

  这里,我们需要知道 f r e a d fread fread 函数的返回值,该函数的返回值是读取到的数据的个数。这时,当我要求读 7 个数据,而返回值是 5 时,说明数据读完了。

  上面的代码我们可以做如下修改:

#include<stdio.h>int main()
{int arr[5] = { 0 };FILE* pf = NULL;pf = fopen("test.txt", "rb");if (NULL == pf){perror("fopen fail");return 1;}int i = 0;while (fread(arr + i, sizeof(arr[0]), 1, pf)){printf("%d ", arr[i]);i++;}printf("\n");fclose(pf);pf = NULL;return 0;
}

  
  

六、文件的随机读写

  前面我们所学习到的函数都是顺序读写,光标是依次往后移动。那能不能做到随机读写呢,即我想在哪里读写就在哪读写,指那打那。

  当然是可以的,下面让我们一起来学习。
  

6.1、 f s e e k fseek fseek 函数

在这里插入图片描述

  • 功能:根据文件指针的位置和偏移量来定位文件指针(光标)
  • 参数介绍
    • l o n g long long i n t int int o f f s e t offset offset:相对于起始位置的偏移量,可正可负
    • i n t int int o r i g i n origin origin起始位置

起始位置选择:

常量所指位置
SEEK_SET文件的起始位置
SEEK_CUR当前光标位置
SEEK_END文件结尾

  
  这个函数有什么用呢?比如文件中有 a b c d e f g abcdefg abcdefg 的数据,当前光标指向 a a a,而我想直接读 e e e,这时就可以用该函数移动光标啦。
  

在这里插入图片描述

例子:

#inclu<stdio.h>int main()
{FILE* pf = NULL;pf = fopen("test.txt", "r");if (NULL == pf){perror("fopen fail");return 1;}char ch = 0;ch = fgetc(pf);printf("%c\n", ch);fseek(pf, 3, SEEK_CUR);ch = fgetc(pf);printf("%c\n", ch);fclose(pf);pf = NULL;return 0;
}

运行结果:

在这里插入图片描述

  
  

6.2、 f t e l l ftell ftell 函数

在这里插入图片描述

f t e l l ftell ftell 函数会返回文件指针(光标) 相对于文件起始位置的 偏移量

  这里,我们想:如果我们让光标读到文件末尾,在返回偏移量,是不是就能知道文件的长度呢?答案是肯定的。
  
例子:

#includ<stdio.h>int main()
{FILE* pf;long size;pf = fopen("test.txt", "rb");if (NULL == pf)perror("Error opening file");fseek(pf, 0, SEEK_END); // non-portablesize = ftell(pf);fclose(pf);printf("Size of test.txt: %ld bytes.\n", size);return 0;
}

  
  

6.3、 r e w i n d rewind rewind 函数

在这里插入图片描述

   r e w i n d rewind rewind 函数可以让文件指针回到起始位置

  走的太远,别忘了回头路

例子:

#include<stdio.h>int main()
{int n;FILE* pf;char buffer[27];pf = fopen("test.txt", "w+");for (n = 'A'; n <= 'Z'; n++){fputc(n, pf);}rewind(pf);fread(buffer, 1, 26, pf);fclose(pf);buffer[26] = '\0';printf(buffer);return 0;
}

  
  

七、文件读取结束的判定

7.1、 被错误使用的 f e o f feof feof

  
  很多人都以为 f e o f feof feof函数是用来直接判断文件读取是否结束。其实这是大错特错的
   f e o f feof feof 的作用是:当文件读取结束时,判断读取结束的原因是否是因为:遇到文件末尾结束

  现在假设文件读取结束了,但是是什么原因读取结束的呢?

  1. 有可能遇到文件末尾
  2. 读取的时候发生了错误

   f e o f feof feof 函数是判断是否是因为遇到文件末尾而结束的。
  而还有个函数叫 f e r r o r ferror ferror 是用来判断是否是因为遇到错误而读取结束的
  

  其实在我们打开一个流时,会有两个标记值

  1. 是否遇到文件末尾
  2. 是否发生错误
      

  当读文件的过程中确实是遇到文件末尾了,就会将第一个值标记;遇到错误就会将第二个值标记
   f e o f feof feof是用来检测第一个标记的; f e r r o r ferror ferror是用来检测第二个标记

f e o f feof feof 函数:当文件确实是因为读取到文件末尾而结束时,返回一个非零值,反之返回 0
  
  

7.2、如何判断文件读取结束

  那么如何来判断文件是否读取结束呢?其实在前面结束各个函数时已经顺便介绍了:通过函数的返回值进行判断!
  

(1)文本文件判断

函数名正常读取返回值读取结束或遇到错误的返回值
fgetc返回读取到的字符的ASCII码值EOF
fgets返回目标空间的地址NULL

  

(2)二进制文件判断

  二进制文件用 f r e a d fread fread 进行读取, f r e a d fread fread 返回值是其读取到的个数。当其返回值小于实际要读取的个数时,表示文件读取结束

  

八、 文件缓冲区

  我们想一个问题:当我们想往文件中存 26 个字母,这 26 个字母是直接从程序(内存)中存到文件(硬盘)中的吗?
  其实不是的。

  ANSI C 标准采用 “缓冲文件系统” 处理的数据文件的,所谓缓冲文件系统指的是系统自动在内存中为程序中为每一个正在使用的文件开辟一块“文件缓冲区”

  从内存向磁盘输出数据会先送达内存中的缓冲区装满缓冲区主动刷新缓冲区才将数据送到磁盘上。

  如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区或刷新缓冲区),然后在从缓冲区逐个地将数据送到程序数据区(程序变量等)。

  缓冲区的大小根据C编译系统决定的。

在这里插入图片描述

  那为什么要有文件缓冲区呢?

  其实,当我们向文件中输入输出数据时,相关函数会调用操作系统相关接口;这时如果写一个字符就调用一次操作系统,是不是效率太低,并且我们的操作系统上面可不止跑着一个程序,这时你一直打扰操作系统,操作系统就没法干活了。
  应用缓冲区,在缓冲区攒够一定数据再一次性全部录进,效率就会提升很多

  下面,我们通过一段代码验证缓冲区的存在:

#include<stdio.h>
#include <windows.h>
//VS2019 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语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件

  如果不做,可能导致读写文件的问题
  
  
  
  


  好啦,本期关于文件操作的知识就介绍到这里啦,希望本期博客能对你有所帮助。同时,如果有错误的地方请多多指正,让我们在C语言的学习路上一起进步!

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

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

相关文章

2024 年 亚太赛 APMCM (C题)中文赛道国际大学生数学建模挑战赛 | 量子计算的物流配送 | 数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题&#xff01; 完整内容可以在文章末尾领取&#xff01; 该段文字…

C++内存管理(候捷)第一讲 笔记

内存分配的每一层面 applications可以调用STL&#xff0c;里面会有allocator进行内存分配&#xff1b;也可以使用C 基本工具primitives&#xff0c;比如new, new[], new(), ::operator new()&#xff1b;还可以使用更底层的malloc和free分配和释放内存。最底层的是系统调用&…

Maven Archetype 自定义项目模板:高效开发的最佳实践

文章目录 前言一、Maven Archetype二、创建自定义 Maven Archetype三、定制 Archetype 模板四、手动创建 Archetype 模板项目五、FAQ5.1 如何删除自定义的模板5.2 是否可以在模板中使用空文件夹 六、小结推荐阅读 前言 在软件开发中&#xff0c;标准化和快速初始化项目结构能够…

14-20 Vision Transformer用AI的画笔描绘新世界

概述 毫无疑问,目前最受关注且不断发展的最重要的主题之一是使用人工智能生成图像、视频和文本。大型语言模型 (LLM) 已展示出其在文本生成方面的卓越能力。它们在文本生成方面的许多问题已得到解决。然而,LLM 面临的一个主要挑战是它们有时会产生幻觉反应。 最近推出的新模…

分布式计算、异构计算与算力共享

目录 算力 算力共享的技术支撑 云计算技术 边缘计算技术 区块链技术 分布式计算、异构计算与算力共享 分布式计算:计算力的“集团军作战” 异构计算:计算力的“多兵种协同” 算力共享:计算力的“共享经济” 深入融合,共创计算新纪元 算力共享对科研领域的影响 …

openmetadata1.3.1 自定义连接器 开发教程

openmetadata自定义连接器开发教程 一、开发通用自定义连接器教程 官网教程链接&#xff1a; 1.https://docs.open-metadata.org/v1.3.x/connectors/custom-connectors 2.https://github.com/open-metadata/openmetadata-demo/tree/main/custom-connector &#xff08;一&…

Matplotlib 文本

可以使用 xlabel、ylabel、text向图中添加文本 mu, sigma 100, 15 x mu sigma * np.random.randn(10000)# the histogram of the data n, bins, patches plt.hist(x, 50, densityTrue, facecolorg, alpha0.75)plt.xlabel(Smarts) plt.ylabel(Probability) plt.title(Histo…

git 还原被删除的分支

在多人项目开发中&#xff0c;有一次碰到忘记合并到master分支了&#xff0c;直接就把开发分支给删除了&#xff0c;现在记录下怎么还原被删除的分支 必须保证删除的分支之前已经被推送到了远程仓库 # 找出被删除分支的最后一个提交的哈希值 git reflog show# 找到提交哈希值…

2024/07/04

1、梳理笔记(原创) 2、终端输入一个日期&#xff0c;判断是这一年的第几天 scanf("%d-%d-%d",&y,&m,&d); 闰年2月29天&#xff0c;平年2月28天 #include<stdio.h> int main(int argc, char const *argv[]) {int y0,m0,d0;printf("please ente…

析构函数和拷贝构造函数

文章目录 析构函数1.析构函数的定义&#xff1a;2.析构函数的语法&#xff1a;3.析构函数的特性&#xff1a; 拷贝构造函数1.拷贝构造函数的定义&#xff1a;2.拷贝构造函数的语法3.拷贝构造函数的特性(1)拷贝构造函数是构造函数的一个重载形式**(这个其实也很好理解&#xff0…

鸿蒙开发设备管理:【@ohos.thermal (热管理)】

热管理 该模块提供热管理相关的接口&#xff0c;包括热档位查询及注册回调等功能。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shi…

Land survey boundary report (template)

Land survey boundary report (template) 土地勘测定界报告&#xff08;模板&#xff09;.doc

【高校科研前沿】南京地理与湖泊研究所博士后夏凡为第一作者在环境科学与水资源领域Top期刊发文:钙对云南洱海溶解有机质与浮游细菌相互作用的调控作用

文章简介 论文名称&#xff1a;Calcium regulates the interactions between dissolved organic matter and planktonic bacteria in Erhai Lake, Yunnan Province, China 第一作者及单位&#xff1a;夏凡&#xff08;博士后|中国科学院南京地理与湖泊研究所&#xff09; 通讯…

【pytorch13】激活函数及梯度

什么是激活函数 计算机科学家借鉴生物的神经元机制发明了计算机上的模型&#xff0c;这个模型与生物的神经元非常类似 激活的意思就是z变量要大于0&#xff0c;这一个节点才会激活&#xff0c;否则就会处于睡眠状态不会输出电平值 该激活函数在z0处不可导&#xff0c;因此不能…

Asp .Net Core 系列:基于 Castle DynamicProxy + Autofac 实践 AOP 以及实现事务、用户填充功能

文章目录 什么是 AOP &#xff1f;.Net Core 中 有哪些 AOP 框架&#xff1f;基于 Castle DynamicProxy 实现 AOPIOC中使用 Castle DynamicProxy实现事务管理实现用户自动填充 什么是 AOP &#xff1f; AOP&#xff08;Aspect-Oriented Programming&#xff0c;面向切面编程&a…

图像的反转

图像颜色的反转一般分为两种&#xff1a;一种是灰度图片的颜色反转&#xff0c;另一种是彩色图像的颜色反转。 本节使用的原图如下&#xff1a; 1.1 灰度图像颜色反转 灰度图像每个像素点只有一个像素值来表示&#xff0c;色彩范围在0-255之间&#xff0c;反转方法255-当前像…

8.ApplicationContext常见实现

ClassPathXmlApplicationContext 基于classpath下xml格式的配置文件来创建 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-i…

Flutter——最详细(Drawer)使用教程

背景 应用左侧或右侧导航面板&#xff1b; 属性作用elevation相当于阴影的大小 import package:flutter/material.dart;class CustomDrawer extends StatelessWidget {const CustomDrawer({Key? key}) : super(key: key);overrideWidget build(BuildContext context) {return…

解决SeaTunnel 2.3.4版本写入S3文件报错问题

在使用Apache SeaTunnel时&#xff0c;我遇到了一个写入S3文件的报错问题。通过深入调试和分析&#xff0c;找到了问题所在&#xff0c;并提出了相应的解决方案。 本文将详细介绍报错情况、参考资料、解决思路以及后续研究方向&#xff0c;希望对大家有帮助&#xff01; 一、…

修改头文件版本需要修改的文件

以修改ui的头文件版本为例&#xff0c;还需要同时更新 PJ10PC20240120041_c928\components\master-t5\hikauto\module\app\include PJ10PC20240120041_c928\components\master-t5\hikauto\module\app\include\dsp PJ10PC20240120041_c928\components\master-t5\hikauto\incl…