Linux系统文件编程及文件读、写操作

Linux编程学习笔记-Linux系统文件编程详解 Linux系统文件编程详解Linux文件操作命令ls命令cp命令mkdir命令mv命令cat命令rm命令grep命令more命令Linux文件系统Linux文件编程打开文件关闭文件读取文件写入文件文件偏移量获取文件状态文件锁定内存映射 Linux文件操作命令 ls命令 功能:列出指定目录下的内容及其相关属性信息 语法:ls [参数选项] [文件] 常见参数: -a 显示所有文件以及目录,包括'以"."开头的隐藏文件' -l 使用长格式列出文件及目录信息 -r 将文件以相反次序 阅读详情

Linux 系统编程Day01

1.文件编程概述

为什么会用到文件操作?

  • 账单
  • 游戏进度读取
  • 配置文件等

以上操作在实际的应用中都会用得到

由此我们引出了如何实现文件的创建、打开编辑等的自动化执行操作

Windows手动编辑文件(以world为例):

1.打开/创建文档

2.编辑文档

3.保存文档

4.关闭文档

Linux手动同样类似

计算机如何帮我们自动化完成上述操作?

操作系统提供了一系列的API(以Linux系统为例):

open打开

read/write读写

lseek光标定位

close关闭

1.1 文件的打开及创建

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(cost char *pathname, int flags);
int open(cost char *pathname, int flags,mode_t mode);

int creat(const cahr *pathname, ,ode_t mode)
1.1.1 参数说明
  • pathname:要打开的文件名(含路径,缺省为当前路径)

  • flags:O_RDONLY(只读打开)、O_WRONLY(只写打开)、O_RDWR(可读可写打开)

权限选定以后我们打开的文件只能以选定的权限进行操作;边三个常数只能选择一个。

下面是可选的常数:

O_CREAT:若文件不存在则创建它,同时使用时常数的第三个参数mode也需要被说明,用来指示被创建文件的权限。

O_EXCL:在使用时如果同时使用了O_CREAT ,而文件已经存在,则会 报0错。
O_APPEND:每次写时都加到文件的末端。

O_TRUNC:使用该属性时,若文件有内容且权限为只读或只写成功打开,则将文件长度截断为0.

  • Mode一定是在使用了O_CREAT时,用mode记录待创建文件权限。

Creat创建文件:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main()
{
        int fd;

        char *buf = "you are very preety!";

        fd = creat("./lianxi2",O_RDWR);

        return 0;

}
1.1.2 文件写入操作示例
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{

        int fd;
        fd = open("./20230619",O_RDWR);
        printf("fd =%d",fd);
        return 0;
}

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{

        int fd;
        fd = open("./20230619",O_RDWR);
        if(fd == -1){
                printf("file create faild\n");
                fd = open("./file1",O_RDWR|O_CREAT,06000);
                if(fd > 0){
                        printf("file create succeed!\n");
                        }

        }

        printf("fd =%d\n",fd);
        return 0;
}
1.1.3 文件的权限
  • 可读:r->4
  • 可写:w->2
  • 执行:x->1

0600:可读可写

0:

6:4+2

0:同组用户

0:其他组

用以给文件所有者权限

2.文件操作

Create函数:

int create (const *filename, mode_mode)

flie:要创建的文件名(包含路径、缺省为当前路径)

mode:创建模式 ///可读可写可执行

常见创建模式:、

  • S_IRSUR: 1 可读
  • S_IWUSR:2 可写
  • S_IXUSR: 1 可执行
  • S_IRWXU:7 可读、可写、可执行

2.1 写入文件

write:

#include <unistd.h>
write(int fd,const void *buf, size_t count)
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
        int fd;

        char *buf = "you are very pretty~";

        fd = open("./lianxi",O_RDWR);//打开lainxi文件,若不存在就返回负数
		
        if(fd == -1){
                printf("open file faild \n");//不存在就创建文件
                fd=open("./lianxi",O_RDWR|O_CREAT,0600);
                if(fd>0){
                        printf("creat success!\n");
                }

        }

        printf("fd = %d\n",fd);
	//write(fd,buf,sizeof(buf));
	write(fd,buf,strlen(buf));//写入操作
        close(fd);
        return 0;

}

