【C语言进阶】通讯录再优化?学会文件操作,没有数据库也能保存和管理本地数据

news2024/9/25 9:40:43

目录

🥝前言🥝:

一、🍓文件概述🍓:

        1.为什么使用文件:

        2.什么是文件:

        ①.程序文件:

        ②.数据文件:

        ③.文件名:

二、🍊文件顺序读写🍊:

        1.文件的打开和关闭:

        ①.文件指针:

        ②.文件的打开与关闭:

        2.文件的顺序读写:

三、🍋文件随机读写🍋:

        1.fseek 函数:

        2.ftell 函数:

        3.rewind 函数:

🍒总结🍒:


🛰️博客主页:✈️銮同学的干货分享基地

🛰️欢迎关注:👍点赞🙌收藏✍️留言

🛰️系列专栏:💐【进阶】C语言学习

🛰️代码仓库:🎉VS2022_C语言仓库

        家人们更新不易,你们的👍点赞👍和⭐关注⭐真的对我真重要,各位路过的友友麻烦多多点赞关注,欢迎你们的私信提问,感谢你们的转发!

        关注我,关注我,关注我,你们将会看到更多的优质内容!!


🏡🏡 本文重点 🏡🏡:

🚅 文件概述 🚃 文件顺序读写 🚃 文件随机读写🚏🚏

🥝前言🥝:

        前面我们已经完成了对C语言各语法原理与使用的进阶,而这节课我们将要尝试通过学习文件操作,来提升我们的程序功能实现的能力,帮助我们更好的处理程序目标要求。废话不多说我们这就进入今天的学习吧!

一、🍓文件概述🍓:

        1.为什么使用文件:

        前面我们在学习了结构体之后,写出了一个阶段性综合练习程序——通讯录。当我们将我们写出的通讯录运行起来后,我们可以在通讯录内完成增加、删除、修改和查询联系人信息等操作。

        但是,我们此时进行的所有操作都是在计算机内存中进行的,并且我们所操作的数据也是存放在计算机内存中的一旦我们退出了程序,内存空间就会被释放并回收,而这个过程中我们所操作的所有的数据也将不复存在。如此,我们无法将数据真正保留下来,只能在每次运行程序时重新进行输入,重新录入联系人信息,这样的通讯录使用起来极为不便。

        所以,我们的目的便是希望将数据保留在本地,只有当我们进行删除操作时,才将对应的数据删除掉,即尝试实现数据的持久化。而我们实现数据持久化的方式一般有两种:使用数据库或将数据存放至本地磁盘中。

        目前我们还没有接触到数据库的知识,于是我们便通过学习文件操作,来将我们的数据存放至我们计算机的本地硬盘中,从而实现数据的持久化。

        2.什么是文件:

        我们通常所说的文件,一般是指存放在我们计算机本地硬盘上的文件。但是在我们的程序设计中,则指的是程序文件数据文件两种文件(根据文件功能分类)。

        ①.程序文件:

程序文件主要包括源程序文件目标文件可执行程序文件

        源程序文件(后缀为 .c):

        目标文件( Windows 环境下后缀为 .obj):

        可执行程序文件( Windows 环境下后缀为 .exe):

        ②.数据文件:

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

        而我们今天所讨论的,正是这些数据文件的相关操作。

        在前面所有内容的学习中,我们所有的输入输出,其操作对象都是终端,均为从键盘读取输入内容,并将处理结果输出致我们的计算据显示器上进行反馈。而今天我们的目的则是将数据信息输入至我们的本地磁盘上,而当我们想要对数据进行操作时,再从本地硬盘进行读取

        ③.文件名:

        文件和我们人类有自己的名字籍贯一样,也需要有一个文件标识符,而为了方便起见我们常常将这个文件标识符称为文件的文件名,文件名的存在就是为了便于我们进行识别和引用

        而一个文件的文件名由三部分组成:文件路径 + 文件名主干 + 文件后缀

        以文件名“ c:\code\test.txt ”为例:

文件路径为“ c:\code\ ”,表示文件存放在硬盘 C 盘下的 code 文件夹内。

文件名主干为“ test ”,表示该文件的文件名为 test。

文件后缀为“ .txt ”,表示该文件的文件类型为文本文件。

