一次性了解C语言中文件和文件操作

news2024/11/30 11:39:59
P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。
P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。

  

文件及文件操作

  • 前言
  • 1. 文件分类
    • 1.1 文本文件
    • 1.2 二进制文件
    • 1.3 文本文件和二进制文件的区别
  • 2. 文件的打开和关闭
    • 2.1 文件指针
    • 2.2 文件的打开与关闭
    • 2.3 文件的打开模式(即文件打开后进行的操作)
    • 2.4 文件的顺序读写及文件顺序读写函数介绍
      • 2.4.1 fputc
      • 2.4.2 fgetc
      • 2.4.3 fputs
      • 2.4.4 fgets
      • 2.4.5 fprintf
      • 2.4.6 fscanf
      • 2.4.7 fwrite
      • 2.4.8 fread
  • 3. 文件的随机读写
    • 3.1 fseek
    • 3.2 ftell
  • 4. ⽂件读取结束的判定
    • 4.1 被错误使用的feof
  • 5. 结语



前言


  我们在使用VS书写代码的时候会发现,在每一次运行后,代码里的数据都会被清空,好像没有存在过一样,这是因为我们的代码实在内存上运行的,其数据相关的内容也会在内存上暂存,如果需要将数据保存下来,就需要储存到硬盘中,这里我们就可以运用到“文件”了,我们通过打开,读写等方式对文件进行操作,就可以将数据内容存储到文件中,即使程序运行完毕,我们的数据也不会消失,先看一个例子吧。
#include <stdio.h>
int main()
{
	//打开文件
	FILE* p = fopen("test.txt", "w");
	if (p == NULL)
	{
		perror("fopen");
		return 1;
	}

	//写文件
	fputs("C is best!", p);

	//关闭文件
	fclose(p);
	p = NULL;

	return 0;
}

  在我们运行了这段代码后,在我们本次代码的目录下会生成一个 “ test.txt ” 文件,并将 " C is best! " 写入文件中,在代码运行完毕后,这段文字也不会消失。
在这里插入图片描述
  而上文只是做一个演示,下面我们具体来了解C语言中文件操作相关的内容。
在这里插入图片描述



1. 文件分类


  在我们C语言中,文件分为二进制文件和文本文件。
  文本文件:在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件。
  二进制文件:数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的⽂件中,就是⼆进制⽂件。

1.1 文本文件


  我们将数据以ASCII码的形式储存在文件中,此时我们的文件就可以称之为文本文件。
  用通俗的大白话来说就是,文本文件我们是可以看得懂的。
  例如

在这里插入图片描述


1.2 二进制文件


  而二进制的文件,是将数据以二进制的形式存储到文件中,这时的文件即使我们打开了,也会发现是一段根本看不懂的乱码,这是因为二进制文件是给机器看的,而不是面向用户的。

在这里插入图片描述

1.3 文本文件和二进制文件的区别


  在上文中我们看到的两种文件类型,那可能会有未来的资深程序猿问了,写代码就是为了给用户看的,那为何不直接全部以ASCII码的形式存储,这样都能看得懂呢?
  这就不得不引入一个例子了。
  例如:我们要把数字5存储到文件中。

在这里插入图片描述
  我们能看到存储5的时候如果用ASCII的形式存储只会使用1个字节的内存,但如果使用二进制存储却会使用四个字节,确实,ASCII的形式会节省空间。


  那我们如果要存储10000到文件中呢?

在这里插入图片描述
  我们发现如果将10000以ASCII的形式存储到文件中用了五个字节的内存空间,反而比二进制的方式更多。


  所以,这两种存储数据的方式并无好坏之分,区别就在于存储的数据是什么样的,如果我们能在存储数据的时候选择更加高效的存储方式,那便会提高我们的代码效率。



2. 文件的打开和关闭


  在了解文件的打开和关闭时,我们需要先了解一个概念——流。
  作为一个高度抽象的概念插入到我们的C语言学习中,我们可以将流理解为一个传送带,我们需要存放数据时,将数据内容放到传送带(即流)上,存储的目标就会从这条传送带上拿取数据。在获取数据时也是一样的道理。
  在C语言中,我们在输入输出数据时,并不需要手动的打开流,因为在程序启动时,我们的编译器就会默认的打开三个流。
  即

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

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

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

  而拥有了这三个流,我们就可以将数据通过 scanf 和 printf 进行操作了。


