【C语言】文件的操作与文件函数的使用(详细讲解)

news2024/10/6 12:29:07

前言:我们在学习C语言的时候会发现在编写一个程序的时候,数据是存在内存当中的,而当我们退出这个程序的时候会发现这个数据不复存在了,因此我们可以通过文件把数据记录下来,使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。

💖 博主CSDN主页:卫卫卫的个人主页 💞
👉 专栏分类:C程序设计谭浩强版本 👈
💯代码仓库:卫卫周大胖的学习日记💫
💪关注博主和博主一起学习!一起努力!
在这里插入图片描述


目录

    • 什么是文件
      • 程序文件
      • 数据文件
    • 文件名
    • 文件的打开和关闭
      • 文件指针
    • 文件的打开和关闭
      • 文件的打开(fopen函数)
      • 文件的关闭(fclose函数)
      • 关于文件的使用方式
    • 文件的顺序读写
      • 什么是输入流和输出流、标准错误流?
    • 文件函数的用法
        • fgetc函数
        • fputc函数
        • fgets函数
        • fputs函数
        • fscanf函数
        • fprintf函数
        • fread函数
        • fwrite函数
        • fseek函数
        • ftell函数
        • rewind函数
        • feof函数
        • ferror函数
    • 文本文件和二进制文件
    • 文件缓冲区


什么是文件

磁盘上的文件是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。

程序文件

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

数据文件

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

文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。
文件名包含3部分:文件路径+文件名主干+文件后缀
例如: 在这里插入图片描述

为了方便起见,文件标识常被称为文件名。

文件的打开和关闭

文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE
每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。
一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。

下面我们一起来创建一个文件指针变量:

FILE* pf;//文件指针变量

定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。如下图所示:
在这里插入图片描述
代码实例:

int main()
{
	FILE* pf = fopen("text.txt", "w");//打开一个文件,以写的形式
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	char ch = 0;
	fputc('a', pf);//写入字符a到文件中
	fclose(pf);
	pf = NULL;
	return 0;
}

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

我们注意此时的光标是指向的字符a,也就是文件指针是指向了a的位置,且随着你追加的字符,文件指针的位置也会随着改变。


文件的打开和关闭

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

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

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

文件的打开(fopen函数)

fopen函数用来打开一个文件,具体如何使用我们看下图:
在这里插入图片描述

具体代码演示:

//以写的形式打开一个名称为:test的文本
FILE* pf = fopen("test.txt", "w");

文件的关闭(fclose函数)

fclose函数,用来关闭打开的文件。具体用法如下在这里插入图片描述

具体代码演示:

FILE* pf = fopen("test.txt", "w");
fclose(pf);//关闭打开的文件

关于文件的使用方式

文件使用方式含义如果指定文件不存在
“r”(只读) 为了输入数据,打开一个已经存在的文本文件为了输入数据,打开一个已经存在的文本文件
“w”(只写) 为了输出数据,打开一个文本文件建立一个新的文件
“a”(追加) 向文本文件尾添加数据建立一个新的文件
“rb”(只读) 为了输入数据,打开一个二进制文件出错
“wb”(只写) 为了输出数据,打开一个二进制文件建立一个新的文件
“ab”(追加) 向一个二进制文件尾添加数据出错
“r+”(读写) 为了读和写,打开一个文本文件出错
“w+”(读写) 为了读和写,建立一个文本文件建立一个新的文件
“a+”(读写) 打开一个文件,在文件尾进行读写建立一个新的文件
“rb+”(读写) 为了读和写打开一个二进制文件出错
“wb+”(读写)) 为了读和写,新建一个新的二进制文件建立一个新的文件
“ab+”(读写) 打开一个二进制文件,在文件尾进行读和写建立一个新文件

实例代码演示:

int main()
{
    //打开文件
    FILE* pFile = fopen("myfile.txt", "w");
    //文件操作
    if (pFile != NULL)//判断文件是否打开失败,fopen函数打开失败会返回NULL
    {
        fputs("fopen example", pFile);//写入信息(输出流)
        //关闭文件
        fclose(pFile);//关闭文件
        pFile = NULL;//置为空指针,防止野指针
    }
    return 0;
}

运行结果:
注:在你对应的程序的文件夹下面会生成此文件,并如下图所示
在这里插入图片描述


文件的顺序读写

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