二、🍊文件顺序读写🍊:

        1.文件的打开和关闭:

        我们在使用或操作我们的文件之前,首先需要在我们的程序中及将其打开,于是我们就来研究一下文件的打开和关闭方式。

        ①.文件指针:

        在我们开始研究文件的打开和关闭之前,我们首先就需要了解一下文件指针这个概念,这是因为不光是文件的打开与关闭,包括后面我们在对我们的文件进行操作时,也都是通过文件指针实现的

        在我们的缓冲文件系统中,最最关键的一个概念就是“ 文件类型指针 ”,即我们通常所说的“ 文件指针 ”。并且我们要知道,我们使用的每一个文件都在内存中开辟了相应的文件信息区,用于存放该文件的相关信息,并且这些信息都保存在一个结构体变量中

        并且这样的结构体类型是有系统声明的,取名为 FILE。

        例如在 Visual Studio 的头文件 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 结构变量,就是通过一个 FILE 类型文件指针类进行调用和维护的。

FILE* p;
//定义一个文件指针p

        像这样,我们就能创建出一个文件指针,而接下来就可以使这个文件指针 p 指向某个文件信息区(FILE 类型的结构体变量),并通过该文件信息区中所保存的信息来访问本地硬盘内的文件了。换句话说,我们通过使用文件指针就可以找到与其相关联的文件了

        ②.文件的打开与关闭:

        我们应当在读写文件之前打开文件,并在文件读写结束后关闭文件。同时 ANSIC 规定,使用 fopen 函数(file open)来打开文件,用 fclose 函数(file open)来关闭文件。

        fopen 函数的使用方式为:

FILE* p = fopen(const char* filename, const char* mod);

 其中“ const char* filename ”指文件名(是字符串,文件名即文件标识符)。

其中“ const char* mod ”指文件打开模式(也是字符串,后面会为大家列出)。

        例如:

int main()
{
	//打开文件:
	FILE* p = fopen("test.txt", "r");
	//以"r",即只读模式打开文件c:\code\test.txt
    //默认路径为.c文件同目录下
	if (p == NULL)
	//判断文件打开是否成功
	{
		perror("FILEOPEN");
		//打开失败打印错误原因并退出
		return 1;
	}
    printf("success\n");

	return 0;
}

        fclose 函数的使用方式为:

fopen(FILE* strname);

“ FILE* strname ”指的是指向期望关闭文件的文件指针。

        例如:

int main()
{
	//打开文件:
	FILE* p = fopen("test.txt", "r");
	//以"r",即只读模式打开文件c:\code\test.txt
	if (p == NULL)
	//判断文件打开是否成功
	{
		perror("FILEOPEN");
		//打开失败打印错误原因并退出
		return 1;
	}
	printf("success\n");
	//验证文件是否成功打开

	fclose(p);
	p = NULL;
	if (p == NULL)
	{
		printf("SUCCESS\n");
		//验证文件是否成功关闭
	}

	return 0;
}

        因为我们在打开文件时没有特意注明路径,则默认路径为 .c 文件的同目录下。为了验证我们代码的正确性,我们在该目录下创建“ test.c ”文件用于代码测试:

        接下来我们将我们上面的代码编译运行查看文件打开与关闭的操作结果:

        在上面的代码中,创建成功才会打印字符串“ success ”,可以得出结论文件打开成功;同时只有当文件完成关闭操作并完成指针置空后才会打印字符串“ SUCCESS ”。于是我们可以得知我们的文件打开与关闭操作成功完成。

        ③.文件打开模式:

        文件打开模式没有要点,这里仅整理成表格供大家查阅(三个一组)

        (注:优先了解前三种,二进制文件操作很少使用)

文件打开模式含义文件不存在
r只读 -> 为了输入数据,打开已经存在的文件出错
w只写 -> 为了输出数据,打开文件建立新文件
a追加 -> 为了输出数据,打开文件建立新文件
rb只读 -> 为了输入数据,打开二进制文件出错
wb只写 -> 为了输出数据,打开二进制文件建立新文件
ab追加 -> 向二进制文件尾添加数据出错
r+读写 -> 为了读和写,打开文件出错
w+读写 -> 为了读和写,建立新的文件建立新文件
a+读写 -> 打开文件,在文件尾进行读写建立新文件
rb+读写 -> 为了读和写打开二进制文件出错
wb+读写 -> 为了读和写,建立新的二进制文件建立新文件
ab+读写 -> 打开二进制文件,在文件尾进行读写建立新文件

        2.文件的顺序读写:

        首先我为各位小伙伴们整理出了文件读写所使用的函数(两个一组)

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

        这其中较为常用的就是 fputc 函数与 fgetc 函数,我们一般就通过这两个函数来实现对文件内容的顺序读写

        这两个函数的使用方式为:

