第十一章 文件操作

笔试题-2023-紫光展锐-数字芯片设计【纯净题目版】 阅读详情

文件名

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

文件分类

根据数据的组织形式,数据文件可分为ASCI文件和二进制文件。
数据在内存中是以二进制形式存储的,如果不加转换地输出到外存,就是二进制文件,可以认为它就是存储在内存的数据的映像,所以也称之为映像文件(image file)。
如果要求在外存上以ASCII代码形式存储,则需要在存储前进行转换。ASCI文件又称文本文件(text file),每一个字节放一个字符的ASCII代码。

文件缓冲区

ANSI C标准采用**“缓冲文件系统”**处理数据文件,所谓缓冲文件系统是指系统自动地在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区。从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去。如果从磁盘向计算机读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(给程序变量),见图10.2。缓冲区的大小由各个具体的C编译系统确定。
在这里插入图片描述
刷新缓冲区:
1、缓冲区满了 2、调用函数fflush 3、程序结束

文件指针

概念

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。每个被使用的文件都在内存中开辟一个相应的文件信息区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名为FILE。
FILE在stdio.h文件中的类型声明:

typedef struct{
  short level;//缓冲区“满”或“空”的程度
  unsigned flags;//文件状态标志
  char fd;//文件描述符
  unsigned char hold;//如缓冲区无内容不读取字符
  short bsize;//缓冲区的大小
  unsigned charw bufler;//数据缓冲区的位置
  unsigned char # curp;//指针当前的指向
  unsigned istemp;//临时文件指示器
  short token;//用于有效性检查
}FILE;

对文件进行读写等操作的时候,对文件指针进行操作即可。
c语言中由三个特殊的文件指针无需定义,在程序中可以直接使用:
stdin:标准输入,默认为当前终端(键盘)。
stdout: 标准输出,默认为当前终端(屏幕)。
stderr: 标准错误输出设备文件 默认当前终端(屏幕)

定义方式

FILE * 指针变量标识符;

打开文件fopen

函数:FILE *fopn(const char path, const char mode);
打开一个已经存在的文件,并返回文件的文件指针。或者创建一个文件,并打开文件,返回文件标识。
读取成功为文件地址,失败为0
参数:
1、文件的路径

  • 绝对路径
  • 项目路径
    2、 文件打开方式
    在这里插入图片描述
    在这里插入图片描述

关闭文件 fclose

函数:int fclose(FILE *fp);
关闭fp所代表的文件。一个文件只能关闭一次。
返回值:
成功返回0,失败返回非0

#include<stdio.h>
#pragma warning(disable:4996)
int main()
{
	FILE* file1 = fopen("./test.txt", "r+");
	if (file1 == NULL) {
		printf("文件打开失败\n");
		return 0;
	}
	printf("打开成功\n");
	fclose(file1);
	return 0;
}

读写字符函数

在这里插入图片描述
EOF:是stdio.h文件中定义的符号常量,值未-1

fgetc

int fgetc(FILE *stream);
返回值:
以文本的方式: 读到文件结尾返回EOF(即-1)
以二进制的方式:读到文件结尾,使用函数feof(文件指针)判断结尾
feof是c语言标准库函数,在stdio.h中,功能是检测刘尚的文件结束符,如果结束返回非0,未结束返回0

fputc

int fpuct(int c, FILE *stream);
将c的值写入sream所代表的文件中。
返回值:
成功返回输出的字节值。
失败返回EOF

int main()
{
	FILE* file1 = fopen("./test.txt", "a+");//读写追加方式打开
	if (file1 == NULL) {
		printf("文件打开失败\n");
		return 0;
	}
	printf("打开成功\n");
	char temp;
	while ((temp = fgetc(file1)) != EOF) {
		printf("%c", temp);
	}
	fputc('A', file1);//读取完事再写入一个字符A
	fclose(file1);
	return 0;
}

读写字符串

fgets

char *fgets(char *s, int size, FILE *fp);
从我呢见中读取字符,读取的时候碰到换行符或者文件末尾停止读取,或者读取了size-1个字节的时候停止。

返回值:
成功返回s的地址,失败返回NULL。

fputs

int fputs(const char *str, FILE *fp);
将s指向的字符串,写入到文件中。
返回值:
成功返回写入的字节数,失败返回-1

文件复制:
文件test:
在这里插入图片描述