2.2 文件读取操作

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main()
{
        int fd;

        char *buf = "you are very preety!";

        fd = open("./lianxi",O_RDWR);

        if(fd == -1){
                printf("open file faild \n");
                fd=open("./lianxi",O_RDWR|O_CREAT,0600);
                if(fd>0){
                        printf("creat success!\n");
                }

        }
  printf("fd = %d\n",fd);
        //write(fd,buf,strlen(buf));



        int n_write = write(fd,buf,strlen(buf));
        if(n_write != -1){

                printf("write %d byte to \n",n_write);

        }

        close(fd);//由于文件的光标此时在最后所以,读取到的结果也是0,由此我们用关闭文件重新打开的方式读取文件
        fd =open("./lianxi",O_RDWR);
        char *redBuf;
        redBuf =(char *)malloc( sizeof(char)*n_write + 1 );
        int n_read = read(fd,redBuf,n_write);
        printf("read %d, context:%s\n",n_read,redBuf);
        close(fd);
        return 0;

}

2.3 文件的光标移动操作

在上边的例子中我们遇到了写入数据后进行读取操作时,读取不到文件的问题。我们采取的方式是关闭文件后再重新打开的方式;

由上我们引入了lseek函数

  • off_t lseek(int fd, off_t offset,int whence)
  • fd:文件描述符
  • offset:偏移值
  • whence:固定点的位置
  • seek_SET:指向文件头
  • seek_END:指向文件尾部
  • seek_CUR:指向当前光标位置

改进例子:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main()
{
        int fd;

        char *buf = "you are very preety!";

        fd = open("./lianxi",O_RDWR);

        if(fd == -1){
                printf("open file faild \n");
                fd=open("./lianxi",O_RDWR|O_CREAT,0600);
                if(fd>0){
                        printf("creat success!\n");
                }

        }
  printf("fd = %d\n",fd);
        //write(fd,buf,strlen(buf));



        int n_write = write(fd,buf,strlen(buf));
        if(n_write != -1){

                printf("write %d byte to \n",n_write);

        }

        //close(fd);//由于文件的光标此时在最后所以,读取到的结果也是0,由此我们用关闭文件重新打开的方式读取文件
        fd =open("./lianxi",O_RDWR);
        char *redBuf;
        redBuf =(char *)malloc( sizeof(char)*n_write + 1 );
    
    	//读取之前重新定位光标
    	lseek(fd,0,SEEK_SET);
        int n_read = read(fd,redBuf,n_write);
        printf("read %d, context:%s\n",n_read,redBuf);
        close(fd);
        return 0;

}

注:关于偏移值,负数向前正数向后。

计算文件大小:这里我们需要知道的是,lseek成功执行后的的返回值是偏移值

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main()
{
        int fd;

        char *buf = "you are very preety!";



        fd =open("./lianxi",O_RDWR);

        int file_size = lseek(fd,0,SEEK_END);
        printf("file's size is :%d\n",file_size);
        close(fd);


        return 0;
}

3.文件操作原理简述

3.1文件描述符

  • 对于内核而言,所有打开文件都由文件描述符引用

  • 文件描述符是一个非负整数

当打开一个文件或创建一个新文件时,内核向进程返回一个文件描述符,当读写一个文件时,用open和creat返回的文件描述符标识该文件,将其作为参数传递给read和write.

按照惯例:

  • UNIX shell使用文件描述符0与进程的标准输入相结合;
  • 文件描述符1与标准输出相结合;
  • 文件描述符2与标准错误输出相结合。

STDIN_FILRNO、STDOUT_FILENO、STDERR_FILENO这几个宏代替了0、1、2这几个数

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    int fd;
    char readBuf[128];
    
    int n_read = read(0,readBuf,5);
    
    int n_write = write(1,readBuf,strlen(readBuf));
    return 0;
}

文件描述符这个数字在一个进程之中表示一个特定含义,当我们open一个文件时,操作系统在内存中构建了一些数据结构来表示这个动态文件,然后返回给应用一个数字作为这个文件的带表(文件描述符)这个数字就和我们内存中维护的这个动态文件的这些数据结构绑定上了,以后我们应用程序如果要操作这个动态文件只需要用这个文件描述符区分。

  • 文件描述符只在当前进程有效

  • open函数打开文件打开成功返回一个文件描述符,打开错误返回-1