2.1 文件指针


  文件在C语言中又是如何定义的呢,其实在我们的头文件 stdio.h 中就有文件的定义。
struct _iobuf {
	char *_ptr;
	int _cnt;
	char *_base;
	int _flag;
	int _file;
	int _charbuf;
	int _bufsiz;
	char *_tmpfname;
};
typedef struct _iobuf FILE;

  在头文件 stdio.h 中会有一个结构体类型的声明,在结构体中存放了这个文件的各种信息,这里我们先不做了解,但可以看到最后,将文件类型重新定义为了FILE。

  所以我们在平时的使用中,就可以通过FILE来创建指针,代表着文件的地址,进而对文件进行一系列的操作,


2.2 文件的打开与关闭


  在对文件进行操作的时候,我们需要先将文件打开,在操作完成后,也需要对文件进行关闭,并将代表文件地址的指针置为空指针,避免其成为野指针,
  这就好比我们生活中需要洗漱的时候,我们要先打开水龙头,然后洗漱,最后再关闭水龙头,一步一步地进行,而良好的操作文件的习惯,也会使我们的代码更低概率的出现错误。

  我们通过fopen来打开文件,通过fclose来关闭文件。

	FILE* p = fopen("test.txt", "w");
	                    ↑        ↑
	        需要打开的文件名   打开后进行的操作
	fclose(p);//再关闭文件时只需将存放文件地址的指针传入即可
	       ↑
	  代表文件地址的指针
	p = NULL;//对指针进行置空操作。!!良好的习惯!!

2.3 文件的打开模式(即文件打开后进行的操作)


⽂件使⽤⽅式含义如果指定⽂件不存在
“r”(只读)为了输⼊数据,打开⼀个已经存在的⽂本⽂件出错
“w”(只写)为了输⼊数据,打开⼀个⽂本⽂件建⽴⼀个新的⽂件
“a”(追加)向⽂本⽂件尾添加数据建⽴⼀个新的⽂件
“rb”(只读)为了输⼊数据,打开⼀个⼆进制⽂件出错
“wb”(只写)为了输出数据,打开⼀个⼆进制⽂件建⽴⼀个新的⽂件
“ab”(追加)向⼀个⼆进制⽂件尾添加数据建⽴⼀个新的⽂件
“r+”(读写)为了读和写,打开⼀个⽂本⽂件出错
“w+”(读写)为了读和写,建议⼀个新的⽂件建⽴⼀个新的⽂件
“a+”(读写)打开⼀个⽂件,在⽂件尾进⾏读写建⽴⼀个新的⽂件
“rb+”(读写)为了读和写打开⼀个⼆进制⽂件出错
“wb+”(读写)为了读和写,新建⼀个新的⼆进制⽂件建⽴⼀个新的⽂件
“ab+”(读写)打开⼀个⼆进制⽂件,在⽂件尾进⾏读和写建⽴⼀个新的⽂件

  上面是打开文件进行操作的方式,每一次打开文件只能有一种操作方式。
  值得注意的是,如果我们在读文件的时候,打开的文件并不存在,那么代码就会报错从而停止运行。
  但如果是写文件的时候,如果文件不存在,那么就会在根目录下创建一个新的文件,并进行操作,但如果使用“w” 或 “wb” 进行写操作时,如果原文件中存在数据内容,那么这个操作将会将原文件中的内容清空,并进行新一轮的写操作。
  其余的文件使用方式大家可以对照上表进行了解。

2.4 文件的顺序读写及文件顺序读写函数介绍


  下面说的适⽤于所有输⼊流⼀般指适⽤于标准输⼊流和其他输⼊流(如⽂件输⼊流);所有输出流⼀般指适⽤于标准输出流和其他输出流(如⽂件输出流)。
