C++ 读取【指定字符串头】的.DAT数据文件,并保存到txt文件中(绝对正确)

比如,.DAT文件的格式如下:

 我想读取数据流头为 $PSNSR 一行的数据,其他的数据都不要!

代码如下:

#include <iostream>
#include <iomanip>
#include <string.h>
#include <fstream>
#include <math.h>
#include <string>
#include<sstream>
#include <stdlib.h>
#include <cstring>




using namespace std;   

// DAT文件所在路径
std::string true_data_Path = "/home/jht/VIns_Code/DAT2bin/output/20211122234358.dat";   



int main()
{
  
    // 保存文件路径
    ifstream infile("/home/jht/VIns_Code/DAT2bin/output/20211122234358.dat");  

    string temp;
    if (!infile.is_open())
    {  
        cout<<"can not open the file \n"<<endl;
        return -1;
    }
    
    std::ofstream Openfile("/home/jht/VIns_Code/DAT2bin/output/20211122234358_sensor_data.txt");
    
      while(1) 
     {  
        getline(infile,temp) ;
        
        if(! temp.find("$PSNSR") )  // 判断
        {
           cout<<temp<<"\n";  // 打印
           
           Openfile<<temp;    // 保存数据
           Openfile<<"\n";    // 换行(重要)
        }
    }
    
    infile.close();
    return 0;  
}


 

话外:ASCII转成16进制的MATLAB 程序

clear
clc
close all


fp=fopen('sensor_data.txt','rb');  
data1=fread(fp); 