3.2 Linux文件操作流程

1、在Linux中要操作一个文件,一般是先open打开一个文件,得到文件描述符,然后对文件进行读写操作(或其他操作),最后是close关闭文件即可。
2、强调一点:我们对文件进行操作时,一定要先打开文件,打开成功之后才能操作,如果打开失败,就不用进行后边的操作了,最后读写完成后,一定要关闭文件,否则会造成文件损坏。
3、文件平时是存放在块设备中的文件系统文件中的,我们把这种文件叫静态文件,当我们去open打开一个文件时,linux内核做的操作包括:内核在进程中建立一个打开文件的数据结构,记录下我们打开的这个文件;内核在内存中申请一段内存,并且将静态文件的内容从块设备中读取到内核中特定地址管理存放(叫动态文件)。
4、打开文件以后,以后对这个文件的读写操作,都是针对内存中的这一份动态文件的,而并不是针对静态文件的。当然我们对动态文件进行读写以后,此时内存中动态文件和块设备文件中的静态文件就不同步了,当我们close关闭动态文件时,close内部内核将内存中的动态文件的内容去更新(同步)块设备中的睁态文件。
5、为什么这么设计,不直接对块设备直接操作。
块设备本身读写非常不灵活,是按块读写的,而内存是按字节单位操作的,而且可以随机操作,很灵活。
在这里插入图片描述

操作系统关键系统文件全解 macOS作为苹果公司为其Mac硬件平台设计的操作系统,具有独特的用户体验和后台管理机制。本章节将深入探讨macOS系统中后台服务和内核扩展文件的作用与管理。 阅读详情

相关推荐

机器视觉/将HIK海康面阵相机连接Halcon软件

本文简述了如何将海康面阵相机连接到Halcon软件中进行实时取图的过程。

Dahe.qu 4866

详解Linux环境下实现对文件读写操作

1、文件描述符:它其实实质是一个数字,这个数字在一个进程中表示一个特定的含义,当我们open打开一个文件时,操作系统在内存中构建了一些数据结构来表示这个动态文件,然后返回给应用程序一个数字作为文件描述符,这个数字就和我们内存中维护这个动态文件的这些数据结构挂钩绑定上了。简单来说,它是来区分多个文件的(在打开多个文件的时候)。c、文件平时是存放在块设备中的文件系统中的,我们把这个文件叫做静态文件,当我们去打开一个文件时,linux内核做的操作包括:内核在进程中建立了一个打开文件的数据结构,

m0_74282605的博客 2718

11n、11ac、11ax和11be MCS表(全网最全)

1、无线协商速率介绍及计算 2、附11n、11ac、11ax 完整MCS速率表

weixin_41500064的博客 2万+

【Linux】—— 在Linux上进行读写文件操作

在Linux上进行读写文件操作

m0_56069910的博客 3515

欧姆龙PLC与fanuc发那科机器人进行Ethrenet ip通信测试

近期在做发那科FANUC的通讯,会吧CC-LINK、Profibus-DP、Profinet I/O、DeviceNet、EtherNet/IP这些常用通讯做成文档发上来,大家喜欢的话可以关注 注:做对应的通讯,在机器人控制柜都需要安装对应的板卡以及软件功能 截图中的程序设置和机器人EDS插件在下面链接 https://download.youkuaiyun.com/download/gojava/13770799 PLC为主站 机器人为从站 一、硬件部分 欧姆龙PLC ...

七兔自习室 1万+

YOLOv8实战火焰和烟雾检测 (视频教程)

本课程将手把手地教大家使用YOLOv8结合可变形卷积(deformable convolution)训练火焰和烟雾数据集,完成一个多目标检测实战项目,可实时检测图像、视频、摄像头和流媒体(http/rtsp)中火焰和烟雾,并提供可视化演示界面 。

bai666ai的博客 1915

【Linux】系统文件的读写

打开文件其实都是系统来进行操作,都是调用系统提供的函数,就算是语言层面的操作文件的函数也是在内部调用了系统函数。

Sudo_Wang的学习记录 993

【重磅更新】CT/MRI LI-RADS 2024:肝细胞癌局部区域治疗后反应评估的核心突破与临床实践指南