函数名功能适用于
fgetc字符输⼊函数所有输⼊流
fputc字符输出函数所有输⼊流
fgets⽂本⾏输⼊函数所有输⼊流
fputs⽂本⾏输出函数所有输⼊流
fscanf格式化输⼊函数所有输⼊流
fprintf格式化输出函数所有输⼊流
fread二进制输入文件
fwrite二进制输出文件

  下面我们一个一个进行介绍

2.4.1 fputc


在这里插入图片描述

int main()
{
	FILE* p = fopen("text.txt", "w");
	if (p == NULL)
	{
		perror("fopen");
		return 1;
	}
	fputc('a', p);

	fclose(p);
	p = NULL;

	return 0;
}

  我们通过将需要写入的字符和代表文件地址的指针p传给fputc函数,即可将字符输入到文件中。
在这里插入图片描述


2.4.2 fgetc


在这里插入图片描述
  再上一个操作读写函数中,我们已经将字符a存入到文件中,这时我们就可以用fgetc来获取文件中的字符,并将其存储到字符型变量n中,并打印到屏幕上

int main()
{
	FILE* p = fopen("text.txt", "r");
	if (p == NULL)
	{
		perror("fopen");
		return 1;
	}
	char n = fgetc(p);

	printf("%c\n", n);

	fclose(p);
	p = NULL;

	return 0;
}

在这里插入图片描述


2.4.3 fputs


在这里插入图片描述
  我们可以将一个字符串的首地址或直接在括号内写入一个字符串,以及代表文件地址的指针传给函数fputs,进而将数据存储到文件中。

int main()
{
	FILE* p = fopen("text.txt", "w");
	if (p == NULL)
	{
		perror("fopen");
		return 1;
	}
	fputs("C is best!",p);

	fclose(p);
	p = NULL;

	return 0;
}

在这里插入图片描述


2.4.4 fgets


在这里插入图片描述

  上一个操作符在使用的时候我们将“ C is best! ” 存入到了文件中,我们可以通过fgets函数将文件中的num-1个字符存储到字符型数组中,并将其打印出来。

int main()
{
	FILE* p = fopen("text.txt", "r");
	if (p == NULL)
	{
		perror("fopen");
		return 1;
	}
	char arr[15] = { 0 };
	fgets(arr,15, p);
	printf("%s\n", arr);

	fclose(p);
	p = NULL;

	return 0;
}

在这里插入图片描述


2.4.5 fprintf


在这里插入图片描述
  在我们日常输入数据时,会将数据以指定格式输入,例如整型,浮点型等,此函数的功能就是将这些数据都一视同仁,统统格式化为字符型写入到文件之中。

int main()
{
	FILE* p = fopen("text.txt", "w");
	if (p == NULL)
	{
		perror("fopen");
		return 1;
	}
	fprintf(p, "%d %d %s", 100, 200, "abcd");

	fclose(p);
	p = NULL;

	return 0;
}

在这里插入图片描述
  此时文件中的 100 和 200 已经不再是整型了,而是六个字符型。


2.4.6 fscanf


在这里插入图片描述
  上文中我们将 100 和 200 以及 abcd存储到文件中,但文件中的数据都是字符型的,我们可以将其通过fscanf函数将其以特定格式存储到指定的参数中。例如

int main()
{
	FILE* p = fopen("text.txt", "r");
	if (p == NULL)
	{
		perror("fopen");
		return 1;
	}
	int a = 0;
	int b = 0;
	char arr[10] = { 0 };
	fscanf(p, "%d %d %s", &a, &b, arr);
	printf("%d %d %s\n", a, b, arr);

	fclose(p);
	p = NULL;

	return 0;
}

在这里插入图片描述


2.4.7 fwrite


在这里插入图片描述
  此函数为二进制写入函数,故写入的数据会转换为二进制存储到文件中,我们可以通过fread来读取二进制文件内容。

int main()
{
	FILE* p = fopen("text.txt", "wb");
	if (p == NULL)
	{
		perror("fopen");
		return 1;
	}
	int arr[5] = { 1,2,3,4,5 };
	fwrite(arr, sizeof(int), sizeof(arr), p);

	fclose(p);
	p = NULL;

	return 0;
}

在这里插入图片描述


2.4.8 fread