fp1=fopen('PSNSR.bin','w');  
fwrite(fp1,data1,'uint8')
fclose(fp1);

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
#include #include #include #include #include #include #define EPS 1e-5 //定义精度常数 using namespace std; //使用标准空间命名std namespace NameCComplex //定义命名空间NameCComplex { class CComplex ////定义一个CComplex类 { private: double Real,Image; public: CComplex(double real=0,double image=0) //构造函数 { Real=real; Image=image; } friend istream & operator>>(istream &is,CComplex &com); //重载输入 friend ostream & operator<(CComplex &com); int operator(CComplex &com) //重载运算符">",比较模的大小 { if(mod()>com.mod()) return 1; else return 0; } int CComplex::operator<(CComplex &com) { if(mod()>(istream &is,CComplex &com) //重载输入,可以输入a+bi的形式 { cout<>s; //用字符串的形式接受复数 int len=strlen(s); //求出字符串的长度 int n=0,sign=1; //n为当前从字符串提取出来的数字,初始化为0;sign是难道符号,初始化为正 com.Image=com.Real=0; for(int k=0;k<len;k++) //判断接受的字符串是否合法 { if((s[k] '9') && (s[k]!='+' && s[k]!='-' && s[k]!='i')) { cout<<"error"<<endl; return is; //错误,输出出错信息并返回 } } for(k=0;k<len;) //顺序识别字符串各字符 { if(n!=0 &&(s[k]=='-'||s[k]=='+')) //当前字符是否是符号位 { com.Real=sign*n; //是符号位,且n!=0,即n已被赋值,表明当前读取的是虚部的符号 n=0; //将原n*sign值赋给实部,将n清零,准备接受虚部的值 } if(s[k]=='-') //当前字符为负号 { sign=-1;k++; //给符号标志赋值 } if(s[k]=='+') //当前字符为正号 { sign=1;k++; //给符号标志赋值 } if(s[k]=='i') //当前字符为'I' { if(k!=len-1) //判断字符'I'是否为字符串作后一个字符 cout<='0' && s[k]<='9') //当前字符在0~9之间,将数字字符转换成数字数值 { n=n*10+s[k]-'0'; k++; } } if(s[len-1]!='i' && n!=0) //如果最后一个字符不是'I',表示复数对象内只有实部,没有虚部 { com.Real=n*sign; } return is; } ostream & operator<<(ostream &os,CComplex &com) //重载输入 { if(fabs(com.Image)<EPS) // 如果虚部为0 os<<com.Real; //只输出实部 else if((fabs(com.Real)<EPS)) //如果实部为0 os<<com.Image<0) os<<com.Real<<"+"<<com.Image<<"i"; else os<<com.Real<<com.Image<<"i"; //虚部为正 return os; } CComplex CComplex::operator+(CComplex &com) //加法重载 { CComplex sum; sum.Real=Real+com.Real; //实部相加 sum.Image=Image+com.Image; //虚部相加 return sum; } CComplex CComplex::operator*(CComplex &com) //乘法重载 { CComplex multi; multi.Real=Real*com.Real-Image*com.Image; //乘积实部 multi.Image=Real*com.Image+Image*com.Real; //乘积虚部 return multi; } CComplex CComplex::operator-(CComplex &com) //减法重载 { CComplex sub; sub.Real=Real-com.Real; sub.Image=Image-com.Image; return sub; } CComplex CComplex::operator+=(CComplex &com) //重载加法赋值 { Real=Real+com.Real; Image=Image+com.Image; return *this; } CComplex CComplex::operator-=(CComplex &com) //重载减法赋值 { Real=Real-com.Real; Image=Image-com.Image; return *this; } CComplex CComplex::operator*=(CComplex &com) //重载乘法赋值 { double nReal=Real*com.Real-Image*com.Image; double nImage=Real*com.Image+Image*com.Real; Real=nReal; Image=nImage; return *this; } int CComplex::operator==(CComplex &com) //重载等于 { if(Real==com.Real && Image==com.Image) return 1; else return 0; } void Test(void) //测试函数 { user.nTest++; cout<<"共10道题,做100以内的加减运算,满分100分:\n"; double real1,real2,image1,image2,real3,real4,image3,image4; CComplex answer,temp; int score=0; char op; for(int i=0;i<=9;i++) { /////为复数产生随机值 real1=rand()%200-100; image1=rand()%200-100; real2=rand()%200-100; image2=rand()%200-100; CComplex a(real1,image1),b(real2,image2); real3=rand()%20-10; image3=rand()%20-10; real4=rand()%20-10; image4=rand()%20-10; CComplex c(real3,image3),d(real4,image4); op=rand()%3; //产生随机加减乘法运算的三个值 switch(op) { case 0: answer=a+b; cout<<a<<"加上"<<b<<"等于"; break; case 1: answer=a-b; cout<<a<<"减去"<<b<<"等于"; break; case 2: answer=c*d; cout<<c<<"乘以"<<d<>temp; //输入用户计算值 if(answer==temp) //比较用户计算值 { score+=10; } else { cout<<"此题做错了\n"; cout<<"正确答案为:"<<answer<<endl; } } cout<<"你的最后得分是:"<<score<<endl; if(user.nTest<=3) { user.alAve=0; user.dlScore[user.nTest-1]=score; for(int i=0;i<user.nTest;i++) user.alAve+=user.dlScore[i]; user.alAve=user.alAve/user.nTest; } else { user.dlScore[0]=user.dlScore[1]; user.dlScore[1]=user.dlScore[2]; user.dlScore[2]=score; for(i=0,user.alAve=0;i<3;i++) user.alAve+=user.dlScore[i]; user.alAve=user.alAve/3; } cout<<"请按任意键继续\n"; cout.flush(); cin.get(); cin.get(); } void Add() //复数加法运算函数 { user.nAdd++; CComplex num1,num2,sum,Zero(0,0); cout<<"加法计算\n"<<"最少输入两个复数,并且以0结束\n"; cout<>num1; cout<>num2; sum=num1+num2; cout<>num1; int i=4; while(!(num1==Zero)) { sum=sum+num1; cout<<"第"<<i<>num1; i++; } cout<<"加法结果是:"<<sum<<endl; cout<<"请按任意键继续\n"; cout.flush(); cin.get(); cin.get(); } void Sub() //复数减法预算函数 { user.nSub++; CComplex num1,num2,sub,Zero(0,0); cout<<"最少输入两个复数,并且以0结束\n"; cout<>num1; cout<>num2; sub=num1-num2; cout<>num1; int i=4; while(!(num1==Zero)) { sub=sub-num1; cout<<"第"<<i<>num1; i++; } cout<<"减法结果是:"<<sub<<endl; cout<<"请按任意键继续\n"; cout.flush(); cin.get(); cin.get(); } void Mul() //复数乘积函数 { user.nMul++; CComplex num1,num2,mul,Zero(0,0); cout<<"乘法计算\n"<<"最少输入两个复数,并且以零结束\n"; cout<>num1; cout<>num2; mul=num1*num2; cout<>num1; int i=4; while(!(num1==Zero)) { mul*=num1; cout<<"第"<<i<>num1; i++; } cout<<"乘法结果是:"<<mul<<endl; cout<>num1; ++num1; cout<<"自加的结果为"<<num1<<endl; cout<>num1; --num1; cout<<"自减的结果为"<<num1<<endl; cout<<"按任意键结束\n"; cout.flush(); cin.get(); cin.get(); } void compare() //两复数比较函数 { CComplex num1,num2; cout<<"输入两个复数\n"; cout<>num1; cout<>num2; if(num1==num2) cout<num2) cout<<num1<<"的模大于"<<num2<<"的模\n"; else if(num1<num2) cout<<num2<<"的模大于"<<num1<<"的模\n"; else cout<<"这两个复数的模相等\n"; cout<<"按任意键继续\n"; cin.get(); cin.get(); } void userprint() //输出用户信息函数 { cout<<user.szName<<"使用的次数为:"<<user.nTime<<endl; cout<<"其:\t加法的次数:"<<user.nAdd<<"\t减法的次数:"<<user.nSub<<"\t乘法的次数:"<<user.nMul<<endl; cout<<"\t测试次数:"<<user.nTest<<"\t平均成绩:"<<user.alAve<<endl; } void Login() //当前用户信息函数 { char szName[20]; cout<<"请输入您的姓名:"; cin.getline(szName,20); ifstream infile; User user1; infile.open("user.dat",ios::binary|ios::in); if(!infile) { cout<<"没有原始记录文件,您是第一个用户!\n"; strcpy(user.szName,szName); user.nTest++; return; } infile.read((char *)&user1,sizeof(User)); while(!infile.eof()) { if(strcmp(user1.szName,szName)==0) { user=user1; user.nTime++; cout<<"欢迎您再次使用复数计算器!"; userprint(); cin.get(); infile.close(); return; } infile.read((char *) &user1,sizeof(User)); } cout<<"欢迎您再次使用复数计算器!"; strcpy(user.szName,szName); user.nTime++; infile.close(); return; } void SaveFile() //用户资料保存函数 { userprint(); fstream file; User user1; file.open("user.dat",ios::binary|ios::in|ios::out); if(!file) { cout<<"文件打开错误,不能进行更新!\n"; return; } file.seekp(0,ios::beg); while(!file.eof()) { file.read((char *)&user1,sizeof(User)); if(strcmp(user1.szName,user.szName)==0) { file.seekp(-(sizeof(User)),ios::cur); file.write((char *)&user,sizeof(User)); file.close(); return; } } file.close(); fstream outfile; outfile.open("user.dat",ios::binary|ios::app); outfile.write((char *)&user,sizeof(User)); outfile.close(); return; } } using namespace NameCComplex; int main(void) //主函数开始 { srand(time(NULL)); //初始化随机数“种子”语句 Login(); //当前用户信息函数 char strChoise[20]; //定义字符串名 do { system("cls"); cout<<"\t这是一个简单的复数计算器程序,可以实现以下功能,请按对应的按键(1-7)\n\n\n"; cout<<"\t=========================MENU===========================\n"; cout<<"\t1:多复数加法,以0结束\n"; cout<<"\t2:多复数减法,以0结束\n"; cout<<"\t3:测试100以内的复数加减乘法运算,1次测试10道题\n"; cout<<"\t4:多复数乘法,以0结束\n"; cout<<"\t5:复数自加\n:"; cout<<"\t6:复数自减\n:"; cout<<"\t7:复数比较\n:"; cout<<"\t0:退出程序\n\n:"; cout<>strChoise; if(strcmp(strChoise,"1")==0) //用户选1则调用Add()函数 Add(); else if(strcmp(strChoise,"2")==0) //用户选2则调用Sub()函数 Sub(); else if(strcmp(strChoise,"3")==0) //用户选3则调用Test()函数 Test(); else if(strcmp(strChoise,"4")==0) //用户选4则调用Add()函数 Mul(); else if(strcmp(strChoise,"5")==0) //用户选5调用Add1()函数 Add1(); else if(strcmp(strChoise,"6")==0) //用户选6则调用Sub1()函数 Sub1(); else if(strcmp(strChoise,"7")==0) //用户选7则调用Compare()函数 compare(); else if(strcmp(strChoise,"0")==0) //用户选0则结束调用函数 { cout<<"\n\n\t欢迎下次继续使用复数计算器!\n\n"; break; } else { cout<<"\n\t输入错误,请按任意键继续!\n"; cin.get(); cin.get(); } } while((strcmp(strChoise,"0"))); SaveFile(); //调用用户资料保存函数 return 0; }
问题描述: 利用哈夫曼编码进行信息通讯可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码(复原)。对于双工信道 (即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼码的编译码系统。 基本要求: 一个完整的系统应具有以下功能: (l)I:初始化 (Initialization)。从终端读入字符集大小n,及n个字符和m个权值,建立哈夫曼树,并将它存于文件hfmtree。 (2)C:编码 (Coding)。利用已建好的哈夫曼树(如不在内存,则从文件hfmtree读入),对文件tobetrans的正文进行编码,然后将结果存入文件codefile。 (3)D:编码 (Decoding)。利用已建好的哈夫曼树将文件codefile的代码进行译码,结果存入文件textfile。 (4)P:印代码文件 (Print)。将文件codefile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件codeprint。 (5)T:印哈夫曼树 (Tree printing)。将已在内存的哈夫曼树以直观的方式 (树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件treeprint。 实现提示 根据题目要求把程序划成5个模块,设计成菜单方式,每次执行一个模块后返回菜单。 除了初始化(I)过程外,在每次执行时都经过一次读取磁盘文件数据。这是为了如果在程序执行后一直没有进行初始化(I)过程,为了能使后面的操作顺利进行,可以通过读取旧的数据来进行工作。比如:如果程序的工作需要的字符集和权值数据是固定的,只要在安装程序时进行一次初始(I)化操作就可以了。再在次运行程序时,不管进行那项操作都可以把需要的数据读入到内存。 算法分析 本程序主要用到了三个算法。 (1)哈夫曼编码 在初始化(I)的过程间,要用输入的字符和权值建立哈夫曼树并求得哈夫曼编码。先将输入的字符和权值存放到一个结构体数组,建立哈夫曼树,将计算所的哈夫曼编码存储到另一个结构体数组。 (2)串的匹配 在编码(D)的过程间,要对已经编码过的代码译码,可利用循环,将代码的与哈夫曼编码的长度相同的串与这个哈夫曼编码比较,如果相等就回显并存入文件。 (3)二叉树的遍历 在印哈夫曼树(T)的,因为哈夫曼树也是二叉树,所以就要利用二叉树的先序遍历将哈夫曼树输出。 [测试数据] 根据实验要求,在tobetrans.dat输入"THIS PROGRAM IS MY FAVORITE",字符集和其频度如下: 字符 __ A B C D E F G H I J K L M 频度 186 64 23 22 32 103 21 15 47 57 1 5 32 20 字符 N O P Q R S T U V W X Y Z 频度 20 56 19 2 50 51 55 30 10 11 2 21 2
第十三章 文件数据的管理无论是用数组还是链表,都是存储在内存的,程序结束后都会丢失,下一次运行程序时,要重新输入或运算生成数据。要把程序运行的数据保存起来以便下次运行继续使用,在计算机持久保存数据的方式是利用文件保存。 13.1 文件概述 文件一般是指存储在外部介质上数据的集合。文件数据形式存放在外部介质上,操作系统以文件为单位对数据进行管理。想找到存在外部介质上的数据,必须按文件名找到指定文件然后再从该文件读取数据。要想在外部介质上存储数据必须先建立一个文件(以文件名标识),才能向它输出数据。从操作系统角度,每一个与主机相连的输入输出设备都可以被看作一个文件。在程序运行时,常常需要将一些数据(运行的最终结果或数据)输出到磁盘上保存,以后要用时再从磁盘输入到计算机的内存,这就要用到磁盘文件。 操作系统的文件标识包括三部分: (1)文件路径:表示文件在外部存储设备的位置。 (2)文件名:遵循标识符的命名规则。 (3)文件扩展名:表示文件的性质(.txt .dat .c)。 如:d:\c++\temp\flie1.dat 文件操作是一种典型的IO操作(输入输出操作)。输入输出是针对内存而言的,进内存为输入,出内存为输出。 标准输入输出就是标准输入设备(键盘)和标准输出设备(显示器),键盘和显示器就是一种文件。C语言将文件看成字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成。C语言文件的存取是以字符(字节)为单位的,输入输出数据流的开始和结束仅受程序控制不受物理符号控制(如回车换行符)。输出时不会自动增加回车换行符作为记录结束的标志,输入时不以回车换行符作为记录的间隔(实际上C文件不是由记录构成的),这种文件称为流式文件。 ANSI新标准文件采用缓冲方式,系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区。从内存向磁盘输出数据必先送到输出缓冲区,装满缓冲区后才一起送到磁盘。从磁盘向内存输入数据先送到输入缓冲区,程序需要数据时去缓冲区读取,若缓冲区无数据,则程序进入阻塞状态(等待数据)。 C语言把数据看作是一连串的字符(字节),根据数据的组成形式,分为ASCII文件和二进制文件。 文本文件又称ASCII文件,每个字节存放一个ASCII码,代表一个字符。如1、2的ASCII码分别为49、50,所以整数12用ASCII文件存放时,存放形式为00110001 00110010 二进制文件是直接用数据的二进制形式存放的,即把内存数据按其在内存的存储形式原样输出到磁盘上存放。 程序实现对文件的处理通常分三步: (1)打开文件:将程序与文件建立联系。 (2)操作文件:对文件进行读写操作,即输入输出。 (3)关闭文件:操作完成应当切断文件与程序的联系。 C语言没有输入输出语句,对文件的读写都是用库函数实现的。ANSI规定了标准输入输出函数,用它们对文件进行读写,这些函数的声明包含在文件stdio.h。 13.2 文件的打开与关闭 文件进行读写操作前先要打开,使用完毕要关闭。打开文件,是建立文件的各种有关信息,并使文件指针指向该文件,以便进行其他操作。关闭文件则断开指针与文件之间的联系。 1.打开文件(fopen函数) 原型:FILE *fopen(char *filename, char *mode); FILE是在stdio.h文件定义的一个结构体,用来保存文件信息。 fopen函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(文件名,使用文件方式); 其: ·“文件指针名”必须是被说明为FILE类型的指针变量。 ·“文件名”是被打开文件文件名,是字符串常量或字符串数组。 ·“使用文件方式”是指文件的类型和操作要求。 如: FILE *fp; fp=fopen("file1.txt","r"); 其意义是在当前目录下打开文件file1.txt,只允许读操作,并使fp指向该文件。 又如: FILE *fp; fp=fopen("c:\\file2.txt","rb"); 意义是打开C驱动器磁盘根目录下的文件file2.txt,对其按二进制方式进行读操作。两个反斜线\\的第一个表示转义字符,第二个表示根目录。 文件打开方式 r 只读打开一个文本文件,只允许读数据 w 只写打开或建立一个文本文件,只允许写数据 a 追加打开一个文本文件,并在文件末尾写数据 r+ 读写打开一个文本文件,允许读和写 w+ 读写打开或建立一个文本文件,允许读和写 a+ 读写打开一个文本文件,允许读和在文件末尾写数据 rb 只读打开一个二进制文件,只允许读数据 wb 只写打开或建立一个二进制文件,只允许写数据 ab 追加打开一个二进制文件,并在文件末尾写数据 rb+ 读写打开一个二进制文件,允许读和写 wb+ 读写打开或建立一个二进制文件,允许读和写 ab+ 读写打开一个二进制文件,允许读和在文件末尾写数据 (1)文件使用方式由r、w、a、b、+拼成,含义分别为: r(read) 读 w(write) 写 a(append) 追加 b(binary)二进制文件 + 读和写 (2)用r方式打开文件文件必须存在,只能从该文件读出。 (3)用w方式打开只能向文件写入。若打开的文件不存在,则以指定文件名建立新文件。若存在,则将存在的文件删除,重建新文件。 (4)向一个已存在的文件追加新的信息,只能用a方式打开。文件必须存在,否则会出错。 (5)打开文件出错时fopen将返回一个空指针值NULL。程序可用这一信息判断是否完成打开文件的工作,并做相应的处理。因此常用以下程序段打开文件: if((fp=fopen("c:\\file2.txt","rb"))==NULL) { printf("\nerror on open c:\\file2.txt!"); exit(0); } (6)把文本文件读入内存时,要将ASCII码转换成二进制码。把内存数据以文本方式写入磁盘时,要将二进制码转换成ASCII码。因此文本文件的读写花费较多的转换时间,对二进制文件的读写不存在这些转换。 (7)标准输入文件(键盘)、标准输出文件(显示器)、标准出错输出(出错信息)是由系统打开的,可直接使用。 2.关闭文件(fclose函数) 文件使用完毕,应用关闭文件函数把文件关闭,从而把缓冲区的数据写入文件。否则程序结束时可能造成数据丢失。 fclose函数使用形式: fclose(文件指针); 如:fclose(fp); 正常完成关闭文件操作时,fclose函数返回值0。发生错误时返回EOF。 13.3 文件读写 对文件的读和写是最常用的文件操作,在C语言标准库提供了多种文件读写的函数。 字符读写函数:fgetc和fputc 字符串读写函数:fgets和fputs 数据块读写函数:fread和fwrite 格式化读写函数:fscanf和fprintf 13.3.1 字符读写函数 1.读字符函数fgetc 规格:int fgetc(FILE * stream); 功能:从指定文件读一个字符。 参数:stream为指向文件的指针。 返回值:从stream所指的文件读取一个字符,转换为int类型返回。若已到文件尾返回EOF,文件状态改为结束状态。若读错误返回EOF,文件改为错误状态。EOF在stdio.h定义为-1。 例如: ch=fgetc(fp); 其含义是从打开的文件fp读取一个字符并送入ch。 对于fgetc函数的使用有几点说明: (1)在fgetc函数调用读取文件必须是以读或读写方式打开的。 (2)文件内部有一个位置指针,用来指向文件的当前读写字节,文件打开时,位置指针总指向文件的第一个字节。使用fgetc函数后位置指针向后移动一个字节。因此可连续多次使用fgetc函数读取多个字符。文件指针是指向整个文件的,要在程序定义说明,只要不重新赋值文件指针值不变。文件内部的位置指针用于指示文件内部的当前读写位置,每读写一次,位置指针向后移动,它无需在程序定义说明,由系统自动设置。 例:读取文本文件file.txt,把其所有非空格字符输出在标准输出设备上。 #include<stdio.h> #include<conio.h> #include<stdlib.h> int main() { FILE *fp; char ch; if((fp=fopen("file.txt","r"))==NULL) { printf("\nCan't open file,strike any key exit!"); getch(); /*等待敲键盘,显示Can't open file,strike any key exit!*/ exit(1); /*结束程序*/ } ch=fgetc(fp); while(ch!=EOF) /*文件结束时读取得到EOF*/ { if(ch!=' ') putchar(ch); ch=fgetc(fp); } fclose(fp); return 0; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

他人是一面镜子,保持谦虚的态度

你的鼓励是我最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值