fputc(const char charname, FILE* strname);

fget(FILE* strname);

        我们来举例看看这两个函数的使用方式

        首先我们来看文本文件 test.txt 中的内容,即为空,没有内容:

        接下来我们使用“ 写 ”模式打开该文件,并在判断非空后使用 fputc 函数来进行顺序写入

int main()
{
    FILE* p = fopen("test.txt", "w");
    //文件打开模式为“写”
    if (p == NULL)
    {
    	perror("FILEOPEN");
	    return 1;
    }
    char ch = 'a';
    for (ch = 'a'; ch <= 'z'; ch++)
    {
    	fputc(ch, p);
        //使用 fputc 函数顺序写入小写字符a~z
    }

    free(p);
    p = NULL;

    return 0;
}

        我们等待程序编译运行并完成数据写入后关闭程序,这时我们来到本地文件中查看硬盘中本地文件的数据写入情况

        我们可以就看到本地文件中的内容已经实现了数据的顺序写入

        完成后我们再用“ ”模式打开该文件,并在判断非空后使用 fgetc 函数来顺序读取该文件中的内容

int main()
{
	FILE* p = fopen("test.txt", "r");
	//文件打开模式为“读”
	if (p == NULL)
	{
		perror("FILE_OPEN");
		return 1;
	}
	int ch = 0;
	while ((ch = fgetc(p)) != EOF)
	{
		printf("%c ", ch);
		//顺序读取文件指针pp指向文件内的信息并打印
	}

	fclose(p);
	p = NULL;

	return 0;
}

        然后我们将程序编译运行起来查看我们 fgetc 函数的读取结果

        我们可以清楚的看到,我们的程序实现了对本地数据的顺序写入与读取

        并且我们也可以使用 fputs 函数(区别于 fputc 函数)来实现字符串的顺序写入

int main()
{
	FILE* p = fopen("test.txt", "w");
	//文件打开模式为“写”
	if (p == NULL)
	{
		perror("FILE_OPEN");
		return 1;
	}
	
	fputs("The test TXT\n", p);
	//fputc 为写入字符,fouts 为写入字符串
	//只写入字符串内容,不会自动换行,想要换行需手动添加换行转义字符\n
	//并且在写入时,会覆盖原本的内容数据
	fputs("The test TXT", p);

	fclose(p);
	p = NULL;

	return 0;
}

        或使用 fgets 函数(区别于 fgetc 函数)来实现字符串的顺序读取

int main()
{
	FILE* p = fopen("test.txt", "r");
	//文件打开模式为“读”
	if (p == NULL)
	{
		perror("FILE_OPEN");
		return 1;
	}
	
	char arr[256] = { 0 };
	//定义字符数组用于存放读取到的字符串
	fgets(arr, 256, p);
	//从文件指针p指向文件处,读取最多256个字符,并将数据读取至字符数组arr中
	//该函数为按行读取,读取至换行转义符\n处主动停止并换行
	printf("%s", arr);
	//想要读取两行就需要使用两次fgets函数
	fgets(arr, 256, p);
	printf("%s", arr);

	fclose(p);
	p = NULL;

	return 0;
}

        而本文的最终目的,就是要结合文件操作将数据保存至本地硬盘中,从而实现对我们通讯录的使用进行优化,于是我们可以使用 fprintf 函数实现将结构体变量的内容保存至本地硬盘之中

typedef struct Contact
{
	char name[20];
	char sex[5];
	int age;
	char tele[11];
}con;

int main()
{
	FILE* p = fopen("test.txt", "w");
	//文件打开模式为“写”
	if (p == NULL)
	{
		perror("FILE_OPEN");
		return 1;
	}
	
	con c1 = { "銮同学","男",20,"123456789" };
	fprintf(p, "%s %s %d %s\n", c1.name, c1.sex, c1.age, c1.tele);
    //按照"%s %s %d %s\n"的格式将数据c1.name, c1.sex, c1.age, c1.tele写入至p所指向的文件内

	fclose(p);
	p = NULL;

	return 0;
}

        将程序编译运行结束后关闭,这时我们再去本地文件中查看会发现,数据已经成功的保存至本地硬盘中了

        并且我们也可以通过 fscanf 函数从本地硬盘文件中读取数据

