【C语言】文件操作函数

news2025/1/16 5:50:46

文件操作函数

  • 1.文件的打开和关闭
    • 1.1fopen
    • 1.2close
  • 2.文件的顺序读写
    • 2.1fgetc和fputc
      • 2.1.1fputc
      • 2.1.2fgetc
    • 2.2fgets和fputs
      • 2.2.1fputs
      • 2.2.2fgets
    • 2.3fscanf和fprintf
      • 2.3.1fprintf
      • 2.3.2fscanf
    • 2.4fread和fwrite
      • 2.4.1fwrite
      • 2.4.2fread
    • 2.5总结
    • 2.6拓展(sscanf和sprintf)
  • 3.文件的随机读写
    • 3.1fseek
    • 3.2ftell
    • 3.3rewind
  • 4.文件读取结束的判定
    • 4.1文件是否结束
    • 4.2feof和ferror


1.文件的打开和关闭

1.1fopen

FILE * fopen ( const char * filename, const char * mode );
  1. fopen的作用是打开文件。
  2. fopen的头文件是<stdio.h>,第一个参数是文件名,第二个参数是方式(以什么方式打开文件),打开文件成功,返回指向文件信息区的指针,打开失败返回NULL。
  3. 文件的打开方式如下:
文件使用方式含义如果指定文件不存在
“r”(只读)为了输入数据,打开一个已经存在的文本文件出错
“w”(只写)为了输出数据,打开一个文本文件建立一个新的文件
“a”(追加)向文本文件尾添加数据建立一个新的文件
“rb”(只读)为了输入数据,打开一个二进制文件出错
“wb”(只写)为了输出数据,打开一个二进制文件建立一个新的文件
“ab”(追加)向一个二进制文件尾添加数据出错
“r+”(读写)为了读和写,打开一个文本文件出错
“w+”(读写)为了读和写,建立一个新的文件建立一个新的文件
“a+”(读写)打开一个文件,在文件尾进行读写建立一个新的文件
“rb+”(读写)为了读和写打开一个二进制文件出错
“wb+”(读写)为了读和写,新建一个新的二进制文件建立一个新的文件
“ab+”(读写)打开一个二进制文件,在文件尾进行读和写建立一个新的文件

(1)这里的输入和输出是站在内存的角度上的,输入是从文件输入到内存,输出是从内存输出到文件。
(2)什么是文本文件?什么又是二进制文件?
数据在内存中以二进制的形式存储,如果不加转换的输出到外存(文件),就是二进制文件。如果要求在外存(文件)上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。
(3)不要看这么多打开方式,在C常用的只有"r"、“w”、"rb"和"wb"这4种。


1.2close

int fclose ( FILE * stream );
  1. fclose的作用是关闭文件。
  2. (1)什么是流(stream)?我认为是数据输入输出的一种介质。将数据输出到屏幕、输出到文件,从文件、键盘输入数据都需要流(stream)的帮助。
    (2)为什么我们平时打印数据、输入数据都不需要流?任何一个C语言程序运行的时候,默认打开三个流:stdin:标准输入流(键盘);stdout:标准输出流(屏幕);stderr:标准错误流(屏幕)。
    (3)所以我们在使用文件输入输出时需要流。我们从文件读写数据,都需要经过流,所以直接从流读写即可。流就是我们的文件指针,类型是FILE*,通过这个流我们可以输入数据到内存,也可以输出数据到文件。
  3. 文件成功关闭就返回0,失败就返回EOF。同时记得把指针置为NULL。

例子

#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

结果
在这里插入图片描述


2.文件的顺序读写

2.1fgetc和fputc

2.1.1fputc

int fputc ( int character, FILE * stream );
  1. fputc的作用是输出字符到流中。fputc适用于所有输出流(包括stdout和文件等)。
  2. fputc的头文件是<stdio.h>。第一个参数是要输入的字符,第二个参数是指向输出流的指针。如果输出成功,返回输出的字符,如果失败返回EOF。

例子
首先创建一个文件。
在这里插入图片描述