什么是输入流和输出流、标准错误流?

  1. 输出流(stdout):简单的理解就是你把你C语言所写的程序,传递给了某个文件就是输出流。如下图:
    在这里插入图片描述

  2. 输入流(stdin):你用这C语言程序读取文件,就是输入流,如上图所示。

  3. 标准错误流(stderr)

文件函数的用法

fgetc函数

fgetc字符输入函数,可以通俗的理解从文件中读取字符信息
在这里插入图片描述

来看代码实例演示:
我们先创建一个text的文本,在里面放入如下图所示的信息:
在这里插入图片描述
我们来编写一个程序来读取该文本中的信息

int main()
{
	FILE* pf = fopen("text.txt", "r");
	if (pf == NULL)//判断是打开文件失败
	{
		perror("fopen");
		return 1;
	}
	//读文件
	int ch = fgetc(pf);//将读取到的字符保存在ch中
	printf("%c ", ch);//打印读取的字符
	ch = fgetc(pf);
	printf("%c ", ch);
	ch = fgetc(pf);
	printf("%c ", ch);
	ch = fgetc(pf);
	printf("%c ", ch);
	ch = fgetc(pf);
	printf("%c ", ch);
	fclose(pf);
	pf = NULL;
	return 0;
}

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


fputc函数

fputc字符输出函数,可以通俗的理解成在C语言程序输出字符到文件中去。在这里插入图片描述

代码实例演示:

//读写文件
int main()
{
	FILE* pf = fopen("weiwei.txt", "w");//以写的形式打开文件
	if (pf == NULL)//判断打开是否成共
	{
		perror("fopen");//找出错误原因
		return 1;
	}
	//写文件
	char ch = 0;
	for (ch = 'a'; ch <= 'z'; ch++)
	{
		if (ch % 5 == 0)
		{
			fputc('\n', pf);//每个五的倍数的ASCII值换行一次
		}
		fputc(ch, pf);//把ch中的字符写入文件指针pf中
	}
	fclose(pf);//关闭文件
	pf = NULL;
	return 0;
}

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


fgets函数

fgetc函数文本行输出函数,通俗的理解从文件中读取行数据在这里插入图片描述

代码实例演示:

int main()
{
    char mystring[100] = { 0 };//创建一个字符数组用来存放读取的数据
    FILE* pFile = fopen("myfile.txt", "r");//以读的形式打开文件
    if (pFile == NULL) //判断是否打开成功
        perror("Error opening file");
    else 
    {
        if (fgets(mystring, 20, pFile) != NULL)//读取20个字符数据(20个字节,一个汉字是两个字节)
            puts(mystring);//输出字符数组
        fclose(pFile);//关闭文件
        pFile = NULL;//置为空指针
    }
    return 0;
}

文本中的数据:
在这里插入图片描述

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


fputs函数

fputc函数,可以通俗的理解成将数组中的字符串写入文件中。
在这里插入图片描述

代码实例演示:

int main()
{
	char sentence[256] = { 0 };
	printf("请追加一个句子: ");
	fgets(sentence, 256, stdin);//将输入流中(即文件中)数据放在字符数组中
	FILE* pFile = fopen("zhouzhou.txt", "a");
	fputs(sentence, pFile);//将字符数组中的数据写入文件当中
	fclose(pFile);
	return 0;
}

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


fscanf函数

fscanf函数,可以通俗的理解成以格式化的形式读取文件中的数据在这里插入图片描述

代码示例演示:

int main()
{
	char str[80];
	float f;
	FILE* pFile = fopen("mywei.txt", "w+");//以读和写的形式打开一个文件
	fprintf(pFile, "%f %s", 3.1416, "PI");//把该数据格式化写入到文件中去
	rewind(pFile);//将指针初始化
	fscanf(pFile, "%f", &f);//格式化读取文件中的数据
	fscanf(pFile, "%s", str);//同理
	fclose(pFile);//关闭文件
	pFile = NULL;
	printf("I have read: %f and %s \n", f, str);
	return 0;
}

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


fprintf函数

fprintf函数,可以通俗的理解成从C语言程序中格式化的写入数据到文件去。
在这里插入图片描述

代码实例演示:

int main()
{
    int n;
    char name[100];
    FILE* pFile = fopen("myfile.txt", "w");
    for (n = 0; n < 3; n++)
    {
        puts("please, enter a name: ");
        gets(name);//读取字符
        fprintf(pFile, "Name %d [%-10.10s]\n", n + 1, name);//格式化写入数据到文件中
    }
    fclose(pFile);
    return 0;
}

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