typedef struct Contact
{
	char name[20];
	char sex[5];
	int age;
	char tele[11];
}con;

int main()
{
	FILE* p = fopen("test.txt", "r");
	//文件打开模式为“读”
	if (p == NULL)
	{
		perror("FILE_OPEN");
		return 1;
	}
	
	con c1 = { 0 };
	fscanf(p, "%s %s %d %s", c1.name, c1.sex, &(c1.age), c1.tele);
	//按照"%s %s %d %s"的格式,从p所指向的文件中将数据读取至c1.name, c1.sex, &(c1.age), c1.tele中
	printf("%s %s %d %s\n", c1.name, c1.sex, c1.age, c1.tele);

	fclose(p);
	p = NULL;

	return 0;
}

三、🍋文件随机读写🍋:

        在学会了顺序读写的同时,我们很多时候并不是要进行顺序读写,而是进行随机读写(伪随机,指不按照顺序依次进行读写)。为了实现这样的操作,我们就需要使用 fseek 、ftell 和 rewind 三个函数来帮助我们对这样的操作进行实现。

        1.fseek 函数:

★ fseek 函数的作用为,根据文件指针的位置和偏移量来定位文件指针。

        其使用格式为:

int fseek(FILE* strname, long int offset, int origin);

其中“ offset ”为相对于指针位置的指针偏移量

其中“ origin ”为指针位置,其参数有三种:“ SEEK_CUR ”表示文件指针当前位置“ SEEK_END ”表示文件末尾的位置“ SEEK_SET ”表示文件开始位置

        示例

int main()
{
	FILE* p = fopen("test.txt", "r+");
	//文件打开模式为“读写”
	if (p == NULL)
	{
		perror("FILE_OPEN");
		return 1;
	}
	
	char ch = 'a';
	for (ch = 'a'; ch <= 'z'; ch++)
	{
		fputc(ch, p);
		//使用 fputc 函数顺序写入小写字符a~z
	}

	fseek(p, 10, SEEK_SET);
	//使用fseek函数将文件指针从文件开始处(参数SEEK_SET表示文件起始位置)指向偏移量为10处
	//偏移量为正表示向后偏移,为负表示向前偏移

	char output;
	output = fgetc(p);
	//接下来进行读取时,继续向后读取一个字符,即字符k
	printf("%c\n", output);

	fclose(p);
	p = NULL;

	return 0;
}

        2.ftell 函数:

★ ftell 函数的作用为,返回文件指针相对于文件起始位置的偏移量。

        其使用格式为;

long int ftell(FILE* strname);

        示例

int main()
{
	FILE* p = fopen("test.txt", "r+");
	//文件打开模式为“读写”
	if (p == NULL)
	{
		perror("FILE_OPEN");
		return 1;
	}
	
	char ch = 'a';
	for (ch = 'a'; ch <= 'z'; ch++)
	{
		fputc(ch, p);
		//使用 fputc 函数顺序写入小写字符a~z
	}

	fseek(p, -5, SEEK_END);
	//使用fseek函数将文件指针从文件结尾处(参数SEEK_SET表示文件起始位置)指向偏移量为-5处
	//偏移量为正表示向后偏移,为负表示向前偏移

	long back = ftell(p);
	//定义整型变量用于接受并记录指针相对于起始位置的偏移量
	printf("指针相对于起始位置的偏移量为:%ld\n", back);

	fclose(p);
	p = NULL;

	return 0;
}

        3.rewind 函数:

★ rewind 函数的作用为,使文件指针位置返回文件的起始位置。

        其使用格式为:

void rewind(FILE* strname);

        示例

int main()
{
	FILE* p = fopen("test.txt", "r+");
	//文件打开模式为“读写”
	if (p == NULL)
	{
		perror("FILE_OPEN");
		return 1;
	}
	
	char ch = 'a';
	for (ch = 'a'; ch <= 'z'; ch++)
	{
		fputc(ch, p);
		//使用 fputc 函数顺序写入小写字符a~z
	}

	fseek(p, -5, SEEK_END);

	rewind(p);
	//使文件指针回归文件起始位置
	printf("%c\n", fgetc(p));
	//打印验证指针当前位置

	fclose(p);
	p = NULL;

	return 0;
}