int main()
{
	FILE* pf = fopen("test.txt", "w");//我们要写入文件,以写的形式打开
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	int i = 0;
	for (i = 'a'; i <= 'z'; i++)
	{
		fputc(i, pf);//文件里面有指示器,当输入一个字符时,指示器指示下一个位置。
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

结果
在这里插入图片描述

2.1.2fgetc

int fgetc ( FILE * stream );
  1. fgetc的作用是从流中读取字符。fgetc适用于所有输入流(包括stdin和文件等)。
  2. fgetc的头文件是<stdio.h>。参数是指向输入流的指针。如果读取成功,返回读取字符的ASCII码值,如果读取结束或者读取失败就返回EOF。

例子

int main()
{
	FILE* pf = fopen("test.txt", "r");//以读的形式打开文件
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//读取文件
	int ch = 0;
	while (ch = fgetc(pf))//当读取一个字符后,指示器指向下一个字符
	{
		printf("%c ", ch);
		
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

结果
在这里插入图片描述


2.2fgets和fputs

2.2.1fputs

int fputs (const char * str, FILE * stream);
  1. fputs的作用是将字符串写入流中。fputs适用于所有输出流。
  2. fputs的头文件是<stdio.h>。第一个参数是指向要写入流的字符串的指针,第二个参数是指向输出流的指针。如果写入成功就返回一个非负数,失败就返回EOF。
  3. fputs将字符串写入流,遇到’\0’停止,但末尾的’\0’并不会被写入。

例子

int main()
{
	FILE* pf = fopen("test.txt", "w");//以"w"的形式打开,如果先前文件有内容就会被初始化
	if (NULL == pf)
	{
		perror("fopen");
	}
	fputs("hello world\n", pf);
	fputs("welcome", pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

结果
在这里插入图片描述

2.2.2fgets

char * fgets ( char * str, int num, FILE * stream );
  1. fgets的作用是从流中读取字符串。fgets适用于所有输入流。
  2. fgets的头文件是<stdio.h>。第一次参数是指向一个数组的指针,这个数组用来放从流中读取的字符串,第二个参数是从流中读取的字符个数(实际上是读取num-1个字符,最后一个字符留给\0),第三个参数是指向输入流的指针。如果读取成功则返回str,读取到文件结束或者读取失败就返回NULL。(读取失败和读取到文件结束该如何区分,后面会讲到)
  3. fgets从流中读取字符串,直到num-1个字符结束,或者读取到换行符结束(换行符也算入num个字符中),或者读取到文件末尾结束。

例子

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	char arr[20] = { 0 };
	fgets(arr, 5, pf);
	printf("%s", arr);
	//fgets(arr, 8, pf);
	//printf("%s", arr);
	return 0;
}

结果
在这里插入图片描述
在这里插入图片描述


2.3fscanf和fprintf

2.3.1fprintf

int fprintf ( FILE * stream, const char * format, ... );
  1. fprintf的作用是将数据格式化输出到流中。fprintf适用于所有输出流。
  2. fprintf的头文件是<stdio.h>。第一个参数是指向输出流的指针,第二个参数是可变参数列表,即可以有多个参数,没有固定。如果输出成功则返回输出的项目数,如果失败就返回负数。

例子

struct Stu
{
	char name[20];
	int age;
	float score;
};
int main()
{
	struct Stu s = { "zhangsan",18,99.5 };
	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	fprintf(pf, "%s %d %f", s.name, s.age, s.score);
	fclose(pf);
	pf = NULL;
	return 0;
}

结果
在这里插入图片描述

2.3.2fscanf

int fscanf ( FILE * stream, const char * format, ... );
  1. fscanf的作用是从流中格式化地读取数据放到参数列表中的项目。fscanf适用于所有输入流。
  2. fscanf的头文件是<stdio.h>。第一个是指向输入流的指针,第二个参数是可变参数列表。如果读取成功就返回该函数返回参数列表中成功填充的项目数,如果读取失败或者到达文件末尾就返回EOF。

例子

struct Stu
{
	char name[20];
	int age;
	float score;
};
int main()
{
	struct Stu s = { 0 };
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	fscanf(pf, "%s %d %f", s.name, &s.age, &s.score);
	printf("%s %d %f", s.name, s.age, s.score);
	return 0;
}

结果
在这里插入图片描述


2.4fread和fwrite

2.4.1fwrite

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
  1. fwrite的作用是将数据块写入流。fwirte只适用于文件。
  2. fwirte的头文件是<stdio.h>。第一次参数是指向要写入流的数组的指针,第二个参数是数组元素的大小,第三个参数是数组元素的数目,第四个是指向输出流的指针。如果输出成功则返回写入流的元素总数。如果size和count都为0 ,则返回0。

例子

struct Stu
{
	char name[20];
	int age;
	float score;
};
int main()
{
	FILE* pf = fopen("test.txt", "wb");//前面的函数读写文件都是文本信息,都可以看懂
	                                   //fread和fwrite读写文件都是二进制信息
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	struct Stu s = { "zhangsan",20,99.5 };
	fwrite(&s, sizeof(struct Stu), 1, pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

结果
在这里插入图片描述

2.4.2fread

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
  1. fread的作用是从流中读取数据放到内存块中。fread只适用于文件。
  2. fread的头文件是<stdio.h>。第一个参数是指向数组的指针,这个数组的大小至少是size*count,这样才能存放从流中读取的数据,第二个参数是数组元素的大小,第三个参数是数组元素的数目,第四个参数是指向输入流的指针。如果读取成功,返回读取元素总数,读取失败或者读取到文件末尾,都设置了各自的指示符,这些指示符可以与feror和feof搭配使用,从而得出是读取是失败还是读取到文件末尾(后面会讲到),如果count或者size是0,则返回0。

例子

struct Stu
{
	char name[20];
	int age;
	float score;
};
int main()
{
	FILE* pf = fopen("test.txt", "rb");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	struct Stu s = { 0 };
	fread(&s, sizeof(struct Stu), 1, pf);
	printf("%s %d %f", s.name, s.age, s.score);
	fclose(pf);
	pf = NULL;
	return 0;
}

结果
在这里插入图片描述

2.5总结

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

2.6拓展(sscanf和sprintf)

  1. scanf从键盘读取格式化的数据(输入流:键盘stdin),printf把数据输出到屏幕上(输出流:屏幕stdout)。
  2. fscanf针对所有输入流的格式化的输入(输入流:stdin,打开的文件),fprintf针对所有输出流的格式化的输出(输出流:stdout、打开的文件)。
  3. sscanf从一个字符串中还原出一个格式化的数据,sprintf把格式化的数据存放在一个字符串。

例子

struct Stu
{
	char name[20];
	int age;
	float score;
};
int main()
{
	struct Stu s = { "zhangsan",18,99.5 };
	char buf[100] = { 0 };
	sprintf(buf, "%s %d %f", s.name, s.age, s.score);
	printf("%s\n", buf);
	printf("-------分割线---------\n");
	struct Stu tmp = { 0 };
	sscanf(buf, "%s %d %f", tmp.name, &tmp.age, &tmp.score);
	printf("%s %d %f", tmp.name, tmp.age, tmp.score);
	return 0;
}

结果
在这里插入图片描述


3.文件的随机读写

3.1fseek

int fseek ( FILE * stream, long int offset, int origin );
  1. fseek的作用是重新定位流中的位子指示器指向的位置。它是根据文件指针的位置和偏移量来定位文件指针。
  2. 头文件是<stdio.h>。第一个参数是指向流的指针,第二个参数是偏移量,第三个参数是起始位置,是偏移量的参考位置,它有固定的三个取值:SEEK_SET(文件开头)、SEEK_CUR(文件指针当前位置)、SEEK_END(文件末尾)。如果成功返回零,失败返回非零值。

例子

int main()
{
	FILE* pf = fopen("test.txt", "r");//先在文件内写好abcdef,现在用读的形式打开
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//文件的顺序读写,读完一个字符后,文件指针指向下一个字符
	printf("%c\n", fgetc(pf));//a
	printf("%c\n", fgetc(pf));//b
	printf("%c\n", fgetc(pf));//c
	//按照顺序读写,接下来打印的是d,但我想要打印b
	fseek(pf, -2, SEEK_CUR);//当前位置是文件指针(位置指示器)指向d,后前偏移2就指向b
	printf("%c\n", fgetc(pf));
	//法2:	fseek(pf,1,SEEK_SET);从开头开始偏移
	//		printf("%c\n",fgetc(pf));
	//法3:	fseek(pf,-4,SEEK_END);//从末尾开始偏移
	//		printf("%c\n", fgetc(pf));
	fclose(pf);
	pf = NULL;
	return 0;
}

结果
在这里插入图片描述

3.2ftell

long int ftell ( FILE * stream );
  1. ftell的作用是返回文件指针相对于起始位置的偏移量。
  2. 头文件是<stdio.h>,参数是指向流的指针,返回值是当前文件指针相对于起始位置的偏移量。

例子

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	printf("%c\n", fgetc(pf));//a
	printf("%c\n", fgetc(pf));//b
	printf("%d\n", ftell(pf));
	return 0;
}

结果
在这里插入图片描述

3.3rewind

void rewind ( FILE * stream );
  1. rewind的作用是让文件指针的位置回到文件的起始位置。
  2. 头文件是<stdio.h>,参数是指向流的指针,无返回值。

例子

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	printf("%c\n", fgetc(pf));//a
	printf("%c\n", fgetc(pf));//b
	printf("%d\n", ftell(pf));//2
	rewind(pf);
	printf("%c\n", fgetc(pf));//a
	return 0;
}

结果
在这里插入图片描述


4.文件读取结束的判定

4.1文件是否结束

  1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
    例如:
    fgetc 判断是否为 EOF
    fgets 判断返回值是否为 NULL
  2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
    例如:
    fread判断返回值是否小于实际要读的个数

4.2feof和ferror

  1. 在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。
    而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。
  2. feof返回真,说明是文件正常读取遇到了结束标志而结束的。
  3. ferror返回真,说明文件在读取过程中出错了,结束的。

例子

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);
}

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

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

相关文章

【面试题】async/await、promise和setTimeout的执行顺序

从一道题目出发今天看到一道面试题&#xff0c;是关于async/await、promise和setTimeout的执行顺序&#xff0c;题目如下&#xff1a;asyncfunctionasync1() {console.log(async1 start);awaitasync2();console.log(asnyc1 end); } asyncfunctionasync2() {console.log(async2)…

kafka官方文档中文翻译(kafka参数解释)

目录 入门 1.1简介 kafka™是一个分布式流媒体平台。这到底意味着什么&#xff1f; 1.2使用案例 1.3快速入门 1.4生态系统 1.5从以前的版本升级 2. API 2.1生产者API 2.2消费者API 2.3 Streams API 2.4连接API 2.5遗留API 3.配置 3.1Broker配置 3.2生产者配置 …

Exynos 4412 看门狗定时器中断

如果想弄懂看门狗定时器中断&#xff0c;要掌握下面两个知识点&#xff1a; 1 懂寄存器 Cortex A9采用的是ARM官方规定的中断处理机制 有两大类寄存器决定了中断工作状态 1) exynos 4412 特有的寄存器(在第26章) 2) Cortex A9 规定的工作寄存器(在第9章和第10章) 2 懂中断处理过…

【memcached】下载、安装、、出错一分钟全搞定

各位小伙伴在看黑马程序员springboot的时候可能会遇到的情况&#xff1a;memcached如何安装&#xff1f;官网地址&#xff1a;https://www.runoob.com/memcached/window-install-memcached.html找到合适的下载即可&#xff0c;占用内容很小&#xff0c;几秒就下载好了开启服务安…

SpringBoot + jackson + redis 序列化、反序列化 配置正确姿势

文章目录1.背景2. 原来项目配置3.正确配置4.小结1.背景 最近项目上 使用 SpringBoot 2.7.7 jackson redis 框架实现将javaBean 序列化和反序列化到 redis 中。但是最近在做登陆的时候将LoginUser 序列化到redis 中没问题&#xff0c;不重启服务的话反序列化成对象也没有问题…

【Java多线程】同步代码块处理线程安全问题

题&#xff1a;创建三个窗口卖票&#xff0c;总票数为100张 1.问题&#xff1a;买票过程中&#xff0c;出现了重票&#xff0c;错票 --> 出现了线程的安全问题 2.问题出现的原因&#xff1a;当某个线程操作车票的过程中&#xff0c;尚未操作完成时&#xff0c;其他线程参与进…

IDEA常用技巧汇总

查看代码历史版本鼠标在需要查看的java类 右键 找到Local History >> Show History 点开即可看到历史版本&#xff0c;常用于自己忘记代码改了哪些内容 或需要恢复至某个版本 (注意 只能看近期修改 太久了也是看不到的)idea设置成eclipse的快捷键这对eclipse转idea的开发…

网络编程套接字

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录Socket 套接字UDP 和 TCPUDP数据报套接字编程DatagramSocket APIDatagramPacket APIUdpEchoServerUdpEchoClientUdpDictServer…

分享62个JS返回顶部特效,总有一款适合您

分享62个JS返回顶部特效&#xff0c;总有一款适合您 62个JS返回顶部特效下载链接&#xff1a;https://pan.baidu.com/s/1X1fSwxibtEDXKeYqj0sHXQ?pwde2kp 提取码&#xff1a;e2kp Python采集代码下载链接&#xff1a;https://wwgn.lanzoul.com/iKGwb0kye3wj import os im…

[Android]Toolbar

Toolbar是由AndroidX库提供的&#xff0c;它的强大之处在于&#xff0c;它不仅继承了ActionBar的所有功能&#xff0c;并且灵活度很高&#xff0c;可以配合其他控件完成一些Material Design的效果。 使用Toolbar替代ActionBar 在themes的两个xml文件中&#xff0c; 都指定一个…

视频连载08 - 这个为生信学习和生信作图打造的开源R教程真香!!!

点击阅读原文跳转完整教案。1 思考题2 R基础2.1 R安装2.2 Rstudio基础2.2.1 Rstudio版本2.2.2 Rstudio安装2.2.3 Rstudio 使用2.3 R基本语法2.3.1 获取帮助文档&#xff0c;查看命令或函数的使用方法、事例或适用范围2.3.2 R中的变量及其初始化2.3.3 变量类型和转换2.3.4 R中矩…

ECharts接收dataset类型数据封装各类型图形组件

数据平台整合matabase图表&#xff0c;调用matabase已有接口使用echarts实现图表展示 目标 将各类型图形独立封装为组件 将多个组件整体封装成一个组件 使用时只需传入组件名和对应数据即可 展示 数据格式 ECharts中dataset配置 公共组件 示例饼图 pie-chart pie-chart comm…

AcWing 1083. Windy数(数位DP)

AcWing 1083. Windy数&#xff08;数位DP&#xff09;一、问题二、分析状态表示状态转移初末状态循环设计注意事项三、代码一、问题 二、分析 这道题考察的是数位DP的知识&#xff0c;对于数位DP的分析方法作者在之前的文章中做过详细地介绍&#xff1a;AcWing 1081. 度的数量…

java面试题(九)集合篇

2.1 Java中有哪些容器&#xff08;集合类&#xff09;&#xff1f; 参考答案 Java中的集合类主要由Collection和Map这两个接口派生而出&#xff0c;其中Collection接口又派生出三个子接口&#xff0c;分别是Set、List、Queue。所有的Java集合类&#xff0c;都是Set、List、Qu…

【LeetCode】Day206-二叉树着色游戏

题目 1145. 二叉树着色游戏【中等】 题解 官解说的实在是抽象了&#xff0c;看了下高赞题解&#xff0c;果然很清晰易懂 以 x 为根&#xff0c;它的三个邻居&#xff08;左儿子、右儿子和父节点&#xff09;就对应着三棵子树&#xff1a; 左子树右子树父节点子树 哪棵子树…

微服务项目框架及多模块开发

目录 项目模式 技术栈 项目架构图 模块 案例演示 主模块 zmall-common子模块 zmall-user子模块 项目模式 电商模式&#xff1a;市面上有5种常见的电商模式&#xff0c;B2B、B2C、 C2B、 C2C、O2O; 1、B2B模式 B2B (Business to Business)&#xff0c;是指 商家与商家…

java递归-八皇后问题(回溯算法)

1.八皇后问题介绍 八皇后问题&#xff0c;是一个古老而著名的问题&#xff0c;是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯贝瑟尔于 1848 年提出&#xff1a;在 88 格的国际象棋上摆放八个皇后&#xff0c;使其不能互相攻击&#xff0c;即&#xff1a;任意两个皇后都…

Day04-数据分析模型

文章目录数据分析模型数据分析流程第一&#xff1a;定性法第二&#xff1a;定量法一、数据分析要解决什么问题&#xff1f;1. 研究历史2. 解释现状4. 洞察商机5. 寻求最佳方案二、数据分析师的工作三、数据分析流程1. 数据分析框架2. 数据获取3. 数据处理4. 数据分析5. 撰写报告…

大数据技术架构(组件)18——Hive:FileFormats(1)

1.5、FileFormats1.5.1、FileFormat对比&#xff1a;1.5.1.1、Text File每一行都是一条记录&#xff0c;每行都以换行符&#xff08;\ n&#xff09;结尾。数据不做压缩&#xff0c;磁盘开销大&#xff0c;数据解析开销大。可结合Gzip、Bzip2使用&#xff08;系统自动检查&…

Python 3 基本数据类型,包含示例演示(初学友好)

嗨害大家好鸭~ 我是小熊猫 有好好学习python吗&#xff1f; Python学习资料电子书 点击此处跳转文末名片获取 Python3 基本数据类型 Python 中的变量不需要声明。每个变量在使用前都必须赋值&#xff0c;变量赋值以后该变量才会被创建。 在 Python 中&#xff0c;变量就是变量…