#include<stdio.h>
#pragma warning(disable:4996)
int main()
{
	FILE* file1 = fopen("./test.txt", "a+");//
	if (file1 == NULL) {
		printf("file1文件打开失败\n");
		return 0;
	}
	FILE* file2 = fopen("./test1.txt", "w+");//打开文件test1,没有会新建
	if (file2 == NULL) {
		printf("file2文件打开失败\n");
		return 0;
	}
	printf("打开成功\n");
	char res[100];
	//读取字符串,写入文件2
	while (fgets(res, 100, file1) != NULL) {
		fputs(res, file2);
	}
	fclose(file1);
	fclose(file2);
}

二进制方式读写

fread

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *fp);
从文件读取数据,一块是size个字节,共nmemb块,存放到ptr指向的内存中。
返回值:实际读到的块数。不到一块,小于size个字节,返回0

fwrite

size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *fp);
将ptr指向的内存中的数据,向文件中写入,一块size个字节,共nmemb块。
返回值:实际写入的块数

保存数据,读取数据。

#include<stdio.h>
#pragma warning(disable:4996)
typedef struct stu {
	int age;
	char name[100];
}STU;
int main()
{
	FILE* wFile = fopen("./test.txt", "wb+");
	if (wFile == NULL) {
		printf("wFile文件打开失败\n");
		return 0;
	}
	STU class[2] = {{11, "Tom"}, {12, "lisi"}};
	fwrite(class, sizeof(STU), 2, wFile);//将class数组的数据写入文件
	rewind(wFile);//文件指针写操作后,到了最后,需要复位
	STU resClass[2];
	//循环读取文件数据到resClass数组中。
	for (int i = 0; i < 2; ++i) {
	 	fread(&resClass[i], sizeof(resClass[i]), 1, wFile);
	}
	printf("%d, %s\n", resClass[0].age, resClass[0].name);//11,Tom
	printf("%d, %s\n", resClass[1].age, resClass[1].name);//12,lisi
	fclose(wFile);
}

随机读写数据

前面介绍的都是顺序读写,从开头到结尾。
我们可以将指针移动到需要读写的位置,再进行读写。这种称为随机读写。

rewind

void rewind(FILE *fp);
把文件内部的位置指针移动到文件开始。

fseek

fseek(FILE *stream, long offset, int origin);
用来改变文件位置标记
参数:

  • 文件
  • 偏移量
  • 起始点

在这里插入图片描述

fseek (dp,100L,0);//将文件位置标记向前移到离文件开头100个字节处
fseek (fp,50L,1);//将文件位置标记向前移到离当前位置50个字节处
fseek (fp.-10L,2);//将文件位置标记从文件末尾处向后退10个字节

ftell

long ftell(FILE *fp);
测文件读写位置距为你教案开始由多少个字节。
返回值:
返回读写位置,出错范围-1;

#include<stdio.h>
#pragma warning(disable:4996)
typedef struct stu {
	int age;
	char name[100];
}STU;
int main()
{
	FILE* wFile = fopen("./test.dat", "wb+");
	if (wFile == NULL) {
		printf("wFile文件打开失败\n");
		return 0;
	}
	STU class[2] = {{11, "Tom"}, {12, "lisi"}};
	fwrite(class, sizeof(STU), 2, wFile);
	printf("距离%d\n", ftell(wFile));//208
	rewind(wFile);
	printf("距离%d\n", ftell(wFile));//0
	fclose(wFile);
}
基于STM32设计的掌上游戏机(运行NES游戏模拟器)详细开发过程 利用STM32单片机移植NES游戏模拟器,完成NES游戏开发,可以玩标准的NES游戏,已测试超级玛丽、魂斗罗之类的都可以正常运行。 阅读详情

相关推荐

S/4中的16种特殊库存类型

S/4中的16种特殊库存类型

yanzibing99的博客 1万+

python 第十一章 文件操作

rb、r+、rb+都是基于r模式,相当于扩展开来,所有的访问模式它的基础特点都要遵循主访问模式,r是只读方式打开,如果文件不存在就报错,那么也就意味着如果rb、r+、rb+去打开一个文件,只要文件不存在,但凡带r的都报错;如果是带w模式的不管wb、w+、wb+如果打开文件,文件不存在则新建文件。这就是r+和w+的区别了。num表示要从文件中读取的数据的长度 (单位是字节),如果没有传入num,那么就表示读取文件中所有的数据。作用: 返回一个整数,表示当前文件指针的位置(到文件开头的比特数)。

weixin_59633478的博客 684

Linux之SUSE系统SAP-HANA经常系统内存不足使得SAP应用不能使用解决方案