🍒总结🍒:

        经过今天的学习我们就掌握了程序对本地文件的调用与读写,就可以通过文件操作,实现对本地文件的修改与维护,同时可以对我们的通讯录程序进行再修改,使得我们的通讯录能够将数据保存在本地而不用每次打开都需要重新进行录入,使其功能更加全面,使用更加方便,帮助我们写出更加优秀、完善的程序

        🔥🔥既然你已经认准一条道路,何必再去打听要走多久🔥🔥

        更新不易,辛苦各位小伙伴们动动小手,👍三连走一走💕💕 ~ ~ ~  你们真的对我很重要!最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!

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

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

相关文章

JAVA集成阿里云OSS对象存储

JAVA集成阿里云OSS对象存储1 : 配置集成1.1、对象存储OSS2 : 代码配置2.1、说明2.2、配置文件2.3、加载配置文件代码2.4、封装统一的DTO2.5、OSS上传Controller2.6、OSS上传Service2.7、OSS上传ServiceImpl3 : 测试3.1、文件上传3.2、文件迁移4 : 总结4.1、参考资料4.2、注意事…

浅谈 C++ 字符串:std::string 与它的替身们

浅谈 C 字符串&#xff1a;std::string 与它的替身们 文章目录浅谈 C 字符串&#xff1a;std::string 与它的替身们零、前言一、前辈&#xff1a;C 风格的字符串1.1 什么是 C 风格的字符串1.2 C 风格的字符串有什么缺陷1.2.1 以 \0 作为结尾&#xff0c;没有直接指明长度1.2.2 …

Android技术分享——APT实现ButterKnife【实战学习】

APT APT &#xff08;Annotation Processing Tool&#xff09; 是一种处理注释的工具&#xff0c;它对源代码文件进行检测并找出其中的 Annotation&#xff0c;根据注解自动生成代码&#xff0c;如果想要自定义的注解处理器能够运行&#xff0c;必须要通过 APT 工具来处理。 …