减少过度治疗:辐射 LRT 的 Nonprogressing 类别避免了 “持续强化 = 存活” 的误判,降低不必要的再治疗风险;提高检出效率:非辐射 LRT 的辅助特征升级减少了 Equivocal 比例,更早识别存活肿瘤;统一评估语言:标准化的分类标准为放射科、肝病科、肿瘤科、肝移植科的多学科协作(MDT)提供了统一 “沟通工具”,助力治疗方案的精准制定。

楚山之石的博客 1225

Linux 创建文件的12种方法总结

命令通常用于脚本、批处理文件。命令可以创建一个新的文件,该命令回车后不会立即结束,可以输入添加到新文件的内容后按 Ctrl+C 或者 Ctrl+D 来结束,也可以使用。通常用于将一个命令的输出重定向到一个新文件中,如果没有命令,则会创建一个 0KB 的空文件。of=文件名:输出文件名,缺省为标准输出。if=文件名:输入文件名,缺省为标准输入。ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。

天天的博客 3万+

pyecharts在jupyter notebook中不能够渲染图表问题。

在使用jupyter notebook中使用pyecharts绘制可视化图表的时候,发现图表不能渲染到页面中,生成的html是没问题的,本文主要解决在jupyter notebook中不能渲染这个问题。

猿小白的博客 1167

Python爬虫实战:用Playwright+Transformer做财经新闻事件驱动分析,我靠它抓住了算力政策的涨停机会

对我来说,这套系统最大的价值不是抓住了几次涨停,而是把“看新闻→分析→决策”的全流程自动化、量化了——不用再被股吧的情绪带偏,不用再熬夜刷新闻,而是用数据和模型做理性判断。更重要的是,搭建这套系统的过程,我吃透了Playwright动态爬虫、Transformer文本分析、量化数据对接这些核心技能,这些技能不管是做量化、做数据分析师,还是做其他领域的爬虫,都能用得上。现在打开PyCharm,跟着代码跑一遍,你也能从海量财经新闻里,挖出属于自己的事件驱动信号——与其靠感觉炒股,不如靠数据说话。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1391

文件读写(Linux)

使用c/c++语言实现文件读写,现有三种方式 1、Linux系统文件操作 2、c语言标准输入输出 3、c++文件输入输出流 一、Linux系统文件操作 二、c语言标准输入输出 1、头文件<stdio.h> 2、函数接口 1、打开 FILE *fopen(const char* filename, const char* mode); 返回值: 成功:文件指针流地址 失败:NULL 参数: filename:文件名字 mode:文件操作方式

liutit的博客 5821