在这里插入图片描述
  这个函数就可以帮助我们将上一个函数存储的信息进行读操作了,并且我们可以将它打印出来。

int main()
{
	FILE* p = fopen("text.txt", "rb");
	if (p == NULL)
	{
		perror("fopen");
		return 1;
	}
	int arr[5] = { 0 };
	fread(arr, sizeof(int), sizeof(arr), p);
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", arr[i]);
	}

	fclose(p);
	p = NULL;

	return 0;
}

在这里插入图片描述


  到此我们就将文件操作相关的基本函数了解了大概,但还需给看官补充一些有关文件的随机读写的函数。



3. 文件的随机读写


  上文中的文件操作函数,只能按照顺序对文件内容进行读写,那我们如果想要制定一个位置来读写呢?
  例如:文件中存放了字符串abcde,如果按照顺序读写的话在读取a后只能读取b,那我们如何在读取到a后读取e呢?这就用到了我们下面讲的文件随机读写函数。

3.1 fseek

在这里插入图片描述
  对于此函数,我们分别传文件的地址和对于指定位置的偏移量(offset)以及指定位置(origin)三个参数。这就要引入下表中的信息。

指定位置名含义
SEEK_CUR文件指针当前位置
SEEK_END文件指针的结尾
SEEK_SET文件指针的开头

  那具体怎么操作呢?

int main()
{
	FILE* p = fopen("example.txt", "wb");
	if (p == NULL)
	{
		perror("fopen");
		return 1;
	}
	fputs("This is an apple.", p);
	fseek(p, 9, SEEK_SET);
	fputs(" sam", p);
	fclose(p);
	p = NULL;
	return 0;
}

在这里插入图片描述

  我们可以看到原本p中存放了 This is an apple. 的字符串,在我们通过使用fseek函数后,将文件指针位置以文件起始位置为起点,偏移量为9进行移动,从而得到了“ n apple ”的首地址,再将 sam 存入其中,故最后文件中存放的数据就是 This is a sample 的字符串。

3.2 ftell


在这里插入图片描述  这个函数的功能就比较简单了,我们在存放完数据后,将p指针传给函数ftell,其返回值就代表着此时文件指针相对于文件开头的偏移量了。

int main()
{
	FILE* p = fopen("example.txt", "wb");
	if (p == NULL)
	{
		perror("fopen");
		return 1;
	}
	fputs("This is an apple.", p);
	int n = 0;
	n = ftell(p);
	printf("%d\n", n);

	fclose(p);
	p = NULL;
	return 0;
}

在这里插入图片描述


## 3.3 rewind

在这里插入图片描述
  此函数可以让文件指针无论身处何处,都能重置为文件的开头位置。

int main()
{
	FILE* p = fopen("example.txt", "w");
	if (p == NULL)
	{
		perror("fopen");
		return 1;
	}
	fputs("Lili love C!", p);
	rewind(p);
	fputs("Stiv", p);

	fclose(p);
	p = NULL;
	return 0;
}

在这里插入图片描述
  代码中原本是Lili love C!,在我们完成第一次写入时,使用rewind让文件指针回到起始位置,在进行Stiv的写入。最终,文件中存储的内容就是 Stiv love C!了。



4. ⽂件读取结束的判定


4.1 被错误使用的feof


  牢记:在⽂件读取过程中,不能⽤feof函数的返回值直接来判断⽂件的是否结束。

  feof 的作⽤是:当⽂件读取结束的时候,判断是读取结束的原因是否是:遇到⽂件尾结束

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

  例如:

   fgetc 判断是否为 EOF .

   fgets 判断返回值是否为 NULL .

  2. ⼆进制⽂件的读取结束判断,判断返回值是否⼩于实际要读的个数。

  例如: fread判断返回值是否⼩于实际要读的个数。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
	int c; // 注意:int,⾮char,要求处理EOF
	FILE* fp = fopen("test.txt", "r");
	if(!fp) 
	{
		perror("File opening failed");
		return EXIT_FAILURE;
	}
	//fgetc 当读取失败的时候或者遇到⽂件结束的时候,都会返回EOF
	while ((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);
}

在这里插入图片描述