fread函数

fread函数,可以通俗的理解成用二进制的形式读取文件
在这里插入图片描述

代码实例演示:

int main()
{
	int arr[10] = { 1222,1222,33,19,5,6,7,8,9,10 };
	//int arr[10] = {0};
	FILE* pf = fopen("wwwagou.bin", "wb");//读写
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//二进制的写文件
	fwrite(arr, sizeof(arr[0]), sizeof(arr) / sizeof(arr[0]), pf);
	//二进制的读文件
	fread(arr, sizeof(arr[0]), sizeof(arr) / sizeof(arr[0]), pf);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

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


fwrite函数

fwrite函数,可以通俗的理解成用二进制的形式写入数据到文件中。
在这里插入图片描述

代码实例演示:

int main()
{
	char buffer[] = { 'x' , 'y' , 'z' };
	FILE* pFile = fopen("myfile.bin", "wb");//以二进制的形式写入
	fwrite(buffer, sizeof(char), sizeof(buffer), pFile);//写入数据
	fclose(pFile);
	return 0;
}

运行结果:
在记事本中打开会发现我们可以看懂这个代码
在这里插入图片描述
假若修改一下:

int main()
{
	int buffer[] = {1,2,3};
	FILE* pFile = fopen("myfile.bin", "wb");//以二进制的形式写入
	fwrite(buffer, sizeof(int), sizeof(buffer), pFile);//写入数据
	fclose(pFile);
	return 0;
}

我们此时会发现在记事本中是一串乱码,因此我们要在Vscode中去读取
在这里插入图片描述

在这里插入图片描述


fseek函数

feek函数,可以理解成根据文件指针的位置和偏移量来定位文件指针,也就是随机在哪里读写数据。
在这里插入图片描述

代码实例演示

int main()
{
	FILE* pFile = fopen("example.txt", "wb");
	if (pFile == NULL)
	{
		perror("fopen");
		return 1;
	}
	fputs("This is an apple.", pFile);//写入数据到文件中
	fseek(pFile, 9, SEEK_SET);//调整光标(指针为起始位置往后第九个的位置)
	fputs(" sam", pFile);//从光标(指针指向第九个字符的位置)追加新的数据
	fclose(pFile);//关闭文件
	pFile = NULL;
	return 0;
}

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


ftell函数

ftell函数,通俗的讲就是返回当前位置的光标距离起始位置的距离的值在这里插入图片描述

代码实例演示:

int main()
{
    long size;
    FILE* pFile = fopen("myfile.txt", "rb");//读写一个二进制文件
    if (pFile == NULL) 
        perror("Error opening file");
    else
    {
        fseek(pFile, 0, SEEK_END);   // non-portable
        size = ftell(pFile);//计算举例起始位置的距离
        fclose(pFile);
        printf("Size of myfile.txt: %1d bytes.\n", size);
    }
    return 0;
}

文件中原本的样子:
在这里插入图片描述
运行结果:
在这里插入图片描述


rewind函数

rewind函数,让文件指针的位置回到文件的起始位置
在这里插入图片描述

代码实例演示:

int main()
{
    int n;
    FILE* pFile;
    char buffer[27];
    pFile = fopen("myfile1.txt", "w+");
    for (n = 'A'; n <= 'Z'; n++)
        fputc(n, pFile);//将数据写入文件
    rewind(pFile);//回到起始位置
    fread(buffer, 1, 26, pFile);//读取
    fclose(pFile);
    buffer[26] = '\0';
    puts(buffer);//输出数据
    return 0;
}

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


feof函数

feof函数,在文件读取结束后,用来判断文件是否遇到文件末尾而结束
在这里插入图片描述

代码实例演示:

int main()
{
    FILE* pFile;
    int n = 0;
    pFile = fopen("myfile.txt", "rb");//读写的形式打开文件
    if (pFile == NULL) 
        perror("Error opening file");
    else
    {
        while (fgetc(pFile) != EOF)//读取里面的数据 
        {
            ++n;//判断有几个bytes
        }
        if (feof(pFile))//判断是否正常结束
        {
            puts("End-of-File reached.");//正常结束
            printf("Total number of bytes read: %d\n", n);//计算总字节数
        }
        else 
            puts("End-of-File was not reached.");
        fclose(pFile);
    }
    return 0;
}

记事本中的数据:
在这里插入图片描述
运行结果:
在这里插入图片描述


ferror函数

ferror函数,用来判断在文件读取结束后,用来判断文件是否因为读取过程当中遇到错误而结束!
在这里插入图片描述

代码实例演示:

int main()
{
    FILE* pFile;
    pFile = fopen("myfile.txt", "r");
    if (pFile == NULL) 
        perror("Error opening file");
    else 
    {
        fputc('x', pFile);//写入数据
        if (ferror(pFile))//判断在读取的过程中的错误
            printf("Error Writing to myfile.txt\n");
            perror("pFile");//判断错误原因
        fclose(pFile);//因为是以读的形式,所以失败
    }
    return 0;
}

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


文本文件和二进制文件

  • 根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
  • 数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
  • 如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。
  • 一个数据在内存中是怎么存储的呢?
    字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。
  • 如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节(VS2013测试)。

文件缓冲区

ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。如果不做,可能导致读写文件的问题。
在这里插入图片描述


结语:今天的内容就到这里吧,谢谢各位的观看,如果有讲的不好的地方也请各位多多指出,作者每一条评论都会读的,谢谢各位。


🫵🫵🫵 祝各位接下来好运连连 💞

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

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

相关文章

Pytorch深度学习—FashionMNIST数据集训练

文章目录 FashionMNIST数据集需求库导入、数据迭代器生成设备选择样例图片展示日志写入评估—计数器模型构建训练函数整体代码训练过程日志 FashionMNIST数据集 FashionMNIST&#xff08;时尚 MNIST&#xff09;是一个用于图像分类的数据集&#xff0c;旨在替代传统的手写数字…

各种小程序/PC/移动端修改代码/文件后, 不热重载问题修复

各种框架有各种的配置,首先检查是否配置了热更新, 打个比方,taro中底版本中配置热更新是在配置文件中开启mini.hot,高版本中,终端执行打包命令的时候,添加–watch参数, 如果以上检查都没有问题,依旧还是没有热更新,那么很有可能是依赖出了问题,可以通过以下方法,重新…

Spring 趣玩

1、修改控制台启动显示的图案 在SpringBoot项目的resources目录下新建一个banner.txt文本文件&#xff0c;然后将启动Banner粘贴到此文本文件中&#xff0c;启动项目即可。 在线制作banner ①、http://patorjk.com/software/taag/ ②、https://www.bootschool.net/ascii ③、ht…

mysql数据库创建及用户添加和权限管理

1、创建数据库&#xff1a; CREATE DATABASE database_name; 例如&#xff1a; CREATE DATABASE mydatabase; 2、创建用户&#xff1a; CREATE USER usernamehostname; 例如&#xff1a; CREATE USER myuserlocalhost; 注意&#xff1a;替换 username 为你想要创建的用户名&a…

香港云服务器使用的小误区

​  当前&#xff0c;在海外市场的发展下&#xff0c;香港云服务器被推的火热。一方面&#xff0c;您可以根据需要积极利用它的免备案和国际线路等特性&#xff0c;另一方面&#xff0c;也可以借助它&#xff0c;使用尽可能多或尽可能少的存储空间&#xff0c;您的业务也可以…

高校教务系统登录页面JS分析——合肥工业大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…

干货分享|超全项目管理流程PPT汇总

我是胖圆&#xff0c;欢迎大家关注留言~ 或者移步公众号【胖圆说PM】找我~

linux放开8080端口

linux放开8080端口 输入命令&#xff1a; 查看8080端口是否开放 firewall-cmd --query-port8080/tcpno显示端口未打开&#xff0c;yes表示开启&#xff0c;linux开启防火墙默认关闭8080端口 这里是引用&#xff1a;https://blog.csdn.net/weixin_54067866/article/details/1…

虹科AR VIP研讨会 | 数字世界,视觉无界,诚邀您前来体验!

文章来源&#xff1a;虹科数字化AR 点击阅读原文&#xff1a;https://mp.weixin.qq.com/s/Q1YbpD0Mxq-KctOMALM0AA 点击链接报名&#xff1a;https://mp.weixin.qq.com/s/Q1YbpD0Mxq-KctOMALM0AA 主题速览 01 医疗保健的未来趋势&#xff1a;透过智能眼镜成像技术改善微创手术…

WorkPlus AI智能助理,基于GPT为企业提供专属的私有化部署解决方案

在当今数字时代&#xff0c;优质的客户服务是企业取得成功的重要因素之一。随着人工智能技术的不断发展&#xff0c;私有化部署AI智能客服成为企业提高客户体验、提升服务效率的新途径。WorkPlus作为领先的品牌&#xff0c;专注于提供可信赖的私有化部署解决方案&#xff0c;助…

物联网23届毕业了不想干Java转嵌入式可行吗?

物联网23届毕业了不想干Java转嵌入式可行吗? 可以的&#xff0c;现在嵌入式物联网的就业前景是比较不错的&#xff0c;物联网和嵌入式是相结合的&#xff0c;题主是电子信息工程专业的&#xff0c;小谷建议你学习嵌入式物联网&#xff0c;其覆盖的范围还是比较广的&#xff0c…

day04_方法_数组

今日内容 方法数组基础 复习 0 if(){ }else{ } if(){ }else if(){ }else if(){ }else{ } 1 循环的四要素 初始值,控制条件,迭代,循环体 2 迭代什么意思 迭代: 一次次的变化 3 for循环执行流程 (小红旗) for(int i 1;i < 11;i){ } 4 break,continue,return分别什么作用 brea…

正规的股票杠杆公司排名:安全的五大加杠杆的股票平台排行一览

在股票市场中&#xff0c;利用杠杆效应可以放大投资者的收益。然而&#xff0c;选择一个正规、可靠的杠杆公司至关重要。本篇文章将根据配查信、尚红网、倍悦网、兴盛网、诚利和、嘉正网、广瑞网、富灯网、天创网、恒正网、创通网等媒体提供的信息&#xff0c;分析并整理出正规…

我们用i.MX8M Plus开发了一个人工智能机器人小车,欢迎围观~

i.MX8M Plus的人工智能机器小车功能 AGV 小车是基于 i.MX8M Plus 为主控实现的一款双驱差速小车。从上到下由摄像头、舵机控制板、舵机、i.MX8M Plus 核心板与底板、电池、电机、轮子等组成。 i.MX8M Plus 有以下 5 个职责&#xff1a; 控制小车电机&#xff0c;负责控制小车…

智能洗衣管理系统中的RFID技术应用

一、行业背景 当前&#xff0c;酒店、医院、浴场以及专业洗涤公司面临着大量工作服和布草的交接、洗涤、熨烫、整理和储存等工序&#xff0c;如何有效地跟踪管理每一件布草的洗涤过程、洗涤次数、库存状态和布草归类等成为了一个巨大的挑战&#xff1a; 1、传统的纸面洗涤任务…

CentOS 7 基于C 连接ZooKeeper 客户端

前提条件&#xff1a;CentOS 7 编译ZooKeeper 客户端&#xff0c;请参考&#xff1a;CentOS 7 编译ZooKeeper 客户端 1、Docker 安装ZooKeeper # docker 获取zookeeper 最新版本 docker pull zookeeper# docker 容器包含镜像查看 docker iamges# 准备zookeeper 镜像文件挂载对…

相机噪声评估

当拥有一个相机&#xff0c;并且写了一个降噪的算法&#xff0c;想要测试降噪的应用效果。 相机在光线不足的情况下产生噪点的原因主要与以下几个因素有关&#xff1a; 感光元件的工作原理&#xff1a;相机的图像传感器是由数百万甚至数千万的感光元件&#xff08;如CMOS或CC…

论文研读|Robust Watermarking of Neural Network with Exponential Weighting

目录 论文信息文章简介研究动机查询修改攻击Auto-Encoder训练水印图像检测检测结果 水印图像重构 研究方法水印生成水印嵌入版权验证 实验结果保真度&#xff08;Fidelity&#xff09;有效性&#xff08;Effectiveness&#xff09;&鲁棒性&#xff08;Robustness&#xff0…

Apipost自动化测试

Apipost提供可视化的API自动化测试功能&#xff0c;使用Apipost研发人员可以设计、调试接口&#xff0c;测试人员可以基于同一数据源进行测试&#xff0c;Apipost 接口自动化功能在上次更新中进行了逻辑调整&#xff0c;带来更好的交互操作、更多的控制器选择&#xff0c;同时新…

【数据结构】深入探讨二叉树的遍历和分治思想(一)

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;数据结构 &#x1f525;该文章主要讲述二叉树的递归结构及分治算法的思想。 目录&#xff1a; &#x1f30d;前言&#xff1a;&#x1f30d;…