手把手教你写上位机软件(c#、winform)

上位机软件模板

qq_34059233的博客 7万+

【Linux】学习-深入了解文件的读与写

从“内存”的角度看,以显示器和键盘这两个文字为例,键盘就好比书上的文字,内存读取键盘时,就相当于人读取信息的过程,相对于内存而言,这是一种输入,人通过键盘向内存传达信息,也就是内存输入信息的过程,也就是“读”。fscanf 是一种 ”读” 操作,属于一种输入流,他可以向指定的文件中读取信息并放入格式化参数中, 但若读取的信息大于格式化参数的大小,则结果就不被定义,读取成功则返回读取的信息的数量,失败则返回EOF。广义上的文件:显示器,键盘,网卡,声卡,显卡,磁盘,几乎所有的外设,都可以称为文件!

总结日常学习内容 1279

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

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

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Linux中文件夹的读、写、执行权限

文件夹的读、写、执行权限到底是怎么一回事放在开头文件夹的三种操作总结 放在开头 记得最初学习linux系统的时候听过,linux中一切皆文件,且文件都有权限,分别是读、写和执行。当然了,真正的文件的读、写和执行都很好理解,一想到文件夹的读、写和执行是什么样子的时候瞬间就蒙了。后来通过实际的操作终于知道了文件夹读、写和执行分别对应什么意思,为了防止我后期忘记,所以写一篇文章记录一下,同时希望对想了...

xingyu97的博客 7202

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【Linux系统编程:基础IO 上】简单复习C语言文件接口 | 学习系统文件接口 | 认识文件描述符 | Linux下,一切皆文件 | 重定向原理

关于进程,我们还要再往下学习进程间通信、进程信号,但是在这之前,我们先学习基础IO,这篇文章穿插在进程中并不奇怪,因为它有着承上启下的作用。文件的宏观理解那么文件在哪呢?——广义上理解,键盘、显示器等都是文件,因为我们说过“Linux下,一切皆文件”,当然我们现在对于这句话的理解是片面的;狭义上理解,文件在磁盘上,磁盘是一种永久存储介质,不会受断电的影响,磁盘也是外设之一,所以对文件的所有操作,都是对外设的输入输出,简称IO(Input、Output)。文件的组成。.........

DanceBit的博客 2255

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Linux系统文件操作

2、文件描述符,这个数宇在一个进程中表示一个特定含义,当我们open一个文件时,操作系统在内存中构建了一些数据结构来表示这个动态文件,然后返回给应用程序一个数字作为文件描述符,这个数宇就和我们内存中维护的这个动态文件的这些数据结构绑上了,以后我们应用程序如果要操作这个动态文件,只需要用这个文件描述符区分。3、文件平时是存放在块设备中的文件系统文件中的,我们把这种文件叫静态文件,当我们去open打开一个文件时,linux内核做的操作包括:内核在进程中建立一个打开文件的数据结构,记录下我们打开的这个文件;

weixin_41880916的博客 1067

Linux系统文件编程

Linux系统中的文件编程操作函数介绍与实例,包括文件描述符的介绍,操作文件相关的API:open、write、read、close以及lseek的使用实例

dearzhangxp的博客 1221

Linux系统编程(系统文件IO)

这是通过空洞文件实现的。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写数据到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。buf 参数为要写入文件中数据的内存地址,count参数为欲从 buf写入文件的数据字节数,fd 参数为一文件描述符,指代数据要写入的文件。①lseek函数可以将文件位置调整到任意的位置,可以是已有数据的地方,也可以是未有数据的地方,假设调整到文件末尾之后的某个地方,那么文件将会形成所谓“空洞”

jxcklfn的博客 986

linux文件目录 的读、写和执行权限

1、文件权限 Linux 的文件和目录均具有读(r)、写(w)和可执行权限(x),合并起来就是rwx,表示同时拥有读写执行权限。 2、文件的所有用户或用户组权限 - owner: 文件所有者,即文件属于那个用户。 - group: 文件所有者所在的用户组。 - others: 其它用户 查看文件信息: 类型 权限 目录深度 用户名 用户组 大小 创建日期 文件或目录名称 - r...

baidu_35184576的博客 3922

Linux系统文件的读写

文件=内容+属性,当文件没有被操作的时候,一般文件还是在磁盘当中。文件操作=文件内容的操作+文件属性的操作,文件操作有可能即改变内容,又改变属性。文件操作其实就是把内容和属性加载到内存当中

m0_72532428的博客 1337

linux系统打开的文件,Linux系统文件的打开/读/写操作

Linux系统文件的打开/读/写操作open(打开文件)相关函数read,write,fcntl,close,link,stat,umask,unlink,fopen表头文件#include#include#include定义函数int open( const char * pathname, int flags);int open( const char * pathname, int flag...

weixin_39864489的博客 529

【Linux学习笔记】系统文件IO之重定向原理分析

本文介绍了Linux系统中文件I/O操作的基本原理,特别是重定向的实现机制。首先,文章通过C语言代码示例展示了如何通过系统调用(如open、read、write等)进行文件的读写操作,并详细解释了open函数的参数和返回值。接着,文章深入探讨了文件描述符(fd)的概念,指出文件描述符是进程与文件关联的关键,默认情况下,0、1、2分别代表标准输入、标准输出和标准错误。最后,文章通过代码示例演示了文件描述符的分配规则和重定向的实现,指出文件描述符的分配遵循最小可用原则,关闭标准输出后,新打开的文件会占用该描述符

大白的编程日记. 1193

【linux系统编程】基础IO+系统文件IO+文件描述符分配规则

这是一篇有关文件内容万字详解,深度从各个方面解释了有关文件的底层操作,以及内容。看完一定对文件有更深层次的理解!

fight_p的博客 1190

【Linux】系统文件接口

C文件接口与系统文件接口

weixin_74078718的博客 914
上一篇: Python字典(dict)数据类型练习题
下一篇: C语言实现Linux中的CP指令
Akzeptieren
博客等级 码龄8年 65粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值