5. 结语


  十分感谢您观看我的原创文章。
  本文主要用于个人学习和知识分享,学习路漫漫,如有错误,感谢指正。
  如需引用,注明地址。

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

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

相关文章

Docker镜像逆向生成Dockerfile

你是否曾经遇到过一个想要使用的 Docker 镜像&#xff0c;但却无法修改以适应你的特定需求&#xff1f;或者你可能发现了一个喜欢的 Docker 镜像&#xff0c;但想要了解它是如何构建的&#xff1f;在这两种情况下&#xff0c;将 Docker 镜像逆向生成一个 Dockerfile 可以使用一…

基于jsp+mysql+Spring的SpringBoot招聘网站项目

基于jspmysqlSpring的SpringBoot招聘网站项目&#xff08;完整源码sql&#xff09;主要实现了管理员登录,简历管理,问答管理,职位管理,用户管理,职位申请进度更新,查看简历 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀…

Science Robotics 逼真面部表情的机器人

人类可以产生数千种不同的面部表情来传达无数微妙的情绪状态&#xff0c;这种能力是人类社会互动中最有效和最有效的界面之一。在 2019 年冠状病毒病流行期间&#xff0c;口罩使社交互动变得尴尬&#xff0c;因为它们掩盖了面部表情。同时&#xff0c;当摄像机打开时&#xff0…

蓝桥杯单片机---第十届省赛题目解析

文章目录 比赛题目一、代码相关定义、声明1.头文件声明2.变量声明 二、主要函数1.main函数2.按键扫描3.数码管显示4.LED显示5.定时器中断 三、次要函数1.初始化函数Init2.按键函数Key3.LED函数Led4.数码管函数Seg5.iic函数中6.onewire函数中 总结 比赛题目 这里因为我没有这个题…

TouchGFX之图像

touchgfx提供的几种图像控件 1.Image&#xff08;图像&#xff09; TouchGFX中的图像会绘制关联图像文件中的像素数据。 使用图像文件前&#xff0c;必须将其导入到项目中。 图像大小是由关联的图像文件定义的&#xff0c;不能在运行时改动。 如果需要将图像显示为不同大小&…

C++链表(上)

