




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章文件10.1文件概述10.2文件处理10.3文件的顺序读写10.4文件的随机读写10.5文件检测函数本章小结
10.1文件概述
在以往的程序中,往往是从键盘输入数据,并将输出显示在计算机屏幕上。程序运行完毕后,所有数据都会消失。这样显然不满足一些实际需求。比如,在学生学籍管理系统中,需要将学生的相关信息以文件形式保存下来。本章介绍的C语言中文件的相关知识正是为了解决此类问题。所谓“文件”,是指存放在外部介质中的一组相关数据的有序集合。这个数据集合有一个名字,称为文件名。操作系统是以文件为单位对数据进行管理的。也就是说,如果想找存放在外部介质中的数据,就必须先按文件名找到所指定的文件,然后再从该文件中读取数据。若要在外部介质中存储数据,也必须先建立一个文件(以文件名为标识),然后才能向它输出数据。实际上,前面各章中已经多次使用了文件,例如源程序文件、目标文件、可执行文件、库文件(头文件)等。在C语言中,文件是一串连续的字节,每个字节均能被单独读取。C语言程序对文件的处理是通过标准函数库中的文件操作函数实现的,使用这些函数,可以简单、高效、安全地访问外部数据。此外,C语言中所有的外部设备均被作为文件对待,这种文件称为设备文件。对外部设备的输入/输出处理就是读/写设备文件的过程。设备文件是指与主机相连的各种外部设备,如显示器、打印机、键盘等。在操作系统中,将外部设备作为一个文件来进行管理,它们的输入、输出等同于对磁盘文件的读和写。通常把显示器定义为标准输出文件。一般情况下,在屏幕上显示有关信息就是向标准输出文件输出数据,如前面经常使用的printf、putchar函数就属于这类输出。键盘通常被指定为标准输入文件。从键盘上输入就意味着从标准输入文件上输入数据,如scanf、getchar函数就属于这类输入。10.1.1文本文件与二进制文件
从文件编码的方式来看,文件可分为ASCII文件和二进制文件两种。
ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。
例如,数5678的存储形式为
ASCII码:00110101001101100011011100111000
↓↓↓↓
十进制码:5 678
共占用4个字节。
ASCII文件可在屏幕上按字符显示。例如,源程序文件就是ASCII文件,用DOS命令TYPE可显示文件的内容。由于ASCII文件是按字符显示的,因此能读懂文件内容。
二进制文件是按二进制的编码方式来存放文件的。例如,数5678的存储形式为
0001011000101110
只占两个字节。二进制文件虽然也可在屏幕上显示,但其内容无法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。10.1.2文件缓冲区
文件缓冲区可以分为输出文件缓冲区和输入文件缓冲区。
在程序运行过程中,程序要将保存在内存中的数据写入磁盘,首先要建立一个“输出文件缓冲区”,这个缓冲区是连接计算机内存数据与外存文件的桥梁。当向文件输出数据时,准备输出的数据先送入文件缓冲区,等文件缓冲区数据装满后再一起送到文件中。这一过程称为“写文件”,是数据输出过程。与“写文件”过程相对的是要将保存在文件中的数据读入内存。首先要建立一个“输入文件缓冲区”,当从文件中输入数据时,也是把准备输入的数据先送入文件缓冲区,等文件缓冲区数据装满之后再整个送到程序数据区。这一过程称为“读文件”,是数据输入过程。
图10-1所示为使用缓冲区的文件读、写示意图,这种数据的读写方式提高了程序的执行效率。图10-1使用缓冲区的文件读、写示意图10.1.3文件的指针
在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针可对它所指的文件进行各种操作。为了能正常使用文件,C语言系统要对打开的每一个文件从多方面进行跟踪管理,如文件缓冲区的大小、文件缓冲区的位置、文件缓冲区使用的程度、文件操作模式、文件内部读写位置等,这些信息被记录在“文件信息区”的结构体变量中,该变量的数据类型由C语言系统事先定义,固定包含在头文件“stdio.h”中,数据类型名为“FILE”。以下是TurboC2.0文件指针类型的定义:
typedefstruct
{
int level; /*缓冲区被占用的程度*/
unsigned flags; /*文件状态标记*/
char fd; /*文件描述符*/
unsignedchar hold; /*如无缓冲区,则不读取字符*/
short bsize; /*缓冲区大小*/
unsignedchar *buffer; /*文件缓冲区指针*/
unsignedchar *curp; /*文件定位指针*/
unsigned istemp; /*临时文件标识*/
short token; /*用于合法性检测*/
}FILE;这里,FILE就是所定义的文件指针类型的类型名。在定义中使用了“typedef”关键字,它的作用是把用struct定义的结构体类型命名为“FILE”。
在C语言中,要对已打开的文件进行操作,就要通过指向该文件结构体的指针,因此需要在程序中定义FILE类型的指针变量,并使其指向要操作的文件。
定义文件指针的一般形式为
FILE*指针变量标识符;
例如:
FILE*fp;
表示fp是指向FILE类型结构体的指针变量,通过fp即可找到存放某个文件信息的结构体变量,然后按结构体变量提供的信息找到该文件,实施对文件的操作。习惯上,把fp称为指向一个文件的指针。 10.2文件处理
10.2.1文件的打开
打开一个文件应使用fopen函数,其调用形式为
FILE*fp;
fp=fopen(文件名,使用文件方式);
例如:
FILE*fp;
fp=fopen(“a”,“r”);
其意义是在当前目录下打开文件a,只允许进行“读入”(r代表read,即读入)操作,fopen函数带回指向a文件的指针并赋给fp。
又如:
FILE*fphzk;
fphzk=fopen("c:\\hzk16","rb");其意义是打开C驱动器磁盘的根目录下的文件hzk16,这是一个二进制文件,只允许按二进制方式进行读操作。两个反斜线“\\”中的第一个表示转义字符,第二个表示根目录。
由以上两个例子可以看出,在打开一个文件时,通知编译系统以下3个信息:
①需要打开的文件名;
②文件使用方式;
③让哪一个指针变量指向被打开的文件。
文件使用方式共有12种,如表10-1所示。对于文件使用方式有以下几点说明:
(1)文件使用方式由r、w、a、t、b、+六个字符拼成,各字符的含义是:
r(read):读;
w(write):写;
a(append):追加;
t(text):文本文件,可省略不写;
b(banary):二进制文件;
+:读和写。
(2)用 "r" 方式打开一个文件时,该文件必须已经存在,且只能从该文件读出数据。
(3)用 “w” 方式打开一个文件时,若打开的文件不存在,则以指定的文件名建立该文件;若打开的文件已经存在,则将该文件刷新。以该方式打开的文件只能写,不能读。
(4)若要向一个已存在的文件追加新的信息,只能用 “a” 方式打开文件,但此时该文件必须是存在的,否则将会出错。
(5)在打开一个文件时,如果出错,fopen函数将返回一个空指针值NULL。在程序中可以用这一信息来判别是否完成打开文件的工作,并作相应的处理。因此常用以下程序段打开文件:
if((fp=fopen(“c:\\hzk16”,“rb”))==NULL)
{
printf(“\nerroronopenc:\\hzk16file!”);
getch();
exit(1);
}这段程序的含义是,如果返回的指针为空,表示不能打开C盘根目录下的hzk16文件,则给出提示信息“erroronopenc:\\hzk16file!”。getch()的功能是从键盘输入一个字符,但不在屏幕上显示。在这里,该行的作用是等待,只有当用户从键盘敲任一键时,程序才继续执行,因此用户可利用这个等待时间阅读出错提示。敲键后执行exit(1)退出程序。
(6)把一个文本文件读入内存时,要将ASCII码转换成二进制码,而把文件以文本方式写入磁盘时,也要把二进制码转换成ASCII码,因此文本文件的读写要花费较多的转换时间。二进制文件的读写不存在这种转换。
(7)标准输入文件(键盘)、标准输出文件(显示器)、标准出错输出(出错信息)是由系统打开的,可直接使用。10.2.2文件的关闭
文件一旦使用完毕,应用关闭文件函数把文件关闭,以避免文件的数据丢失。
用fclose函数关闭文件,其调用形式为
fclose(文件指针);
例如:
fclose(fp);
前面曾把用fopen函数打开文件时所带回的指针赋给了fp,现通过fp把该文件关闭,此后fp不再指向该文件。正常完成关闭文件操作后,fclose函数返回值为0。如返回非零值,则表示有错误发生。 10.3文件的顺序读写
10.3.1字符读写函数fgetc和fputc
1.读字符函数fgetc
fgetc函数的调用形式为
字符变量=fgetc(文件指针);
例如:
ch=fgetc(fp);其中:fp为文件指针变量;ch为字符变量。该语句表示从打开的文件fp中读取一个字符并送入ch中。在使用fgetc函数时,应注意以下几点:
(1)在fgetc函数调用中,读取的文件必须是以读或读写方式打开的。
(2)读取字符的结果可以不向字符变量赋值,例如:
fgetc(fp);
但是读出的字符不能保存。
(3)在文件内部有一个位置指针,用来指向文件的当前读写字节。在文件打开时,该指针总是指向文件的第一个字节。使用fgetc函数后,该位置指针将向后移动一个字节。因此可连续多次使用fgetc函数读取多个字符。注意文件指针和文件内部的位置指针是不一样的。文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。文件内部的位置指针用以指示文件内部的当前读写位置,每读写一次,该指针均向后移动,它不需在程序中定义说明,而是由系统自动设置的。
2.写字符函数fputc
fputc函数的功能是把一个字符写入指定的文件中,其调用形式为
fputc(字符量,文件指针);
其中,待写入的字符量可以是字符常量或变量。例如:
fputc('a',fp);
其意义是把字符a写入fp所指向的文件中。对于fputc函数的使用也要说明几点:
(1)被写入的文件可以用写、读写、追加方式打开。用写或读写方式打开一个已存在的文件时,将清除原有的文件内容,写入字符从文件首开始。如需保留原有文件的内容,且希望写入的字符从文件末开始存放,则必须以追加方式打开文件。被写入的文件若不存在,则创建该文件。
(2)每写入一个字符,文件内部的位置指针向后移动一个字节。
(3)fputc函数有一个返回值,如写入成功则返回写入的字符,否则返回一个EOF。可用此来判断写入是否成功。
【例10.1】把从键盘输入的一个字符串写入磁盘文件example.txt中。
程序如下:
#include“stdio.h”
main()
{
charch;
FILE*fp;
fp=fopen(“example.txt”,“w”);
printf(“Enterastring:”);
while((ch=getchar())!=‘\n’)
fputc(ch,fp);
fclose(fp);
}本程序使用 "w" 方式打开example.txt文件,实际上就是创建example.txt文件。该文件的内容是键盘输入的内容。example.txt是一个文本文件,可以使用任何文本编辑程序阅读该文件。比如可以使用记事本程序打开example.txt文件查看它的内容。
【例10.2】把一个文本文件的内容复制到另一个文本文件中。
程序如下:
#include“stdio.h”
main()
{
charch,source[10],target[10];
FILE*fp_s,*fp_t;
printf(“Enterthesourcefilename:”);
scanf(“%s”,source);
printf(“Enterthetargetfilename:”);
scanf("%s",target);
if((fp_s=fopen(source,“r”))==NULL)
{
printf(“cannotopensourcefile.\n”);
exit(1);
}
if((fp_t=fopen(target,“w”))==NULL)
{
printf(“cannotopentargetfile.\n”);
exit(1);
}
while(!feof(fp_s))
fputc(fgetc(fp_s),fp_t);
fclose(fp_s);
fclose(fp_t);
}程序运行结果:
Enterthesourcefilename:example.txt
Enterthetargetfilename:try.txt
其中:example.txt是要复制的源文件名,是已经存在的一个文本文件;try.txt是要形成的目标文件名。程序运行结束后,example.txt文件复制到try.txt文件中。10.3.2字符串读写函数fgets和fputs
1.字符串读函数fgets
fgets函数的功能是从指定的文件中读一个字符串到字符数组中,其调用形式为
fgets(字符数组名,n,文件指针);
其中的n是一个正整数,表示从文件中读出的字符串不超过n - 1个字符。注意,应在读入的最后一个字符后加上串结束标志 '\0'。
例如:
fgets(str,n,fp);
其意义是从fp所指的文件中读出n-1个字符送入字符数组str中。
2.字符串写函数fputs
fputs函数的功能是向指定的文件写入一个字符串,其调用形式为
fputs(字符串,文件指针);
其中字符串可以是字符串常量,也可以是字符数组。
例如:
fputs("abcd",fp);
其意义是把字符串 "abcd" 写入fp所指的文件之中。
【例10.3】将字符串 “VisualC++” 和 “Visualbasic” 依次存入文件text中,然后将第一个字符串读出并在屏幕上显示出来。
程序如下:
#include“stdio.h”
main()
{
FILE*fp;
charstring[20];
fp=fopen(“text”,“w+”);
fputs(“VisualC++\n”,fp);
fputs(“Visualbasic\n”,fp);
rewind(fp);
fgets(string,20,fp);
puts(string);
fclose(fp);
}
程序运行结果:
VisualC++10.3.3数据块读写函数fread和fwrite
读数据块函数fread调用的一般形式为
fread(buffer,size,count,fp);
写数据块函数fwrite调用的一般形式为
fwrite(buffer,size,count,fp);
其中:buffer是一个指针,在fread函数中表示存放输入数据的首地址,在fwrite函数中表示存放输出数据的首地址;size表示数据块的字节数;count表示要读写的数据块块数;fp表示文件指针。
例如:
fread(fa,4,5,fp);
其意义是从fp所指的文件中,每次读4个字节(一个实数)送入实数组fa中,连续读5次,即读5个实数到fa中。
【例10.4】将几个变量中所存放的数字写入一个文件中,然后再从文件中读出并在屏幕上显示出来。
程序如下:
#include<stdio.h>
#include<stdlib.h>
voidmain()
{
FILE*fp;
charc=‘a’,c1;
inti=123,i1;
longl=2004184001L,l1;
doubled=4.5678,d1;
/*检查能否以读写方式打开或建立文本文件text1.txt*/
if((fp=fopen("test1.txt","wt+"))==NULL)
{
printf(“不能打开文件.\n”);
exit(1);
}
/*通过函数fwrite将几个变量所存放的数据写入文件*/
fwrite(&c,sizeof(char),1,fp);
fwrite(&i,sizeof(int),1,fp);
fwrite(&l,sizeof(long),1,fp);
fwrite(&d,sizeof(double),1,fp);
/*重新定位指针到文件首部*/
rewind(fp);
/*通过函数fread将数据读出文件*/
fread(&c1,sizeof(char),1,fp);
fread(&i1,sizeof(int),1,fp);
fread(&l1,sizeof(long),1,fp);
fread(&d1,sizeof(double),1,fp);
/*输出*/
printf"c1=%c\n",c1);
printf("i1=%d\n",i1);
printf("l1=%ld\n",l1);
printf("d1=%f\n",d1);
fclose(fp);
}
程序运行结果:
c1=a
i1=123
l1=2004184001
d1=4.567800
【例10.5】
将数组中所存放的字符写入一个文本文件中,然后再从文件中读出并在屏幕上显示出来。
程序如下:
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
intmain(void)
{
FILE*fp;
charmsg[]=“thisisatest”;
charbuf[20];
/*检查能否以读写方式打开或建立文本文件text2.txt*/
if((fp=fopen("test2.txt","wt+"))==NULL)
{
printf(“不能打开文件.\n”);
exit(1);
}
/*通过函数fwrite将几个变量所存放的数据写入文件*/
fwrite(msg,strlen(msg)+1,1,fp);
/*重新定位指针到文件首部*/
rewind(fp);
/*通过函数fread将数据读出文件*/
fread(buf,strlen(msg)+1,1,fp);
printf("%s\n",buf);
fclose(fp);
return0;
}程序运行结果:
thisisatest
本例程序定义了一个字符数组msg,程序以读写方式打开文本文件test2.txt,将字符数组中所存放的字符写入该文件中,然后把文件内部的位置指针移到文件首,读出文件中的数据到字符数组buf中,并输出到屏幕上显示。
【例10.6】从键盘录入两个学生的数据,把这些数据保存到一个文件中,然后再从文件中读出并在屏幕上显示出来。
程序如下:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
structstu
{
charname[10];
intnum;
intage;
charaddr[15];
};
voidmain()
{
FILE*fp;
structstuboya[2],boyb[2],*pp,*qq;
charch;
inti;
/*pp指向boya,qq指向boyb*/
pp=boya;
qq=boyb;
/*以读写方式打开二进制文件“stu_list.dat”*/
if((fp=fopen(“stu_list.dat”,“wb+”))==NULL)
{
printf("不能打开文件,按任意键退出!\n");
getch();
exit(1);
}
/*输入两个学生的数据*/
printf("\ninputdata\n");
for(i=0;i<2;i++,pp++)
scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr);
/*写数据到文件*/
pp=boya;
fwrite(pp,sizeof(structstu),2,fp);
/*关闭文件,保证缓冲区的信息写入到文件中*/
fclose(fp);
/*再次以只读形式打开文件*/
if((fp=fopen(“stu_list.dat”,“rb”))==NULL)
{
printf(“不能打开文件,按任意键退出!\n”);
getch();
exit(1);
}
/*把文件内部的位置指针移到文件首,读出两个学生的数据后,在屏幕上显示*/
rewind(fp);
fread(qq,sizeof(structstu),2,fp);
printf(“\n\nname\tnumberageaddr\n”);
for(i=0;i<2;i++,qq++)
{
printf(“%s\t%5d\t”,qq->name,qq->num);
printf(“%7d\t%s\n”,qq->age,qq->addr);
}fclose(fp);
}本例程序定义了一个结构体stu,说明了两个结构体数组boya和boyb以及两个结构体指针变量pp和qq。pp指向boya,qq指向boyb。程序以读写方式打开二进制文件“stu_list.dat”,输入两个学生的数据后,将其写入该文件中,然后把文件内部的位置指针移到文件首,读出两个学生的数据,并在屏幕上显示出来。10.3.4格式化读写函数fscanf和fprintf
fscanf函数和fprintf函数与前面使用的scanf函数和printf函数的功能相似,都是格式化读写函数。两者的区别在于fscanf函数和fprintf函数的读写对象不是键盘和显示器,而是磁盘文件。这两个函数的调用格式分别为
fscanf(文件指针,格式字符串,输入表列);
fprintf(文件指针,格式字符串,输出表列);
例如:
fscanf(fp,"%d%s",&i,s);
fprintf(fp,"%d%c",j,ch);
【例10.7】
将文件data1.txt中的4行5列的二维数组数据写入内存,将数组元素逐个增1后写入文件data2.txt中。
程序如下:
#include<stdio.h>
main()
{
FILE*fp1,*fp2;
inti,j,a[4][5];
if((fp1=fopen(“F:\\data1.txt”,“r”))==NULL)
{
printf(“Can’topenfile1\n”);
return;
}
if((fp2=fopen(“F:\\data2.txt”,“w”))==NULL)
{
printf(“Can’topenfile2\n”);
return;
}
for(i=0;i<4;i++)
{
for(j=0;j<5;j++)
{
fscanf(fp1,“%d\t”,&a[i][j]);
a[i][j]+=1;
fprintf(fp2,“%d”,a[i][j]);
}
fprintf(fp2,“\n”);
}
fclose(fp1);
fclose(fp2);
}
【例10.8】
从一给定的文本文件test3.txt中读出数据,并将其存放到相应的变量中,且在屏幕上显示出来。设文本文件test3.txt中存放的内容为
HELLO!1234
若要将上述信息读出到变量中,则需在程序中定义一个字符数组和一个整型变量,然后用fscanf函数将文本文件test3.txt中的内容以 %s和 %d的格式读出,并分别存放到字符数组和整型变量中,最后将字符数组和变量中的内容在屏幕上显示出来。程序如下:
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
voidmain(void)
{
inti;
charstr[20];
FILE*fp;
/*检查能否以只读形式打开文件test3.txt,如果失败,则提前退出,结束程序*/
if((fp=fopen("test3.txt","rt"))==NULL)
{
printf(“不能打开文件,按任意键退出!\n”);
getch();
exit(1);
}
/*读数据到字符数组str和变量i中*/
fscanf(fp,“%s%d”,str,&i);
/*输出到屏幕*/
printf(“%s,%d”,str,i);
fclose(fp);
}
程序运行结果:
HELLO!,1234
【例10.9】从键盘录入两个学生的数据,把这些数据保存到一个文本文件中,再从该文本文件中读出并在屏幕上显示出来(用函数fscanf和fprintf实现)。
程序如下:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
structstu
{
charname[10];
intnum;
intage;
charaddr[15];
};
voidmain()
{
FILE*fp;
charch;
inti;
structstuboya[2],boyb[2],*pp,*qq;
/* pp指向boya,qq指向boyb */
pp=boya;
qq=boyb;
/*以读写方式打开二进制文件"stu_list.txt" */
if((fp=fopen("stu_list1.txt","w+"))==NULL)
{
printf("不能打开文件,按任意键退出!\n");
getch();
exit(1);
}
/*输入两个学生的数据*/
printf("\ninputdata\n");
for(i=0;i<2;i++,pp++)
scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr);
/*将两个学生的数据输出到文件指针所指向的文件*/
pp=boya;
for(i=0;i<2;i++,pp++)
{
fprintf(fp,“%s%d%d%s\n”,pp->name,pp->num,pp->age,pp->addr);
/*关闭文件,保证缓冲区的信息写入到文件中*/
fclose(fp);
/*再次以只读形式打开文件*/
if((fp=fopen(“stu_list1.txt”,“r”))==NULL)
{
printf(“不能打开文件,按任意键退出!”);
getch();
exit(1);
}
/*把文件内部的位置指针移到文件首,读出两个学生的数据后,在屏幕上显示*/
rewind(fp);
for(i=0;i<2;i++,qq++)
{
fscanf(fp,“%s%d%d%s\n”,qq->name,&qq->num,&qq->age,qq->addr);
}
printf(“\n\nname\tnumberageaddr\n”);
qq=boyb;
for(i=0;i<2;i++,qq++)
{
printf("%s\t%5d%7d%s\n",qq->name,qq->num,qq->age,qq->addr);
}fclose(fp);
}本程序中函数fscanf和fprintf每次只能读写一个结构体数组元素,因此,采用了循环语句来读写全部数组元素。还应注意,循环改变了指针变量pp和qq的值,因此,在程序中分别对它们重新赋予了数组的首地址。
关于fprintf函数,在使用时还应注意它向文件输出的是ASCII码。特别在输出数值时,要输出的是该数值的ASCII码,而不是数值本身。
10.4文件的随机读写
10.4.1文件定位
移动文件内部的位置指针的函数主要有两个,即rewind函数和fseek函数。
rewind函数的调用形式为
rewind(文件指针);
它的功能是把文件内部的位置指针移到文件首。
fseek函数用于改变文件的位置指针,其调用形式为
fseek(文件指针,位移量,起始点);其中:“文件指针”指向被移动的文件;“起始点”表示从何处开始计算位移量,规定的起始点有三种,即文件首、当前位置和文件末尾,ANSIC标准指定的起始点的表示符号如表10-2所示;“位移量”表示以“起始点”为基点移动的字节数,ANSIC和大多数C版本要求位移量是long型数据,以便在文件长度大于64 KB时不会出错。当用常量表示位移量时,要求加后缀“L”。例如:
fseek(fp,100L,0);
其意义是把位置指针移到离文件首100个字节处。
fseek函数一般用于二进制文件。在文本文件中由于要进行转换,故往往计算的位置会出现错误。10.4.2随机读写函数rewind和fseek
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年健身中心租赁合同及健身俱乐部会员制运营协议
- 二零二五年度村委会与某健身俱乐部签订场地租赁合同
- 2025年度船舶保险代理股份合作协议
- 二零二五年度金融投资分析与风险管理商务咨询服务协议
- 四川鑫耀产城融合产业投资发展集团有限公司2024年12月对外公开招聘管理人员及专业工作人员笔试参考题库附带答案详解
- 2025鄂尔多斯高新技术产业开发区市融媒体中心招聘控制数人员35人笔试参考题库附带答案详解
- 2025福建龙岩市人力资源服务有限公司招聘6人笔试参考题库附带答案详解
- 酒类酿制知识培训课件
- 交通中国知到智慧树章节测试课后答案2024年秋上海工程技术大学
- 2025年云南中烟工业有限责任公司招聘(430人)笔试参考题库附带答案详解
- 本特利探头应用
- 城市雕塑艺术工程工程量计价清单定额2022年版
- QMR-110-00员工手部、接触面等微生物检验记录记录
- 2022年河北医科大学第一医院医护人员招聘考试笔试题库及答案解析
- 思想道德与法治教案第四章:明确价值要求践行价值准则
- 宁骚版《公共政策学》课后答案
- 外阴及阴道炎症
- (综合治理)修复工程指南(试行) - 贵州省重金属污染防治与土壤修复网
- 公安笔录模板之询问嫌疑人(书面传唤治安案件)
- A-level项目介绍(课堂PPT)
- 故障诊断技术的国内外发展现状(共3页)
评论
0/150
提交评论