问题描述 Linux内存使用量超过阈值,使得sap应用程序无可用内存,最终导致程序崩溃。 问题原因 自己查阅了一些资料,也基于zabbix的可用内存和实际不太一样入手去找原因发现问题出现于Cached的值过大,导致系统没有可以再分配的内存空间。Cached只要用来缓存文件的,经常读写的文件会被缓存到Cached中,可以增加读写效率,该功能是Linux系统内核提供的,而SAP-HANA的日志文件很大...

liuxiangyang_的博客 6709

python基础 第十一章 异常与文件操作

1. 异常 1.1 异常简介 • 程序在运行过程中可能会出现一些错误。比如: 使用了不存在的索引,两个不同类型的数据相加…这些错误我们称之为异常 • 处理异常 程序运行时出现异常,目的并不是让我们的程序直接终止!Python是希望在出现异常时,我们可以编写代码来对异常进行处理 1.2 异常的传播 • 当在函数中出现异常时,如果在函数中对异常进行了处理,则异常不会在进行传播。如果函数中没有对异常进行处理,则异常会继续向函数调用传播。如果函数调用处处理了异常,则不再传播异常,如果没有处理则继续向调用处传播。直到

weixin_41262498的博客 373

别再手动算临界转速了!用ANSYS Workbench 2023 R2快速搞定转子坎贝尔图(附完整APDL命令流)

本文详细介绍了如何利用ANSYS Workbench 2023 R2快速生成转子坎贝尔图,实现全自动临界转速分析。通过对比传统手动计算与Workbench自动化流程的效率差异,展示了其在旋转机械设计中的革命性优势,包括大幅缩短分析周期、提升精度至98.7%。文章还提供了完整的APDL命令流和实战案例,帮助工程师快速掌握这一高效工具。

weixin_42699679的博客 470

ESWA投稿全流程避坑指南:从LaTeX模板到审稿状态查询(附最新资源链接)

本文提供了一份详尽的ESWA期刊投稿全流程指南,涵盖从LaTeX模板深度适配、Cover Letter撰写,到Editorial Manager系统操作、审稿状态解析等关键环节。重点解析了投稿准备中的常见“雷区”与文件合规性要求,并分享了收到审稿意见后的高效修改与回复策略,旨在帮助研究者规避流程陷阱,提升投稿效率与成功率。

9o8p7i6u5y的博客 838

第十一章 结构体和文件操作_自练

所在单位: 学院 年级 班级。出生日期: 年 月 日。

Etototototo的博客 599

ESP32内存优化实战:关闭WiFi/LWIP功能释放37KB IRAM的隐藏技巧

本文针对ESP32开发中IRAM内存不足的难题,提供了一种通过关闭WiFi和LWIP协议栈的IRAM优化功能来释放宝贵内存空间的实战技巧。该方法最高可释放约37KB的IRAM,有效解决复杂项目(如WiFi+BLE+语音识别)的编译失败问题,并详细阐述了配置步骤、性能权衡与测试验证方法。

redis7keeper的博客 126

第十一章 文件操作_C语言插入、删除、更改文件内容

我们平时所见的文件,例如 txt、doc、mp4 等,文件内容是按照从头到尾的顺序依次存储在磁盘上的,就像排起一条长长的队伍,称为顺序文件。 除了顺序文件,还有索引文件、散列文件等,一般用于特殊领域,例如数据库、高效文件系统等。 顺序文件的存储结构决定了它能够高效读取内容,但不能够随意插入、删除和修改内容。例如在文件开头插入100个字节的数据,那么原来文件的所有内容都要向后移动100个字节,这不仅是非常低效的操作,而且还可能覆盖其他文件。因此C语言没有提供插入、删除、修改文件内容的函数,要想实现这些功能,

qq_43205256的博客 1万+

YOLOv8改进:在C2F模块中引入RepGhost Bottleneck模块

C2F类是YOLOv8中的C2F模块的实现,它包含一个RepGhostBottleneck模块、一个卷积层和一个批归一化层。通过在C2F模块中引入RepGhost Bottleneck模块,我们可以在保持计算效率的同时提升模型的表达能力。这是因为RepGhost Bottleneck模块通过引入重复的卷积核来扩展模型的感受野,从而增加了模型对不同尺度目标的感知能力。RepGhost Bottleneck是一种用于卷积神经网络的改进模块,它可以在保持计算效率的同时提升模型的表达能力。希望以上内容对你有帮助!

IlgCrystal的博客 1306

DICOM标准:DICOM医学影像中的覆盖层(Overlay)概念详解

DICOM标准:深入详解DICOM医学影像中的覆盖层(Overlay)

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 1561

C语言从入门到精通 第十一章(文件操作)