【1】概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 (图片为转载&#xff09; 优点&#xff1a;链表的插入操作更快&#xff08; O(1) &#xff09;&#xff0c;无需预先分配内存空间 …

基于JSPM的美食推荐管理系统

背景 互联网的迅猛扩张彻底转变了全球各类组织的运营模式。自20世纪90年代起&#xff0c;中国各级政府和企事业单位便开始探索运用网络系统来处理管理事务。然而&#xff0c;早期的网络覆盖不广、用户接受度不高、相关网络法规不健全以及技术发展不成熟等因素&#xff0c;都曾…

蒙特卡诺法计算不规则图形的面积

结课大作业题目自拟&#xff1a; 利用蒙特卡诺法计算不规则图形的面积&#xff0c;由于题目自拟&#xff0c;所以选择用椭圆来表示待测面积的不规则图形。 代码实现&#xff1a; %%先绘制一个椭圆 a5;%长轴 b2;%短轴 f(x,y) x.^2/a^2 y.^2/b^2-1;%椭圆方程 fimplicit(f,Lin…

Golang线上内存爆掉问题排查(pprof)

Golang线上内存爆掉问题排查&#xff08;pprof&#xff09; 1 问题描述 某天&#xff0c;售后同事反馈&#xff0c;我们服务宕掉了&#xff0c;客户无法预览我们的图片了。 我们预览图片是读取存储在我们S3服务的数据&#xff0c;然后返回给前端页面展示。因为客户存在几百M的…

《HelloGitHub》第 96 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 https://github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 …

在遭受攻击时如何有效监测服务器流量峰值——实战指南

引言 在网络安全领域&#xff0c;分布式拒绝服务攻击&#xff08;DDoS&#xff09;是一种常见的针对服务器及网络资源的恶意行为&#xff0c;它通过短时间内发送大量无效请求&#xff0c;导致服务器不堪重负而无法正常服务合法用户。当服务器遭受攻击时&#xff0c;快速识别并…

kubernetes(K8S)学习(五):K8S进阶(Lifecycle......偏理论)

K8S进阶&#xff08;Lifecycle......偏理论&#xff09; 一、Pod进阶学习之路1.1 Lifecycle1.2 重启策略1.3 静态Pod1.4 健康检查1.5 ConfigMap1.6 Secret1.7 指定Pod所运行的Node 二、Controller进阶学习之路2.1 Job & CronJob2.2 StatefulSet2.3 DaemonSet2.4 Horizontal…

拖拉拽做游戏?轻松打造个人掌机世界 | 开源日报 No.176

chrismaltby/gb-studio Stars: 7.8k License: MIT gb-studio 是一个快速、易于使用的拖放式复古游戏创建器&#xff0c;适用于您最喜爱的掌上游戏机系统。 该项目主要功能、关键特性和核心优势包括&#xff1a; 快速且易于使用使用 Electron 游戏构建应用程序和基于 C 的 GBD…

无尘布的多重应用:保持洁净,细致无遗

在现代社会中&#xff0c;随着科技的不断进步和人们对卫生环境要求的提高&#xff0c;无尘布作为一种多功能的擦拭材料&#xff0c;正被广泛应用于各种需要高洁净度环境的领域。其多重应用不仅为电子行业、医疗行业、生物工程和光学仪器等专业领域提供了便利&#xff0c;同时也…

在项目中缓存如何优化?SpringCache接口返回值的缓存【CachePut、CacheEvict、Cacheable】

SpringCache 介绍&#xff08;不同的缓存技术有不同的CacheManager&#xff09;注解入门程序环境准备数据库准备环境准备注入CacheManager引导类上加EnableCaching CachePut注解(缓存方法返回值)1). 在save方法上加注解CachePut2). 测试 CacheEvict注解&#xff08;清理指定缓存…

系统资源紧缺?不用担心,Linux命令和Shell脚本帮你搞定

在之前的文章中介绍了如何申请AWS免费主机使用WordPress搭建自己的个人网站&#xff0c;但是在我使用过程中发现了一个问题&#xff0c;由于陆陆续续安装了好几个插件&#xff0c;偶尔在访问网站时会出现数据库连接出错的异常情况&#xff0c;导致页面无法访问。稍等一会儿刷新…

想做跨境电商测评自养号需要满足什么条件?

测评对于卖家来说算是一种低成本&#xff0c;高回报的推广营销方式&#xff0c;对于商品流量&#xff0c;转化率&#xff0c;关键词质量分&#xff0c;链接权重等都起到了一定的辅助作用&#xff0c;但凡事都有好坏&#xff0c;倘若处理不得当&#xff0c;很容易影响店铺&#…

如何将Maven与TestNG集成

我们已经讨论了如何在maven中执行单元测试用例&#xff0c;但那些是JUnit测试用例&#xff0c;而不是TestNG。当maven使用“mvn test”命令进入测试阶段时&#xff0c;这些用例被执行。 本文将介绍如何将Maven与TestNG集成&#xff0c;并在maven进入测试阶段时执行TestNG测试。…

聚酰亚胺PI材料难于粘接,用什么胶水粘接?那么让我们先一步步的从认识它开始(十三): 聚酰亚胺PI纤维的缺点

聚酰亚胺PI纤维的缺点 聚酰亚胺PI纤维虽然是一种具有许多优异特性的高性能纤维&#xff0c;但也存在一些缺点和局限性&#xff0c;这些缺点可能会影响其在某些应用领域的适用性。主要缺点包括&#xff1a; 1.成本高&#xff1a;聚酰亚胺PI纤维的生产过程复杂&#xff0c;原料成…

无药可医还能怎么办?越没本事的人,越喜欢从别人身上找原因!——早读(逆天打工人爬取热门微信文章解读)

无药可医的病该怎么办呢&#xff1f; 引言Python 代码第一篇 洞见 《骆驼祥子》&#xff1a;越没本事的人&#xff0c;越喜欢从别人身上找原因第二篇 人民日报 来啦 新闻早班车要闻社会政策 结尾 “吾日三省吾身&#xff0c;而后深知自助者天助之。” 在人生的迷宫中 遭遇困境时…