Python实现FA萤火虫优化算法优化支持向量机分类模型(SVC算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法&#xff08;Fire-fly algorithm&#xff0c;FA&#xff09;由剑桥大学Yang于2009年提出 , 作…

maven第一篇:安装maven以及配置

本篇就是聊如何在电脑上安装maven&#xff0c;以及简单的配置基础环境。 首先需要了解什么适合maven&#xff0c;对于这个理论知识&#xff0c;还是老规矩直接复制一下&#xff1b; Maven 是一款基于 Java 平台的项目管理和整合工具&#xff0c;它将项目的开发和管理过程抽象…

提速300%,PaddleSpeech语音识别高性能部署方案重磅来袭!

在人机交互的过程中&#xff0c;语音是重要的信息载体&#xff0c;而语音交互技术离不开语音识别与语音合成技术。飞桨语音模型库PaddleSpeech为开发者们使用这些技术提供了便捷的环境。本次PaddleSpeech迎来重大更新——1.3版本正式发布。让我们一起看看&#xff0c;这次Paddl…

这样实操一下 JVM 调优,面试超加分

1.写在前面 前段时间一位读者面了阿里&#xff0c;在二面中被问到 GC 日志分析&#xff0c;感觉回答的不是很好&#xff0c;过来找我复盘&#xff0c;大致听了他的回答&#xff0c;虽然回答出了部分&#xff0c;但是没抓到重点。 GC 日志分析算是 JVM 调优中比较难的部分&…

【XR】如何提高追踪保真度,确保内向外追踪系统性能

Constellation是Oculus研发的追踪系统。日前&#xff0c;负责AR/VR设备输入追踪的Facebook工程经理安德鲁梅利姆撰文介绍了他们是如何用基于Constellation追踪的控制器来提高交互保真度。具体整理如下&#xff1a; 我们的计算机视觉工程师团队一直在努力为Oculus Quest和Rift …

【再学Tensorflow2】TensorFlow2的模型训练组件(1)

TensorFlow2的模型训练组件&#xff08;1&#xff09;数据管道构建数据通道应用数据转换提升管道性能特征列特征列用法简介特征列使用示例激活函数常用激活函数激活函数使用示例Tensorflow模型中的层内置的层自定义模型中的层参考资料Tensorflow中与模型训练相关的组件主要包括…

图像采样与量化

数字图像有两个重要属性&#xff1a;空间位置(x,y)以及响应值I(x,y)。数字图像中像素的空间位置及响应值都是离散值&#xff0c;传感器输出连续电压信号。为了产生数字图像&#xff0c;需要把连续的数据转换为离散的数字化形式。采用的方式是图像量化与采样。 图像采样 图像量化…

【数据结构】(初阶):二叉搜索树

​ ✨前言✨ &#x1f393;作者&#xff1a;【 教主 】 &#x1f4dc;文章推荐&#xff1a; ☕博主水平有限&#xff0c;如有错误&#xff0c;恳请斧正。 &#x1f4cc;机会总是留给有准备的人&#xff0c;越努力&#xff0c;越幸运&#xff01; &#x1f4a6;导航助手&#x…

Docker+Selenium Grid运行UI自动化

简介 使用Selenium Grid可以分布式运行UI自动化测试&#xff0c;可以同时启动多个不同的浏览器&#xff0c;也可以同时启动同一个浏览器的多个session。这里使用Docker Compose来同时启动不同浏览器的容器和Selenium Grid&#xff0c;只需一条命令就把自动化运行环境部署好了。…

verilog仿真技巧与bug集合

文章目录赋值语句想法一些建议时钟信号关于异步fifo写入数据时wp1&#xff0c;读出数据时rp1一些自己的bug关于操作符&关于if-else关于modelsim使用1.初学者不建议在设计文件中加入仿真语句&#xff1b; 2.初学者也不会在tb里使用类似always一样的设计。 对于1.因为把仿真…

国产RISC-V处理器“黑马”跑分曝光!超过多数国内主流高性能处理器!

来源企业投稿 2010年&#xff0c;开源、开放、精简的RISC-V架构诞生。虽然距今仅有12年&#xff0c;但RISC-V迎来了众多玩家的积极参与&#xff0c;其技术、生态、应用都快速发展。在许多秉持匠心的技术人员的耕耘下&#xff0c;RISC-V也早已从传统强项物联网走出&#xff0c;…

error: ‘uint8_t’,‘uint16_t’ ,‘uint32_t’ does not name a type

文章目录1、报错error: ‘uint8_t’,‘uint16_t’ ,‘uint32_t’ does not name a type2、解决办法3、uint8_t此类数据类型补充4、码字不易&#xff0c;点点赞1、报错error: ‘uint8_t’,‘uint16_t’ ,‘uint32_t’ does not name a type 在网络编程PING程序时遇到的小bug&am…

【BUUCTF】MISC(第二页wp)

文章目录被劫持的神秘礼物刷新过的图片[BJDCTF2020]认真你就输了[BJDCTF2020]藏藏藏被偷走的文件snake[GXYCTF2019]佛系青年[BJDCTF2020]你猜我是个啥秘密文件菜刀666[BJDCTF2020]just_a_rar[BJDCTF2020]鸡你太美[BJDCTF2020]一叶障目[SWPU2019]神奇的二维码梅花香之苦寒来[BJD…

day02-Java基础语法

day02 - Java基础语法 1 类型转换 在Java中&#xff0c;一些数据类型之间是可以相互转换的。分为两种情况&#xff1a;自动类型转换和强制类型转换。 1.1 隐式转换(理解) ​ 把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量。这种转换方式是自动的&am…

外贸小白适合哪种邮箱?

除了一些企业指定的邮箱&#xff0c;大多数外贸人&#xff0c;尤其是小白的外贸人&#xff0c;都希望选择最合适的邮箱&#xff0c;赢在起跑线上。判断邮箱质量的两个主要因素是投递率和安全性。米贸搜的排列如下: 公共个人邮箱 此时常见的个人邮箱有国外的gmail、hotmail、雅…

2023 年软件开发人员可以学习的 10 个框架

开发者您好&#xff0c;我们现在处于 2023 年的第一周&#xff0c;你们中的许多人可能已经制定了 2023 年要学习什么的目标&#xff0c;但如果您还没有&#xff0c;那么您来对地方了。 早些时候&#xff0c;我分享了成为Java 开发人员、DevOps 工程师、React 开发人员和Web 开…

联合分析案全流程分析

联合分析(conjoint analysis)是一种研究消费者产品选择偏好情况的多元统计分析方法。比如消费者对于手机产品的偏好&#xff0c;对于电脑产品的偏好&#xff0c;也或者消费者对于汽车产品的偏好情况等。联合分析中涉及几个专业术语名词&#xff0c;分别如下所述&#xff1a; 联…