本文摘要: 本文是C语言文件操作的系统性教程,主要涵盖以下内容:1) 文件基础概念(程序文件与数据文件、文件名结构);2) 文件指针FILE类型及其操作(fopen/fclose函数及多种打开模式);3) 文件读写函数详解(fgets/fputs等文本操作和fread/fwrite二进制操作);4) 随机读写方法(fseek/ftell/rewind);5) 文件结束判定与缓冲区机制;6) 完整通讯录项目案例演示文件操作实践。教程结合比特鹏哥C语言课程内容,通过代码示例和注释详细说明各功能实现,适合从入门到

Zevalin的博客 2728

【第2章>第10节】深度学习DenseNet模型分析与matlab仿真

本文介绍了基于DenseNet深度学习模型的图像分类MATLAB实现方法。主要内容包括:1. DenseNet模型原理,详细解析了初始卷积层、密集块、过渡层等核心结构;2. 在MATLAB环境下完成DenseNet工具箱安装和测试样本准备;3. 实现图像预处理(统一缩放为224×224)、模型训练和测试的完整流程;4. 提供了混淆矩阵和准确率等测试结果分析。文章附带完整的MATLAB程序代码和操作视频教程,适合深度学习初学者快速掌握DenseNet模型的图像分类应用。通过实际测试,验证了该方案的有效性。

FPGA/MATLAB学习教程/源码/项目合作开发 329

第十一章 文件操作_C语言中的文件是什么?

我们对文件的概念已经非常熟悉了,比如常见的 Word 文档、txt 文件、源文件等。文件是数据源的一种,最主要的作用是保存数据。 在操作系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。例如: 通常把显示器称为标准输出文件,printf 就是向这个文件输出数据; 通常把键盘称为标准输入文件,scanf 就是从这个文件读取数据。 常见硬件设备所对应的文件 文件 硬件设备 stdin 标准输入文件,一般指键盘;sc

qq_43205256的博客 226

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

高级语言第十一章,结构体与文件操作

吉林大学高级语言第十一章

m0_56210953的博客 2400

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Linux C 第十一章文件操作十个问题及解答

Linux C 第十一章文件操作十个问题及解答 1. 为什么要使用文件系统? 在现代操作系统中,要利用大量的程序和数据,由于内存容量有限,且不能长期保存,于是人们想出把这些数据以文件的形式放在外存中,需要的时候再将他们调入内存,从此就有了文件系统,它负责管理在外存的文件,并把存取,共享,保护等手段提供给用户,这样就方便了用户,保存了文件的安全性,还提高了系统资源的利用率。    

ai_keke的博客 183

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

第十一章 文件操作_C语言FILE结构体以及缓冲区深入探讨

在C语言中,用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。 定义文件指针的一般形式为: FILE *fp; 这里的FILE,实际上是在stdio.h中定义的一个结构体,该结构体中含有文件名、文件状态和文件当前位置等信息,fopen 返回的就是FILE类型的指针。注意:FILE是文件缓冲区的结构,fp也是指向文件缓冲区的指针。 不同编译器 stdio.h 头文件中对 FILE 的定义略有差异,这里以标准C举例说明: 下面说一下如何控制缓冲区

qq_43205256的博客 1008

第十一章 文件操作_C语言fopen函数的用法,C语言打开文件详解

在C语言中,操作文件之前必须先打开文件;所谓“打开文件”,就是让程序和文件建立连接的过程。 打开文件之后,程序可以得到文件的相关信息,例如大小、类型、权限、创建者、更新时间等。在后续读写文件的过程中,程序还可以记录当前读写到了哪个位置,下次可以在此基础上继续操作。 标准输入文件 stdin(表示键盘)、标准输出文件 stdout(表示显示器)、标准错误文件 stderr(表示显示器)是由系统打开的,可直接使用。 使用 <stdio.h> 头文件中的 fopen() 函数即可打开文件,它的用法

qq_43205256的博客 1895

第十一章 文件操作_C语言获取文件大小(长度)

实际开发中,有时候需要先获取文件大小再进行下一步操作。C语言没有提供获取文件大小的函数,要想实现该功能,必须自己编写函数。 ftell()函数 ftell() 函数用来获取文件内部指针(位置指针)距离文件开头的字节数,它的原型为: long int ftell ( FILE * fp ); 注意:fp 要以二进制方式打开,如果以文本方式打开,函数的返回值可能没有意义。 先使用 fseek() 将文件内部指针定位到文件末尾,再使用 ftell() 返回内部指针距离文件开头的字节数,这个返

qq_43205256的博客 3930

第十一章 文件操作_C语言fgetc和fputc函数用法详解(以字符形式读写文件)

