欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    C语言程序设计与数据结构课件第10章.ppt

    • 资源ID:5375363       资源大小:1.93MB        全文页数:43页
    • 资源格式: PPT        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    C语言程序设计与数据结构课件第10章.ppt

    C语言程序设计与数据结构,第10章 文件读写,C语言程序设计与数据结构,教学提示:存储在变量和数组(即内存)中的数据是临时的,这些数据在程序运行结束后会消失,而文件可以用来永久地保存大量的数据。如果有些数据需要反复使用或永久保存,应该考虑使用文件来完成。教学要求:本章要掌握文件在读写之前必须打开,读写结束必须关闭。文件可按只读、只写、读写、追加四种操作方式打开,同时还必须指定文件的类型是二进制文件还是文本文件。文件可按字节,字符串,数据块为单位读写,文件也可按指定的格式进行读写。文件内部的位置指针可指示当前的读写位置,移动该指针可以对文件实现随机读写。,C语言程序设计与数据结构,10.1文件概述与文件指针,所谓“文件”是指一组相关数据的有序集合。我们在前几章中已多次接触使用过文件,例如源程序文件、目标文件、可执行文件、库文件(头文件)等。,C语言程序设计与数据结构,10.1.1 文件分类,文件通常是驻留在外部介质(如磁盘等)上的,在使用时才调入内存中来。C语言把文件看作是由一个个字符(字节)的数据顺序组成的。它把数据看作是连续的字符(字节)流,这样它对文件的存取实际上是以字符(字节)为单位的。输入输出的数据流的开始和结束只受程序的控制而不受特定符号(比如回车换行符)的控制。也就是说,C语言在输出数据到文件中时,并不会自动增加回车换行符以示结束,在输入时也不会以读入回车换行符作为数据的间隔。,C语言程序设计与数据结构,10.1.1 文件分类,从用户的角度看,文件可分为普通文件和设备文件两种。根据文件的存储形式,可分为ASCII码文件和二进制文件两种:(1)ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如一个整型数据1234在文本文件中占4个字节。我们用Windows自带的记事本软件打开该类型文件能读懂文件中的内容。(2)二进制文件是按二进制的编码方式来存放文件的。例如一个整型数据230在二进制文件中占2个字节。,C语言程序设计与数据结构,10.1.2 文件类型指针,在语言中要使用文件,必须用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。定义文件指针的一般形式为:FILE*指针变量标识符;其中FILE必须为大写,它是在头文件stdio.h中定义的一个结构体,该结构体中含有文件名、文件状态和文件当前位置等信息,我们编程时不必关心FILE结构的细节。例如:FILE*fp;表示定义了一个名为fp的文件指针。如果变量fp已被正确赋值,则可以根据结构变量fp所提供的信息找到一个文件并实施对该文件的操作。习惯上把fp称为指向一个文件的指针。,C语言程序设计与数据结构,10.2文件的打开与关闭,使用文件必须遵循“先打开,再对文件进行读写操作,最后关闭文件”的原则。在语言中,对文件的这些操作都可以由库函数来完成,对用到的库函数的声明包含在文件stdio.h中,因此在编程中要操作文件时,要使用头文件包含命令#include“stdio.h”。,C语言程序设计与数据结构,10.2.1文件的打开,所谓打开文件,实际上是获得文件的各种有关信息,并使文件指针指向该文件,以便进行下一步操作。C语言提供了函数fopen来打开文件。其使用格式为:文件指针名=fopen(文件名,使用文件方式);其中,“文件指针名”必须是已被说明为FILE 类型的指针变量;“文件名”是将被打开的文件的文件名,通常是字符串常量或字符串数组(注意路径的分隔符应使用“”);“使用文件方式”是指文件的类型和操作要求,是一个由一对双引号括起来的字符串,共有12种,具体的符号表示和含义见表10-1。,C语言程序设计与数据结构,C语言程序设计与数据结构,fopen打开文件,例如:FILE*fpTa;fpTa=fopen(c:cprogramabc,rb);/*反斜线“”中的第一个表示转义字符*/其意义是打开C驱动器磁盘的cprogram子目录下的文件abc,这是一个二进制文件,只允许按二进制方式进行读操作。又如:FILE*fp;fp=fopen(mytest1.txt,r);其意义是在当前目录下打开文件mytest1.txt,只允许进行“读”操作,并使fp指向该文件。,C语言程序设计与数据结构,10.2.2文件关闭函数,在使用完一个文件以后,应该将该文件关闭,以防止它再被调用或丢失数据。“关闭”就是使文件指针变量不再指向该文件,也就是文件指针变量与该文件“断开”,此后不能通过该指针对原来与其相联系的文件进行读、写操作(除非再次打开该文件,使文件指针变量重新指向该文件)。fclose()函数用来关闭一个已经由fopen()函数打开的文件,正常完成关闭文件操作时,fclose函数返回值为0,有错误发生则返回非零值。其调用的一般形式为:fclose(文件指针);例如:fclose(fp);,C语言程序设计与数据结构,10.3 文件位置指针的有关函数,在文件内部有一个位置指针,用来指向文件的当前读写字节。在文件打开时,该位置指针总是指向文件的第一个字节。使用下面章节介绍的fgetc等函数对文件进行读写后,该位置指针将自动向后移动。但文件指针和文件内部的位置指针不是一回事。文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。文件内部的位置指针用以指示文件内部的当前读写位置,每读写一次,该指针均自动向后移动,它不需在程序中定义说明,而是由系统自动设置的。,C语言程序设计与数据结构,顺序读写和随机读写,文件的读写方式分为顺序读写和随机读写。(1)顺序读写即读写文件只能从头开始,顺序读写各个数据。但在实际问题中常要求只读写文件中某一指定的部分,为了解决这个问题可移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称为随机读写。(2)随机读写可以通过利用系统函数去主动移动文件内部的位置指针来实现。这样的函数主要有两个,即 rewind 函数和fseek函数。实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。在移动位置指针之后,即可用后面介绍的任一种读写函数进行读写。由于一般是读写一个数据据块,因此常用fread和fwrite函数。,C语言程序设计与数据结构,rewind函数,rewind函数的功能是把文件内部的位置指针移到文件首。其调用形式为:rewind(文件指针);“文件指针”指向被移动的文件。,C语言程序设计与数据结构,fseek函数,fseek函数用来移动文件内部位置指针,其调用形式为:fseek(文件指针,位移量,起始点);其中:“文件指针”指向被移动的文件。“位移量”表示移动的字节数,要求位移量是long型数据,以便在文件长度大于64KB 时不会出错。当用常量表示位移量时,要求加后缀“L”。“起始点”表示从何处开始计算位移量,规定的起始点有三种:文件首,当前位置和文件尾。,C语言程序设计与数据结构,C语言程序设计与数据结构,例如:fseek(fp,100L,0);/*将文件位置指针移到离文件头100个字节处*/fseek(fp,20L,1);/*将文件位置指针从当前位置后移20个字节的位置*/fseek(fp,-10L,SEEK_END);/*将文件位置指针从文件末尾前移10个字节的位置*/注意:fseek函数一般用于二进制文件。在文本文件中由于要进行转换,往往计算的位置会出现错误。,C语言程序设计与数据结构,ftell函数:用来得到流式文件中的当前位置,用相对于文件开头的位移量来表示。如返回-1L则表示出错。例如:long a;a=ftell(fp);文件结束检测函数feof函数feof()判断文件是否处于文件结束位置,如文件结束,则返回值为1,否则为0。其调用格式为:feof(文件指针);说明:文件结束标志EOF(每个文件末有一结束标志EOF,值为-1)只适用于判断文本文件是否结束。而函数feof()则对文本文件和二进制文件都适用。,C语言程序设计与数据结构,10.4读写文件,10.4.1字符读写函数fgetc和fputc 是以字符(字节)为单位的读写函数。每次可从文件读出或向文件写入一个字符。字符输入/出函数所处理的文件可以是文本文件,也可以是二进制文件。10.4.2字符串读写函数fgets和fputs 处理的文件一般是文本文件,读写的数据以字符串为单位。10.4.3数据块读写函数fread和fwtrite 用于整块数据的读写函数。可用来读写一组数据,如一个数组、一个结构变量的值等。10.4.4格式化读写函数fscanf和fprintf 与前面使用的scanf和printf 函数的功能相似,都是格式化读写函数。两者的区别在于fscanf函数和fprintf函数的读写对象不是键盘和显示器,而是磁盘文件。,C语言程序设计与数据结构,读字符函数fgetc,fgetc函数的功能是从指定的文件中读取一个字符,函数调用的一般形式为:字符变量=fgetc(文件指针);例如:ch=fgetc(fp);其意义是从打开的文件fp中读取一个字符并送入字符变量ch中。对于fgetc函数的使用有以下几点说明:(1)在fgetc函数调用中,读取的文件必须是以读或读写方式打开的。(2)读取字符的结果也可以不向字符变量赋值,例如fgetc(fp);但是读出的字符不能保存。(3)文件内部的位置指针在文件打开时总是指向文件的第一个字节。使用fgetc函数后,该位置指针将向后移动一个字节。因此可连续多次使用fgetc函数来读取多个字符。,C语言程序设计与数据结构,【例10.1】将C盘根目录下的文本文件test1.txt的内容在屏幕上输出。#includemain()FILE*fp;/*定义了文件指针fp*/char ch;if(fp=fopen(c:test1.txt,r)=NULL)/*以读文本文件方式打开并使fp指向该文件*/printf(nCannot open file,strike any key to exit!);getchar();exit(1);ch=fgetc(fp);/*先读出一个字符,然后进入循环*/while(ch!=EOF)/*判断文件是否结束*/putchar(ch);/*把该字符显示在屏幕上*/ch=fgetc(fp);/*再读入下一字符*/fclose(fp);printf(“n”);本例程序的功能是从文件中逐个读取字符,并在屏幕上显示。如打开文件出错,给出提示并退出程序。只要读出的字符不是文件结束标志EOF,就把该字符显示在屏幕上,再读入下一字符。每读一次,文件内部的位置指针向后移动一个字符,文件结束时,该指针指向EOF。执行本程序将显示文件c:test1.txt的所有内容。,C语言程序设计与数据结构,写字符函数fputc(),fputc函数的功能是把一个字符写入指定的文件中,如写入成功则返回写入的字符,否则返回一个EOF,可用此来判断写入是否成功。函数调用形式为:fputc(字符量,文件指针);/*字符量是待写入的字符常量或变量*/例如:fputc(x,fp);其意义是把字符x写入fp所指向的文件的位置指针的当前位置中。每写入一个字符,文件内部位置指针向后移动一个字节。被写入的文件可以用写、读写、追加方式打开。,C语言程序设计与数据结构,【例10.2】将从键盘上输入的一些字符(以“*”作为结束)写入c盘根目录下名为test2.txt的文本文件中。#include stdio.hmain()FILE*p;char ch;if(p=fopen(c:test2.txt,w)=NULL)printf(File can not open!n);exit(0);printf(Please input,end input with*character:);while(ch=getchar()!=*)fputc(ch,p);fclose(p);printf(Write over!n);程序运行结束后,可以在c盘根目录下打开test2.txt查看其内容。思考一下,如果在写入完毕后想马上把刚才输入的内容打印在屏幕上该如何实现?,C语言程序设计与数据结构,字符串输入/出函数,字符串输入/出函数所处理的文件一般是文本文件,读写的数据以字符串为单位。1.读字符串函数fgets功能是从指定的文件中读一个字符串到字符数组中.函数调用的形式为:fgets(字符数组名,n,文件指针);其中n是一个正整数。该函数表示从文件中读出n-1个字符(如在读满n-1个字符之前就遇到了换行符或EOF,则读出提前结束),并在读取的最后一个字符后加上串结束标志0。fgets函数的返回值是字符数组的首地址。读取字符串后文件位置指针也自动后移若干个位置。例如:fgets(str,n,fp);意义是从fp所指的文件中读出n-1个字符送入字符数组str中。,C语言程序设计与数据结构,【例10.3】从test2.txt文件中读入8个字符组成一个字符串。#includemain()FILE*fp;char arr20;if(fp=fopen(c:test2.txt,r)=NULL)printf(nCannot open file,strike any key exit!);getchar();exit(1);fgets(arr,9,fp);printf(n%sn,arr);fclose(fp);本例定义了一个字符数组str共20个字节,在以读文本文件方式打开文件string后,从中读出8个字符送入str数组,在第9个数组元素str8内加上0,然后在屏幕上显示输出str数组存放的字符串。输出的八个字符正是例10.2的前八个字符。,C语言程序设计与数据结构,2.写字符串函数fputsfputs函数的功能是向指定的文件写入一个字符串(不写入字符串结束标记0),当成功写入一个字符串后,文件的位置指针会自动后移,函数返回值为0;否则,返回EOF(符号常量,其值为-1)。其调用形式为:fputs(字符串,文件指针);其中字符串可以是字符串常量,也可以是字符数组名或指针变量。例如:fputs(“a1b2”,fp)是把字符串“a1b2”写入fp所指的文件之中。,C语言程序设计与数据结构,【例10.4】在文件test2.txt中追加一个不超过20个字符的字符串。#includemain()FILE*fp;char ch,st21;int count;if(fp=fopen(c:test2.txt,a+)=NULL)printf(Cannot open file strike any key exit!);getchar();exit(1);printf(input a string:n);gets(st);/*输入不超过20个字符的字符串暂放入数组st中*/fputs(st,fp);rewind(fp);/*文件内部位置指针移到文件的开始位置*/printf(“n All of this file is:n”);ch=fgetc(fp);while(ch!=EOF)putchar(ch);ch=fgetc(fp);printf(n);fclose(fp);本例要求在test2.txt文件末添加一个字符串,因此,在程序第7行以追加读写文本文件的方式打开文件test2.txt。然后输入字符串暂放入数组st中,并用fputs函数把该串写入文件test2.txt。后在程序中用rewind函数把文件内部位置指针移到文件首,再进入循环逐个显示当前文件中的全部内容。要注意用scanf(“%s”,st)和gets(st)输入字符串时的不同。思考:如果不用EOF,而是用feof()来判断文件结束,上述阴影部分程序该如何改写?,C语言程序设计与数据结构,数据块读写函数fread和fwtrite,语言还提供了用于整块数据的读写函数。可用来读写一组数据,如一个数组、一个结构变量的值等。读数据块函数调用的一般形式为:fread(buffer,size,count,fp);写数据块函数调用的一般形式为:fwrite(buffer,size,count,fp);其中:size 表示每个数据块的字节数。count 表示要读写的数据块块数。fp 表示文件指针。buffer 是一个指针。,C语言程序设计与数据结构,fread(buffer,size,count,fp)的功能是从fp所指向文件的位置指针的当前位置读取count块数据(每个数据所占的字节数为size),共组成count块长度为size的数据存入butter所指定的内存空间中,当正确的读取了count块数据后,文件内部指针会自动后移count*size个字节的位置,若数据存入正确,则返回count值,否则返回NULL(符号常量,其值为0)。例如:fread(fa,4,5,fp);其意义是从fp所指的文件中,每次读4个字节(一个实数)送入实型数组fa中,连续读5次,即读5个实数到fa中。fwrite(buffer,size,count,fp)表示将从buffer起始地址的count块数据(每块数据的字节数为size)写入到fp所指向的文件中,当正确的写入count块数据后,文件位置指针会自动后移count*size个字节的位置。若数据写入正确,则返回count值;否则返回NULL(符号常量,其值为0)。,C语言程序设计与数据结构,【例10.5】从键盘上输入10个整数,并把这些整数写入c:盘根目录下名为test3.dat的二进制文件中。#include stdio.hmain()FILE*fp;int data10,i;if(fp=fopen(c:test3.dat,wb)=NULL)printf(File can not open!n);exit(0);printf(“Input ten integers:”);for(i=0;i10;i+)scanf(%d,C语言程序设计与数据结构,【例10.6】从c:盘根目录下名为test3.dat的二进制文件中读取10个整数,要求先读取第610个整数,再读取第15个整数。并把它们输出到屏幕上显示。#include stdio.hmain()FILE*fp;int data10,i;if(fp=fopen(c:test3.dat,rb)=NULL)printf(File can not open!n);exit(0);fseek(fp,5L*sizeof(int),0);/*先把文件位置指针后移*/fread(data,sizeof(int),5,fp);/*先读取第610个整数放入data0data4*/rewind(fp);/*把文件位置指针移到文件开始*/fread(data+5,sizeof(int),5,fp);/*再读取第15个整数放入data5data9*/fclose(fp);for(i=0;i10;i+)printf(%5d,datai);,C语言程序设计与数据结构,【例10.7】从键盘输入三个学生数据,写入一个文件中,再读出这两个学生的数据显示在屏幕上。#includestruct stu char name20;int num;int age;char addr30;boya3,boyb3,*pp,*qq;main()FILE*fp;int i;pp=boya;qq=boyb;if(fp=fopen(c:studata,wb+)=NULL)printf(Cannot open file strike any key exit!);getchar();exit(1);,C语言程序设计与数据结构,for(i=0;iname,本例程序定义了一个结构stu,说明了两个结构数组boya和boyb以及两个结构指针变量pp和qq。pp指向boya,qq指向boyb。程序首先以读写方式打开二进制文件“studata”,输入三个学生数据之后,写入该文件中。然后把文件内部位置指针移到文件首,读出三块学生数据后,在屏幕上显示。,C语言程序设计与数据结构,格式化读写函数fscanf和fprintf,fscanf函数,fprintf函数与前面使用的scanf和printf 函数的功能相似,都是格式化读写函数。两者的区别在于fscanf函数和fprintf函数的读写对象不是键盘和显示器,而是磁盘文件。这两个函数的调用格式为:fscanf(文件指针,格式字符串,输入表列);fprintf(文件指针,格式字符串,输出表列);例如:fscanf(fp,%d%s,用fscanf和fprintf函数也可以完成例10.7的问题。修改后的程序如例10.8所示。,C语言程序设计与数据结构,【例10.8】用fscanf和fprintf函数解决例10.7的问题。#includestruct stu char name20;int num;int age;char addr30;boya3,boyb3,*pp,*qq;main()FILE*fp;int i;pp=boya;qq=boyb;if(fp=fopen(c:studata,wb+)=NULL)printf(Cant open file strike any key exit!);getch();exit(1);,C语言程序设计与数据结构,printf(ninput datan);for(i=0;iname,本程序中fscanf和fprintf函数每次只能读写一个结构体数组元素,因此采用了循环语句来读写全部数组元素。还要注意指针变量pp,qq。由于循环改变了它们的值,因此在程序中分别对它们重新赋予了数组的首地址。,C语言程序设计与数据结构,【例10.9】把命令行参数中的前一个文件名标识的文件,复制到后一个文件名标识的文件中,如命令行中只有一个文件名则把该文件写到标准输出文件(显示器)中。#includemain(int argc,char*argv)FILE*fp1,*fp2;char ch;if(argc=1)/*如命令行参数中没有给出文件名,则给出提示信息*/printf(Have not enter file name,strike any key exit);getchar();exit(0);if(fp1=fopen(argv1,rt)=NULL)printf(Cannot open%sn,argv1);getchar();exit(1);.,C语言程序设计与数据结构,if(argc=2)/*如果只给出一个文件名,则使fp2指向标准输出文件(即显示器)*/fp2=stdout;else if(fp2=fopen(argv2,wt+)=NULL)printf(Cannot open%sn,argv1);getchar();exit(1);while(ch=fgetc(fp1)!=EOF)/*用循环语句逐个读出文件1中的字符再送到文件2中*/fputc(ch,fp2);fclose(fp1);fclose(fp2);本程序为带参数的main函数。程序中定义了两个文件指针fp1和fp2,分别指向命令行参数中给出的文件。如命令行参数中没有给出文件名,则给出提示信息。如果只给出一个文件名,则使fp2指向标准输出文件(即显示器)。然后用循环语句逐个读出文件1中的字符再送到文件2中。假设项目名称为cexam1_1,则生成一个可执行文件cexam1_1.exe。在DOS下运行结果如图所示:,C语言程序设计与数据结构,第一次运行,不指定文件名,系统提示have not enter file name,strike any key exit。再次运行时,给出了一个文件名test1.txt,故输出给标准输出文件stdout,即在显示器上显示文件test1.txt的内容“1234”。第三次运行,给出了二个文件名,因此把test1.txt中的内容读出,写入到test9.txt之中。通过用DOS命令type显示,可以看到test9.txt的内容也是“1234”。,C语言程序设计与数据结构,【例10.10】以下叙述中不正确的是()。(A)C语言中的文本文件以 ASCII 码形式存储数据(B)C语言中对二进制文件比对文本文件的访问速度快(C)C语言中,随机读写方式不适用于文本文件(D)C语言中,顺序读写方式不适用于二进制文件分析:文本文件的每个字节存放一个 ASCII 码,代表一个字符。所以,答案A是正确的。数据在计算机中是以二进制形式存放的,当计算机与二进制文件进行数据交换时,不需要进行转换,所以访问速度比文本文件要快。在文本文件中,数据是以ASCII码形式存放的,不同数据占用的空间是不同的,不利于随机读写方式的文件位置指针移动,所以随机读写方式不适用于文本文件,答案C是正确的。二进制文件中,一个数据占用的字节数是固定的,所以既可以使用随机读写方式也可以使用顺序读写方式,所以答案D的说法不正确。答案:D,C语言程序设计与数据结构,【例10.11】若要打开A盘上user子目录下名为abc.txt的文本文件进行读、写操作,下面符合此要求的函数调用是()。fopen(“A:userabc.txt”,“r”)(B)fopen(“A:userabc.txt”,“r+”)(C)fopen(“A:userabc.txt”,“rb”)(D)fopen(“A:userabc.txt”,“w”)分析:本题考查的是fopen()函数的应用。在写第一实参的路径名时,应使用“”表示“”。若需要对打开的文本文件进行读写,应使用读写模式“r+”。答案:B,C语言程序设计与数据结构,【例10.12】下面程序把从终端读入的文本(用作为文本结束标志)复制到一个名为bi.dat的新文件中,请填空。#include FILE*fp;main()char ch;if(fp=fopen(_(1)_)=NULL)exit(0);while(ch=getchar()!=)fputc(ch,fp);_(2)_分析:本题考查的是文件的打开和关闭。由于题目要求将文本复制到bi.dat文件中,所以需要以写方式打开bi.bat文件,所以,第一个空中填写fopen()函数的参数应是bi.bat,W。文件打开成功后,while循环中不断地读入字符,并写入bi.bat文件中,数据输入结束后,应及时关闭文件。所以第二个空中填写fclose(fp);答案:(1)“bi.bat”,“W”(2)fclose(fp);,C语言程序设计与数据结构,谢谢!,

    注意事项

    本文(C语言程序设计与数据结构课件第10章.ppt)为本站会员(sccc)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开