在C语言中,读写文件比较灵活,既可以每次读写一个字符,也可以读写一个字符串,甚至是任意字节的数据(数据块)。本节介绍以字符形式读写文件。 以字符形式读写文件时,每次可以从文件中读取一个字符,或者向文件中写入一个字符。主要使用两个函数,分别是 fgetc() 和 fputc()。 字符读取函数 fgetc fgetc 是 file get char 的缩写,意思是从指定的文件中读取一个字符。fgetc() 的用法为: int fgetc (FILE *fp); fp 为文件指针。fget.

qq_43205256的博客 2856

第十一章 文件操作_C语言fscanf和fprintf函数的用法详解(格式化读写文件)

fscanf() 和 fprintf() 函数与前面使用的 scanf() 和 printf() 功能相似,都是格式化读写函数,两者的区别在于 fscanf() 和 fprintf() 的读写对象不是键盘和显示器,而是磁盘文件。 这两个函数的原型为: int fscanf ( FILE *fp, char * format, ... ); int fprintf ( FILE *fp, char * format, ... ); fp 为文件指针,format 为格式控制字符串,... 表示参数

qq_43205256的博客 444

第十一章 文件操作_文本文件和二进制文件到底有什么区别?

在学习了 fopen()函数后,我们知道它的第二个参数是一个字符串,用来表示文件打开方式。如果字符串中出现b,则表示以二进制方式打开文件;如果字符串中出现t,或者两者都不出现,则表示以文本方式打开文件。 文本文件和二进制文件的区别 根据我们以往的经验,文本文件通常用来保存肉眼可见的字符,比如.txt文件、.c文件、.dat文件等,用文本编辑器打开这些文件,我们能够顺利看懂文件的内容。 二进制文件通常用来保存视频、图片、程序等不可阅读的内容,用文本编辑器打开这些文件,会看到一堆乱码,根本看不懂。 但.

qq_43205256的博客 605

回看经典!第十一章 C语言文件操作与数据处理实战:从结构体到文本加密、排序全解析(2015年C语言培训班笔记重读)

本文摘要:本章主要讲解C语言文件操作相关内容,包括结构体、联合体、枚举、typedef定义类型等基础知识。重点介绍了文件读写操作,包括文本文件的加密解密、排序处理、内容解析等实用案例。详细讲解了fopen、fgets、fputs、feof等文件操作函数的使用方法,以及结构体作为函数参数时的效率优化。通过多个完整代码示例,展示了如何实现文件内容的读取、处理、写入等常见操作,并提供了堆内存分配、冒泡排序等实用技巧。

深耕计算机专业知识与技术。 523

第十一章 文件操作_C语言fread和fwrite的用法详解(以数据块的形式读写文件)

fgets() 有局限性,每次最多只能从文件中读取一行内容,因为 fgets() 遇到换行符就结束读取。如果希望读取多行内容,需要使用 fread() 函数;相应地写入函数为 fwrite()。 对于 Windows 系统,使用 fread() 和 fwrite() 时应该以二进制的形式打开文件,具体原因我们已在《文本文件和二进制文件到底有什么区别》一文中进行了说明。fread() 函数用来从指定文件中读取块数据。所谓块数据,也就是若干个字节的数据,可以是一个字符,可以是一个字符串,可以是多行数据,并没有什

qq_43205256的博客 851

第十一章 文件操作_C语言fgets和fputs函数的用法详解(以字符串的形式读写文件)

fgetc() 和 fputc() 函数每次只能读写一个字符,速度较慢;实际开发中往往是每次读写一个字符串或者一个数据块,这样能明显提高效率。 读字符串函数 fgets fgets() 函数用来从指定的文件中读取一个字符串,并保存到字符数组中,它的用法为: char *fgets ( char *str, int n, FILE *fp ); str 为字符数组,n 为要读取的字符数目,fp 为文件指针。 返回值:读取成功时返回字符数组首地址,也即 str;读取失败时返回 NULL;如果开

qq_43205256的博客 715

Python核心编程(第二版) 第十一章 习题答案

已放在我的GitHub:https://github.com/Jonariguez/Core_Python_Programing_Exercises_Answers 函数和函数式编程 11-1 def countToFour1(): for eachNum in range(5): print eachNum, def countToFour2(n): for e...

Jonariguez 吾本优秀 745
上一篇: 第十一章 共用体union和枚举enum
七号公园的忧伤
七号公园的忧伤 新星创作者: Java技术领域 新星创作者: Java技术领域
博客等级 码龄6年 4857粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七号公园的忧伤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值