当前位置:文档之家› 辽宁石油化工大学《C语言程序设计》第九章 文件

辽宁石油化工大学《C语言程序设计》第九章 文件

辽宁石油化工大学《C语言程序设计》第九章 文件
辽宁石油化工大学《C语言程序设计》第九章 文件

第9章

文件

File

本章概要

Summary of the chapter

第9章主要介绍文件的概念及文件的操作。通过本章的学习,学生可以了解文件的概念、分类及基

本操作。要求学生熟练掌握文件的读写方法以及文件中几个常用函数。

前面各章中我们使用的输入输出函数都是对应于标准输入输出设备而言的。实际上,在程序运行时,常常需要将数据输出到磁盘上作长久的保存,以后需要时再从磁盘中读取数据。这就要用到磁盘文件。一般,磁盘文件可分为数据文件和程序文件两种,这里所介绍的文件操作主要是针对磁盘数据文件的使用和操作。

9.1 文件概述(The Summary of file)

9.1.1 文件的概念与文件结构(Conception and onstruction of file)

1.文件的概念(Conception)

文件是程序设计中一个重要的概念。所谓文件,是指存储在外部介质上数据的集合。数据是以文件的形式存放在外部介质上(如磁盘);计算机操作系统是以文件为单位对数据进行管理。

2.文件的结构(Construction of file)

C语言中文件是流式文件。它把数据看作是一连串的字符,不考虑回车换行符的控制,对文件的存取是以字符为单位的。

根据数据组织形式的不同,C语言的文件分为ASCII码文件(又称文本文件)和二进制文件两种。

ASCII码文件中的每个字节存放的是一个字符的ASCII代码。这样的文件便于对字符进行输入和输出的处理,但占用存储空间较大。例如,有一个整数65535,在内存中占2

第9章文件· 183 ·

个字节(11111111 11111111);如果按ASCII码形式输出则需要5个字节(00110110 00110101 00110101 00110011 00110101)。

二进制文件是把内存中的数据按照其在内存中的存储形式原样输出到磁盘上存放。这种形式的文件节省外存空间,但不能直接输出字符形式。例如,前面提到的整数65535,如果按二进制形式输出只占2个字节(11111111 11111111)。

9.1.2 文件系统的缓冲性(Buffer characteristic of file system)

在ANSI C标准出现之前,C语言对文件的处理方法有两种:一种为缓冲文件系统;另一种为非缓冲文件系统。缓冲文件系统用来处理ASCII码文件,非缓冲文件系统用来处理二进制文件。1983年美国国家标准化协会制定的ANSI C标准规定不再采用非缓冲文件系统,只采用缓冲文件系统。并将其扩充为可以处理二进制文件。

1.缓冲文件系统(Buffer file system)

缓冲文件系统是指系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区。

当需要将数据从内存输出到磁盘时,必须先将其送到内存缓冲区中,缓冲区装满后再向磁盘输出。如果需要将数据从磁盘读入内存,则先将磁盘文件中的一批数据送到缓冲区,然后再从缓冲区将数据输入程序数据区。

使用缓冲文件系统减少了读写磁盘的次数,提高工作效率。

2.非缓冲文件系统(non-buffer file system)

非缓冲文件系统是指系统不自动开辟确定大小的缓冲区,而是由程序根据需要为每个文件设定缓冲区。

9.2 文件的输入/输出(Input/Output of file)

在C语言中,使用文件要遵循一定的规则:先打开文件,然后处理文件,处理结束后将其关闭。这些打开、处理以及关闭文件的操作是通过标准输入输出函数实现的。

9.2.1 文件类型指针(File type pointer)

前面已经提到,在读写文件前,需要使用“打开文件函数”将文件打开。打开文件函数的工作就是接受文件的外部名,返回文件的内部名。此处的内部名是指向含有文件信息结构的指针,称为文件类型指针。

在C语言中,每个被使用的文件都在内存中开辟一个区域,用来存储文件名、文件状态以及文件当前位置等有关信息。这些信息被保存在一个名字为FILE的结构体类型的变

量中。此结构体变量是由系统在stdio.h中定义的。FILE定义形式如下:

typedef struct

{

· 184 ·第9章文件

int _fd; /*文件号*/

int _cleft; /*缓冲区中剩余字符*/

int _mode; /*文件操作模式*/

char *_nextc; /*下一个字符位置*/

char *_buff; /*文件缓冲区位置*/

}FILE;

有了FILE类型之后,就可以利用它定义FILE类型的变量,以便存放文件信息。我们可以用下面的方式说明一个文件类型指针变量:

FILE *fp;

fp是一个指向FILE类型结构体的指针变量。我们可以进一步使fp成为一个指向某一文件的结构体变量,并通过该变量中的信息访问该文件。

我们可以使用FILE类型同时定义多个文件类型指针变量,使它们指向多个文件,实现对多个文件的访问。例如:

FILE *fp1,*fp2;

定义了2个FILE类型的指针变量fp1、fp2。

9.2.2 文件的打开与关闭(Open and colse of file)

1.文件的打开(open of file)

打开文件使用的是标准输入输出函数库中的fopen( )函数,其格式为

FILE *fp;

fp=fopen(文件名,文件操作方式);

其中,fp是FILE类型指针,指向被打开的文件;文件名是指文件的外部名,可含驱动器及路径。例如:“D:\aa\aa.txt”;文件操作方式指出文件的存取方式,文件操作方式见表9.1。整个命令的功能是:以指定的方式打开文件,若函数调用成功则返回一个指向该文件的FILE类型的指针,否则返回NULL。

在例9.1中的指令:

fp1=fopen("in.dat","r"); /*打开文件in.dat准备读*/

fp2=fopen("out.dat","w"); /*打开文件out.dat准备写*/

if (fp1= =NULL || fp2= =NULL)/*如果文件不能打开退出程序*/

exit(0);

分别表示:文件in.dat以“读”方式被打开;文件out.dat以“写”方式被打开;返回的FILE类型指针被赋给fp1和fp2,如果文件打开失败则退出程序。

表9.1 文件操作方式

文件操作方式含义

"r"(只读)为输入打开一个文本文件

"w"(只写)为输出或建立打开一个文本文件

"a"(追加)向文本文件末尾追加数据

"rb"(只读)为输入打开一个二进制文件

第9章文件· 185 ·"wb"(只写)为输出打开或建立一个二进制文件

"ab"(追加)向二进制文件末尾追加数据

"r+"(读写)为读/写打开一个文本文件

"w+"(读写)为读/写建立一个新文本文件

"a+"(读写)为读/写打开或建立一个文本文件

"rb+"(读写)为读/写打开一个二进制文件

"wb+"(读写)为读/写建立一个二进制文件

"ab+"(读写)为读/写打开或建立一个二进制文件

说明(Explanation):

1.若只需要从一个已经存在的文件中读取数据,可用“r”方式打开文件;若还需要

修改文件中部分数据,可用“r+”方式打开文件。

2. 若只需要建立一个新文件并写入数据,可用“w”方式打开文件;若写入后还需

要读出部分数据,可用“w+”方式打开文件。但应提请读者注意的是,若文件已存在,用“w”或“w+”方式打开后,原来的数据将丢失。

3.若不想原来数据丢失,也不想修改,只想添加数据,应该以“a”或“a+”方式打

开文件。所添加数据将加在文件的最后。

4.“b”表示文件类型为二进制类型文件。

5.在用文本文件向计算机输入时,将回车换行符转换为一个换行符,在输出时把换

行符转换成回车和换行两个符号;在二进制文件中没有这种转换过程。

6.为确保文件操作正常,一般在打开文件时需测试一下返回值是否为NULL。所以,常用如下方法打开一个文件:

if (fp=fopen("ss.txt","r")= =NULL)

{

printf("无法打开文件!\n")

exit(0);

}

2.文件的关闭(Close of file)

文件被处理完后,应及时关闭,以防止别处误用。所谓的关闭文件就是使指针变量不再指向原文件,指针变量与文件脱离。不能再通过该指针对文件进行读写操作。关闭文件使用的是标准输入输出函数fclose( ),其格式为:

fcolse(文件指针变量);

例如在例9.1中的指令:

fcolse(fp1); /*关闭文件in.dat*/

fcolse(fp2); /*关闭文件out.dat*/

fclose( )函数有一个返回值,当成功关闭文件时,其返回值为0;当然,若返回值为一个非0数据,则表示关闭时有错误。此时可以用ferror函数来测试,具体方法将在后面章节中详细阐述。

· 186 ·第9章文件

9.2.3 文件的读写(Read and write of file)

文件被成功打开后,就可以对它进行读写操作了。读写文件的函数一般可分为四大类:格式化读写函数、单个字符读写函数、字符串读写函数和数据块读写函数。

1.格式化读写函数(Formatting read-write function)

C语言的文件格式化读写函数为fprintf( )和fscanf( )。这两个函数与printf( )和scanf( )函数相似,都是格式化读写函数。唯一不同之处是:fprintf( )和fscanf( )函数的读写对象是磁盘文件;printf( )和scanf( )函数的读写对象是终端。

(1)fprintf( )函数

fprintf( )函数的功能是将“输出表列”中所指出的变量中数据经过转换后写到文件中去,如果写入成功则返回所打印的字符串,否则返回一个负数。该函数的一般格式是:fprintf(文件类型指针, "格式控制字符串",输出表列);

例如:

fprintf(fp,"%d,%6.2f",i,t);

它的作用是将整形变量i和实型变量t的值按%d和%6.2f的格式输出到fp指向的文件上。如果i=3,t=4.5则输出到磁盘文件上的是以下的字符串:

3,4.50

(2)fscanf( )函数

fscanf( )函数的功能是从文件中将数据按格式读到有关地址内存存储区。如果读出成功则返回被赋值的变量数目,若读到文件结束符则返回EOF。该函数的一般格式是:fscanf(文件类型指针, "格式控制字符串",地址表列);

例如:fscanf(fp,"%d,%f",&i,&t);

磁盘文件上如果有以下字符:

3,4.500000

则将磁盘文件中的数据3送给变量i,4.5送给变量t。

说明(Explanation):

(1)fprintf( )和fscanf( )函数与printf( )和scanf( )函数的格式控制部分相同。

(2)格式化输入输出适用于文本文件,不适用于二进制文件。

例9.1已知有数据文件IN.DA T,其内容为两个数字。编写程序,打开该文件将两个数字读出来求和,并将和写入一个新文件OUT.DA T。

#include /*标准输入输出头文件*/

main( )

{

int a,b,s; /* 声明a,b,s三个整型变量 */

FILE *fp1,*fp2; /*定义文件指针*/

fp1=fopen("in.dat","r"); /*打开文件in.dat准备读*/

fp2=fopen("out.dat","w"); /*打开文件out.dat准备写*/

第9章文件· 187 ·

if (fp1= =NULL||fp2= =NULL)/*如果文件不能打开退出程序*/

exit(0);

fscanf(fp1, "%d%d",&a,&b); /*从in.dat中读数值存入变量a,b*/

s=a+b; /* 计算a+b的和,并赋给变量s */

fprintf(fp2, "%d",s); /*将s值写入out.dat*/

fclose(fp1); /*关闭文件in.dat*/

fclose(fp2); /*关闭文件out.dat*/

}

2.单个字符读写函数(Read-write function of single character)

字符读写函数有fgetc( )和fputc( )两个。它们用来对文件作字符的输入输出。这两个函数与getc( )和putc( )函数相似,唯一不同之处是:前者是函数;后者是宏。宏的执行速度较快。

(1)fgetc( )函数

fgetc( )函数的功能是从指定的磁盘文件中读取一个字符,如果读取成功则返回一个字符;如果读到文件末尾或出错返回一个文件结束标志EOF。该函数的一般格式是:字符变量=fgetc(文件类型指针);

(2)fputc( )函数

fputc( )函数的功能是把一个字符写入指定磁盘文件。如果写入成功则返回所写字符,若写入失败则返回EOF。该函数的一般格式是:

fputc(字符变量或字符常量,文件类型指针);

EOF是stdio.h文件中定义的符号常量,值为-1。也是文件结束标志。

feof( )是文件尾测试函数,当文件指针指向文件末尾时其返回值为真;否则返回假。

例9.2编写程序,将磁盘文件source.txt的内容拷贝到一个新文件中。

#include /*标准输入输出头文件*/

main( )

{

int a; /* 声明a为整型变量 */

FILE *fp1,*fp2; /*定义文件指针*/

fp1=fopen("source.txt","r"); /*打开文件source.txt准备读*/

fp2=fopen("target.txt","w"); /*打开文件target.txt准备写*/

if (fp1= =NULL || fp2= =NULL)/*如果文件不能打开退出程序*/

{

printf("无法打开文件!\n");

exit(0);

}

while((a=fgetc(fp1))!=EOF);

fputc(a,fp2); /*写入target.txt*/

fclose(fp1); /*关闭文件in.dat*/

· 188 ·第9章文件

fclose(fp2); /*关闭文件out.dat*/

}

程序运行结果是:新建一个名字为target.txt的文件,并将文件source.txt的内容拷贝到target.txt文件中。

可以用下面命令验证:

C>type source.txt↙

I’m a teacher. /*source.txt文件中的内容*/

C>type target.txt↙

I’m a teacher. /*target.txt文件中的内容*/

3.字符串读写函数(input and output function of string)

字符串读写函数有fgets( )和fputs( )两个。它们用来对文件作读写处理。这两个函数与getc( )和putc( )函数相似,唯一不同之处是:前者的读写对象是磁盘文件;后者的读写对象是终端。

(1)fgets( )函数

fgets( )函数的功能是从指定的磁盘文件中读取一个字符串,并存放到指定的存储区域。该函数的一般格式是:

fgets(str,n,文件类型指针);

(2)fputs( )函数

fputs( )函数的功能是把一个字符串写到指定的磁盘文件。该函数的一般格式是:

fputs(str,文件类型指针);

其中str为字符数组或字符指针;fgets( )函数从指定文件中读取字符串,把读取到的字符串放到字符数组str中,并在字符串后自动加一个字符'\0'。当读了n-1个字符或遇到换行符时,读操作结束;fputs( )函数把以'\0'为终止符的字符串复制到指定文件中;fputs( )函数有返回值。若输出成功,返回值为0,否则为非零值。

例9.3编写程序,从键盘输入三行字符,并存入文件ss.txt中,再将ss.txt的内容读出来显示在屏幕上。

#include /*标准输入输出头文件*/

main( )

{

int i;

char str[81];

FILE *fp;

fp=fopen("ss.txt","w"); /*第七行*/

if (fp= =NULL)

{

puts("无法打开文件!\n")

exit(0);

}

puts("please input the string :\n");

第9章文件· 189 ·

for(i=0;i<3;i++)

{

gets(str);

fputs(str,fp);

fputs("\n",fp);

}

fclose(fp); /*第二十行*/

puts("content of the file is:\n");

if ((fp=fopen("ss.txt","r"))= =NULL) /*第二十二行*/

{

printf("无法打开文件!\n");

exit(0);

}

while(fgets(str,81,fp)!=NULL)

printf("%s",str);

fclose(fp); /*第二十九行*/

}

上面程序实际可以分成两部分来理解。从第七行到第二十行实现的是从终端键盘输入三行字符,并将其写入以“ss.txt”命名的磁盘文件中。此时,对文件完成的是写操作,因此,文件的打开方式为"w";从第二十二行开始以后的程序是将文件“ss.txt”中的字符读出来,然后在屏幕上输出。主要是验证以下文件中是否已存在从键盘输入的三行字符。另外,在此还需提醒读者注意一下所产生文件“ss.txt”的字节数。应该是键盘输入字符数加6;如果程序改为要求输入四行字符,则所产生文件的字节数应该是键盘输入字符数加8。原因请读者自己考虑。

运行结果:

please input the string :

qwqwqwqw↙

qwqwqwqw↙

qwqwqwqw↙

content of the file is: /*以下为source.txt文件中的内容*/

qwqwqwqw

qwqwqwqw

qwqwqwqw

若此时输入下面命令:

C>dir source.txt↙

屏幕会显示:

source.txt 30 04-30-04 16:20

也就是说,文件source.txt的大小为30个字节。

4.数据块读写函数(Read-write function of data block)

· 190 ·第9章文件

前几类函数读写对象是单个字符或字符串。在实际应用中,我们经常会遇到需要读写一个或多个数据块的情况。这里所说的数据块是各种类型的数据,如整型、实型、浮点型、双精度型和结构体型变量的值,以及成段输入输出各种数组。在C语言文件系统中设置了数据块读写函数:fread( )和fwrite( )。

(1)fread( )函数

fread( )函数的功能是从指定的磁盘文件中读取一组数据,并存放到指定的存储区域。该函数的一般格式是:

fread(buffer,size,count,fp);

(2)fwrite( )函数

fwrite( )函数的功能是把一组数据输出到指定的磁盘文件。该函数的一般格式是:

fwrite(buffer,size,count,fp);

其中,buffer为一个指针。对于fread( )函数,它是读入数据的存放地址;对于fwrite( )函数,为要输出数据的地址;size为要读(或写)数据块的字节数。count为要读(或写)数据块的个数;fp为文件类型指针。

这两个函数一般用于对二进制文件的读写操作。

例9.4编写程序,将0到1之间的100个浮点数(间隔0.01),用fwrite( )函数写入文件s.dat。

#include /*标准输入输出头文件*/

main( )

{

int i;

float num[100];

FILE *fp;

fp=fopen("s.dat","wb");

if (fp! =NULL)

{

for(i=0;i<100;i++)

num[i]=(float)i/100.0; /*数组赋值*/

fwrite(num,sizeof(float),100,fp);

}

else printf("can not open the file!\n");

fclose(fp);

}

程序运行结果是,将100个浮点数以二进制数据的形式写入文件s.dat。

例9.5编写程序,将例9.4中产生的文件中的100个浮点数读出到数组num[100]中,并打印num[50]中的内容。

#include /*标准输入输出头文件*/

main( )

{

第9章文件· 191 ·

float num[100];

FILE *fp;

fp=fopen("s.dat","rb");

if (fp! =NULL)

{

fread(num,sizeof(float),100,fp);

printf("%f\n",num[50]);

}

else printf("can not open the file!\n");

fclose(fp);

}

程序从s.dat文件中读出100个以二进制数据块的形式存储的浮点数,并将num[50]的内容打印出来。

9.2.4 文件的定位(location of file)

C语言的文件中有一个指向当前读写位置的位置指针,文件的读写都是从当前读写位置开始的,每进行一次读写操作,文件的读写位置都自动地发生变化。我们可以通过文件定位函数强制使指针指向其它位置,这种函数被称为文件定位函数。

1.rewind函数(rewind function)

rewind函数的功能是将文件的位置指针重新设置到文件的开头。该函数的一般格式为:

rewind(文件类型指针);

说明(Explanation):

rewind( )函数无返回值。

例9.6编写程序,将磁盘文件ss.txt的内容显示在屏幕上,然后再将它复制到tt.txt 文件中。

#include

main( )

{

FILE *fp1,*fp2;

fp1=fopen("ss.txt","r");

fp2=fopen("tt.txt","w");

if (fp1= =NULL || fp2= =NULL)

exit(0);

while (! feof(fp1))

putchar(getc(fp1));

rewind(fp1);

· 192 ·第9章文件

while (!feof(fp1))

fputc (getc(fp1),fp2);

fclose(fp1);

fclose(fp2);

}

将文件ss.txt 内容输出到屏幕后,文件位置指针已自动移到文件末尾,其中函数feof( )用于判断是否位置指针指向文件末尾。执行rewind( )函数后,文件位置指针重新指向文件开头,使feof( )函数的值恢复为0。

2.fseek函数和随机读写(fseek function and random read-write)

在C语言中,对流式文件可以顺序读写也可以随机读写。如果位置指针按字节位置顺序移动,就是顺序读写;如果位置指针可以按需要移动到文件的任意位置,就是随机读写。改变文件位置指针可以用fseek( )函数实现,其功能是对流式文件的位置指针按字节移动到指定位置。fseek( )函数的一般格式为:

fseek(文件类型指针,位移量,起始点);

说明(Explanation):

1.Turbo C在stdio.h中定义的“起始点”的名字、代表数字及其含义的对应关系见表

9.2。

2.ANSI C标准要求“位移量”是一个long类型的数据,指的是从“起始点”开始向

前或向后移动的字节数。位移量大于0时,向前移动;小于0时,向后移动。

3.fseek( )函数一般用于二进制文件。对于文本文件,因为需字符转换,计算位置时往

往会发生混乱。

4.如果执行正确,fseek( )函数的返回值为0;否则,表示出错。

表9.2 起始点的表示方法

起始点含义名字代表数字

文件开始SEEK_SET 0

文件当前位置SEEK_CUR 1

文件末尾SEEK_END 2

下面是几个fseek( )函数的例子:

fseek(fp,100L,0);

/*将文件位置指针从文件头向文件尾方向移动100个字节。*/

fseek(fp,-100L,1);

/*将文件位置指针从当前位置向文件头方向移动100个字节。*/

fseek(fp,-100L,2);

/*将文件位置指针从文件尾向文件头方向移动100个字节。*/

fseek(fp,0L,0);

/*将文件位置指针移到文件头。*/

例9.7编写程序,将例9.4中产生的文件中的第50到第60个浮点数读出来并打印。

#include /*标准输入输出头文件*/

第9章文件· 193 ·

main( )

{

int i;

float num[11];

FILE *fp;

fp=fopen("s.dat","rb");

if (fp! =NULL)

{ fseek(fp,50L*sizeof(float),0);

fread(num,sizeof(float),11,fp);

for(i=0;i<=10;i++)

printf("%f\n",num[i]);

}

else printf("can not open the file!\n");

fclose(fp);

}

3.ftell函数(ftell function)

在流式文件中,文件位置指针经常移动,人们往往很难确定其当前位置。fteel( )函数的作用就是得到文件位置指针的当前位置。若函数调用成功,则返回文件指针的当前位置,其值为相对于文件头的位移量;若调用失败,则返回-1L。该函数的一般调用格式为:ftell(文件类型指针);

例如:

i=ftell(fp);

if (i= =-1L) printf("error!\n");

变量i存放的是指定磁盘文件中文件位置指针的当前位置,如果函数调用出错(例如文件不存在),则i的值将等于-1,输出error。

9.2.5 出错检测(Error detection)

文件读写函数不能直接反映函数运行是否正确,虽然有些函数具有返回值,但返回值既可能代表文件运行结果,也可能代表文件操作出错。C标准提供了一些专用函数,用来检查或清除函数调用中的错误。

1.ferror( )函数(ferror function)

该函数主要用来检查文件读写操作是否出错。我们在调用输入输出函数时,若发生错误,不但在返回值上有所反映,也可以使用ferror( )函数检查。它的一般格式为:ferror(文件类型指针);

说明(Explanation):

(1)若函数的返回值为0(假),表示本次调用成功;如果返回一个非0值(真),表

示本次调用出错。

· 194 ·第9章文件

(2)对同一个文件的每一次读写操作,都会产生一个ferror( )函数值。因此,应在每次

调用输入输出函数后,立即检查函数值,避免信息被覆盖。

一般,ferror( )函数使用形式为:

FILE *fp;

fp=fopen("ss.txt","r");

fputs(str,fp);

if(ferror(fp))

{

puts("can not write the file!\n")

exit(0);

}

如果fputs( )函数调用出错,则显示“can not write the file!”,然后退出程序;否则将执行后续程序。

2.clearerr( )函数(clearerr function)

该函数的功能是将文件结束标志和ferror( )函数的错误标志设置为0。它的一般格式为:clearerr(文件类型指针);

说明(Explanation):

1.若调用某个输入输出函数时出错,则ferror( )函数的返回值为非零数据。而调用了

clearerr( )函数后,ferror( )函数的值变为0。

2.若调用某个输入输出函数时出错,并且不改变它,此值会一直保留下去,直到对同

一个文件调用了clearerr( )函数或rewind( )函数。当然,如使用了其它任一个读写函

数也会改变这个值。

9.3 实际应用(Practice and application)

例9.8从键盘键入30名学生的信息,然后把它们输出到磁盘文件stu_data.dat中;然后再将所产生的文件中的数据读出来,验证一下文件中的内容是否是这些从键盘输入的数据。已知学生信息包括:姓名、学号、年龄、性别和地址。

#include

struct student /*定义用于存放学生信息的结构体*/

{

char name[10];

int num;

char sex[5];

int age;

第9章文件· 195 ·

char addr[15];

};

struct student stud[30]; /*定义结构体数组stud[30]和stud_1[30]*/

struct student stud_1[30];

main()

{

int i;

FILE *fp;

puts("please input information of the student:\n");

for(i=0;i<30;i++) /*从键盘输入30名学生信息存入stud[30]*/

{

scanf("%s %d",stud[i].name,&stud[i].num);

scanf("%s %d",stud[i].sex,&stud[i].age);

scanf("%s",stud[i].addr);

}

fp=fopen("stu_data.dat","w");

if (fp= =NULL)

{

puts("can't open the file\n");

exit(0);

}

else

{

for (i=0;i<30;i++) /*将结构体数组stud[30]中数据写入文件*/

fwrite(&stud[i],sizeof(struct student),1,fp);

fclose(fp);

}

puts("content of the file is:\n");

if((fp=fopen("stu_data.dat","r"))==NULL)

{

puts("can't open the file!\n");

exit(0);

}

else

{

for (i=0;i<30;i++) /*将文件中数据写入stud _1[30]*/ fread(&stud_1[i],sizeof(struct student),1,fp);

fclose(fp);

for(i=0;i<30;i++)

· 196 ·第9章文件

{

printf("name=%-10s num=%-4d",stud_1[i].name,stud_1[i].num);

printf("sex=%-5s age=%-4d",stud_1[i].sex,stud_1[i].age);

printf("addr=%-15s",stud_1[i].addr);

printf("\n");

}

}

}

上面程序实际可以分成两部分。前半部分是从键盘输入30名学生的信息,并将其写入“stu_data.dat”文件中。后半部分是将文件“stu_data.dat”中的信息读出来,然后在屏幕上输出。主要是验证一下文件中存放内容是否存在这些从键盘输入的数据。程序中定义了两个结构体数组stud[30]和stud_1[30],stud[30]是用来存放由键盘输入的信息,并作为fwrite( )函数的缓冲区;stud_1[30]作为fread( )函数的缓冲区,存放的是从文件stu_data.dat 中读出的数据。实际上,两个缓冲区可以共用一个结构体数组。

运行结果:

please input information of the student:

王宁 1 男22 辽宁省抚顺市↙

赵萍 2 女 21 辽宁省沈阳市↙

张仪 3 女21 辽宁省锦州市↙

content of the file is:(以下为source.txt文件中的内容)

王宁 1 男22 辽宁省抚顺市

赵萍 2 女 21 辽宁省沈阳市

张仪 3 女21 辽宁省锦州市

说明(Explanation):

(1)结构体数组作为一种数据类型可以和其他数据类型一样以变量为单位来进行输入输出。

(2)程序中语句:

for (i=0;i<30;i++)

fwrite(&stud[i],sizeof(struct student),1,fp);

表示每循环一次,输出一个结构体数组的元素。

(3)结构体数组中每个元素占用字节数用sizeof(struct student)来计算。

例9.9建立一个磁盘文件emploee.dat,文件内存放有10个职工的数据。每个职工的信息包括:姓名,职工号,性别,年龄,住址,工资,健康状况,文化程度。要求:(1)显示职工数据

(2)将姓名和工资的信息单独抽出来另建一个简明的职工工资文件。

#include

第9章文件· 197 ·

struct emploee

{

char num[4];

char name[10];

char sex[4];

int age;

char addr[15];

int salary;

char health[8];

char class[6];

};

struct emp

{

char name[10];

int salary;

};

struct emploee em[3], em_1[3];

struct emp em_case[3],em_case1[3];

main( )

{

int i;

FILE *fp,*fp1,*fp2,*fp3;

puts("please input information of workers :\n");

for(i=0;i<10;i++)

{

scanf("%s %s %s %d",em[i].num,em[i].name,em[i].sex,&em[i].age);

scanf("%s %d %s %s",em[i].addr,&em[i].salary,em[i].health,em[i].class);

}

fp=fopen("emploee.dat","w");

if (fp= =NULL)

{

puts("can't open the file\n");

exit(0);

}

else

{

for (i=0;i<10;i++)

fwrite(&em[i],sizeof(struct emploee),1,fp);

fclose(fp);

· 198 ·第9章文件

}

puts("content of the file is:\n");

if((fp1=fopen("emploee.dat","r"))= =NULL)

{

puts("can't open the file!\n");

exit(0);

}

else

{

for (i=0;i<10;i++)

fread(&em_1[i],sizeof(struct emploee),1,fp);

fclose(fp1);

for(i=0;i<10;i++)

{

printf("%-4s %-8s",em_1[i].num,em_1[i].name);

printf("%-4s %-6d",em_1[i].sex,em_1[i].age);

printf("%-10s %-6d",em_1[i].addr,em_1[i].salary);

printf("%-10s %-8s",em_1[i].health,em_1[i].class);

strcpy(em_case[i].name,em_1[i].name);

em_case[i].salary=em_1[i].salary;

printf("\n");

}

}

printf("\n* * * * * * * *\n");

fp2=fopen("emp_salary.dat","wb");

if (fp2= =NULL)

{

puts("can't open the file\n");

exit(0);

}

else

{

for (i=0;i<10;i++)

fwrite(&em_case[i],sizeof(struct emp),1,fp);

fclose(fp2);

}

if((fp3=fopen("emp_salary.dat","r"))= =NULL)

{

puts("can't open the file!\n");

第9章文件· 199 ·

exit(0);

}

else

{

for (i=0;i<10;i++)

fread(&em_case1[i],sizeof(struct emp),1,fp);

fclose(fp3);

for(i=0;i<10;i++)

{

printf("%-8s",em_case1[i].name);

printf("%6d",em_case1[i].salary);

printf("\n");

}

}

}

在运行这个程序时,从键盘输入10个职工的数据,程序会将它们写入emploee.dat文件,再将文件中数据读出来并输出到屏幕;然后建立一个简明文件emp_salary.dat,在屏幕上输出。

运行结果:

please input information of workers :

101 liping nan 23 beijing 890 good college↙ /*输入10名职工数据*/

102 wangjia nv 43 shanghai 1230 good college↙

103 maxiao nv 34 tianjin 990 good college↙

content of the file is: /*显示文件内容*/

101 liping nan 23 beijing 890 good college

102 wangjia nv 43 shanghai 1230 good college

103 maxiao nv 34 tianjin 990 good college

* * * * * * * *

liping 890 /*显示简明文件内容*/

wangjia 1230

maxiao 990

9.4 本章小结(Brief summary)

本章介绍的基本内容有:文件的概念、文件类型指针、文件的打开与关闭、文件的读写与定位以及调用输入输出函数时的错误检测等。

· 200 ·第9章文件

本章的难点是:文件类型指针的应用及文件的操作,特别是不同类型读写文件函数的应用。需要读者在理解的基础上,记忆函数的功能与格式,作到熟练应用这些函数去处理实际问题。

习题(Exercise)

9.1.选择题(Multiple-choice question)

(1)若只需要从一个已经存在的文件中读取数据,可用( )方式打开文件。

A)r B)b C)w D)a

(2)若不想原文件中的数据丢失,也不想修改原文件,只想添加数据,应该以( )方式打开文件。

A)r B)b C)w D)a

(3)以下叙述正确的是()。

A)用“w”或“w+”方式打开文件后,原来的数据不会丢失

B)用“a”或“a+”方式打开文件后,添加数据将加在文件的最后

C)“b”表示文件类型为文本文件

D)若需要建立一个新文件并写入数据,可用“r”方式打开文件

(4)有一个整数1000,如果按ASCII码形式输出则需要()个字节。

A)2 B)3 C)4 D)5

(5)()函数表示从指定文件中读取一个字符串。

A)fgetc( )B)fread( ) C)fgets( )D)fscanf( )

(6)()函数表示从指定文件中读取一个数据块。

A)fgetc( )B)fread( ) C)fgets( )D)fscanf( )

(7)可以使用()函数判断是否为文件末尾。

A)ferror( ) B)feof( ) C)fgets( ) D)fscanf( )

(8)()函数的作用是将文件位置指针重新设置到文件头。

A)fseek( ) B)rewind( ) C)ftell( ) D)feof( )

(9)()函数的作用是改变文件位置指针的位置。

A)fseek( ) B)rewind( ) C)ftell( ) D)feof( )

(10)下列叙述错误的是()。

A)每进行一次读写操作文件位置指针都自动发生变化。

B)对流式文件可以顺序读写,也可以随机读写。

C)fseek( )函数一般用于文本文件。

D)ftell( )函数所返回的当前文件位置指针是用相对量表示的。

9.2.填空题(Question that fill a vacancy)

(1)_______文件是指系统在内存区自动为每个正在使用的文件开辟一个缓冲区。

(2)在C语言中,使用文件要遵循一定的规则:先________,然后处理文件,处理结束后将其________。

(3)fprintf( )和fscanf( )函数的读写对象是_______;printf( )和scanf( )函数的读写对象是_______。

第9章文件· 201 ·

(4)fgetc( )和fputc( )两个函数与getc( )和putc( )函数相似,唯一不同之处是:前者是_______;后者是_______。

(5)_______函数和_______函数分别用来读或写如整型、实型、浮点型、双精度型和结构型变量的值,以及成段输入输出各种数组。

9.3.改错题(Revise the mistake)

(1)将由0到1之间的1000个浮点数(间隔0.001),用fwrite( )函数写入文件s.dat。

#include

main( )

{

int i;

float num[1000];

int *fp;

fp=fopen("s.dat","wb");

if (fp! =NULL)

{

for(i=0;i<100;i++)

num[i]=(float)i/1000.0; /*数组赋值*/

fwrite(num,sizeof(float),100,fp);

}

else printf("can not open the file!\n");

fclose(s.dat);

}

(2)将字符串“China”写入文件中去。

#include

main( )

{

FILE *fp;

fp=fopen("s.dat","r");

if (fp! =null)

{

puts("China",fp);

}

else printf("can not open the file!\n");

fclose(s.dat);

}

9.4.编写程序(program)

(1)将“Turboc”和“BASIC”写入文件wj.txt。

(2)已知文件wj.dat中有3个符点数,将它们读出来求和。并将和写入文件result.dat。

《Linux操作系统》实验三-权限和文件系统管理

《Linux操作系统》 实验报告 实验三:权限和文件系统管理

一、实验目的 1.Unix/Linux权限和文件管理命令; 2.Unix/Linux文件系统的使用; 3.与文件系统管理相关的其它命令。 二、实验环境 Linux操作系统 三、实验内容与实验过程及分析 (l)权限的字符串表示 使用ls -了-d 文件名查询相关文件权限 结果图为: (2) umask值与umask命令 使用命令:umask或umask –p 或 umask –S查看当前的umask值,使用umask 四位八进制数字或者符合修改umask值。 结果图为:

(3)使用权限管理命令chmod进行权限设置 为目录a1、a2修改权限(每完成一步操作都要用ls –l检查文件属性,并进行记录):

为目录a1、a2增加所有人的可进入和读写权限:chmod o+rx a1、a2 为目录a1加入同组人的写权限:chmod go+w a1 将目录a1的其他人权限递归方式设为不可读可不写不可执行:chmod -R o-rwx /root/a1 将目录a1的其他人权限递归方式设为可读可写可执行:chmod -R 777 /root/a1 结果图为:

(4)使用chown,chgrp等进行权限设置 使用权限管理命令chown,chgrp等进行权限设置(每完成一步操作都要用ls –l检查文件属性,并进行记录): 将目录a1用户主设为chown lm a1 将目录a1的组设为chgrp lm a1 将目录a1及其所有子目录的用户主设为lm,组设为chown -R lm:bin a1 结果图为:

操作系统简单文件系统设计及实现

简单文件系统的设计及实现 一、实验目的: 1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解 2、要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。 二、实验内容: 1、设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。 2、程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。另外,为打开文件设置了运行文件目录(AFD)。 3、为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作 4、算法与框图 ?因系统小,文件目录的检索使用了简单的线性搜索。 ?文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0,则表示不允许读写、执行。 ?程序中使用的主要设计结构如下:主文件目录和用户文件目录( MFD、UFD); 打开文件目录( AFD)(即运行文件目录) 文件系统算法的流程图如下

三、工具/准备工作: 在开始本实验之前,请回顾教科书的相关内容。并做以下准备: 1) 一台运行Windows 2000 Professional或Windows 2000 Server的操作系统的计算机。 2) 计算机中需安装Visual C++ 6.0专业版或企业版 四、实验要求: (1)按照学校关于实验报告格式的要求,编写实验报告(含流程图); (2)实验时按两人一组进行分组,将本组认为效果较好的程序提交检查。

操作系统课程设计文件系统管理)

操作系统课程设计Array文件系统管理 学院计算机学院 专业计算机科学与技术 班级 姓名 学号 2013年1月8日 广东工业大学计算机学院制 文件系统管理 一、实验目的 模拟文件系统的实现的基本功能,了解文件系统的基本结构和文件系统的管理方法看,加深了解文件系统的内部功能的实现。通过高级语言编写和实现一个简单的文件系统,模拟文件管理的工作过程,从而对各种文件操作系统命令的实质内容和执行过程有比较深入的了解。 二、实验内容和要求 编程模拟一个简单的文件系统,实现文件系统的管理和控制功能。在用户程序中通过使用文件系统提供的create,open,read,write,close,delete等文件命令,对文件进行操作。 以下报告主要包括: 1.可行性分析 2.需求分析 3.概要设计

4.详细设计 5.测试 6.总结 三、可行性分析 1、技术可行性 对于图形编程还不了解,但是经过本学期的三次实验的练习,可以设计好命令操作界面。利用大二期间学习的数据结构可以模拟出此课程设计的要求。 2、经济可行性 课程设计作为本课程的练习及进一步加深理解。与经济无关,可以不考虑。(零花费,零收益) 3.法律可行性 自己编写的程序,仅为练习,不作其他用途,与外界没什么联系,可行。 四、需求分析 编写程序实现文件系统,主要有以下几点要求: 1、实现无穷级目录管理及文件管理基本操作 2、实现共享“别名” 3、加快了文件检索 五、概要设计 为了克服单级目录所存在的缺点,可以为每一位用户建立一个单独的用户文件目录UFD(User File Directory)。这些文件目录可以具有相似的结构,它由用户所有文件的文件控制块组成。此外,在系统中再建立一个主文件目录MFD (Master File Directory);在主文件目录中,每个用户目录文件都占有一个目

辽宁石油化工大学硕士学位授予工作细则

辽宁石油化工大学硕士学位授予工作细则 第一章总则 第一条根据《中华人民共和国学位条例》和《中华人民共和国学位条例暂行实施办法》,结合我校实际情况,制定本工作细则。 第二条本校授予硕士学位的学科(专业)按国务院学位委员会批准公布的为准。 第二章学位评定委员会 第三条学校成立学位评定委员会,由9~25人组成,任期三年。学位评定委员会设主席一人、副主席若干人。委员会主席由校长担任,委员会成员经校长与有关方面磋商审定,报辽宁省教育厅批准,转报国务院学位委员会备案。校学位评定委员会下设学位办公室,具体处理日常事务。 校学位评定委员会履行以下职责: (一)作出授予学士学位的决定; (二)作出授予硕士学位的决定; (三)作出撤销违反规定而授予学位的决定; (四)研究和处理学位授予中有争议的问题和其它有关学位授予的问题; (五)审查、上报增设硕士学位授权学科(专业)的申请; (六)审定已有授权学科专业点硕士生指导教师的申请; (七)审核硕士学位课程设置、考试科目、门数、专业课的考试范围; (八)审批有权授予硕士学位专业的研究方向及变动; (九)审批硕士学位论文答辩委员会成员名单。 第四条学位评定委员会按学院所属学科设分委员会。分委员会由7~15人组成,任期三年。分委员会主席由校学位评定委员会委员担任,分委员会成员由教授、副教授和个别学术水平高的讲师及有关专家组成。分委员会成员由学院提名,校长审查批准。 学位评定分委员会协助学校学位评定委员会工作,履行以下职责: (一)审查学位课程设置,确定考试科目、门数和专业课的考试范围; (二)审批学士学位论文答辩委员会成员名单; (三)审查硕士学位论文答辩委员会成员名单,报学校学位评定委员会审定; (四)提出授予学士学位名单; (五)审查申请硕士学位人员的政治思想表现、课程考试成绩以及论文答辩等情况,并作出是否授予硕士学位的决议; (六)审查有权授予硕士学位专业的研究方向及变动; (七)审查本单位学科专业增列授权点的申请; (八)审查本单位硕士学位授权专业的硕士生指导教师的申请; (九)作出撤销违反规定而授予学位的决议;

辽宁石油化工大学学生干部选拔任用管理办法(座谈会讨论稿0318)

辽宁石油化工大学学生干部选拔任用管理办法 (征求意见稿) 第一章总则 第一条为深入贯彻落实《中共中央国务院关于进一步加强和改进大学生思想政治教育的意见》等文件和全国学联二十五大精神,按照《共青团中央、全国学联关于加强和改进高校学生会、研究生会建设的指导意见》相关要求,切实加强我校学生干部队伍建设,建立科学、民主、规范的选拔、培养、管理制度,根据《辽宁石油化工大学学生管理规定》的要求,特制定《辽宁石油化工大学学生干部选拔任用管理办法》(以下简称《办法》)。 第二条《办法》坚持以邓小平理论和“三个代表”重要思想为指导,树立和落实科学发展观,大力弘扬社会主义荣辱观,全面贯彻党和国家的教育方针,结合教育部、团中央对新形势下学生思想政治教育工作的部署,紧密结合我校学生干部队伍建设实际。第三条《办法》中的学生干部是指在校(院)党委领导下,由校(院)团委指导,在我校各级党团组织、学生组织中任职,并依照法律、学校规章制度和自己的章程独立自主开展工作的合法学生群众组织。结合我校实际情况,从岗位设置、选拔任免、职责权利、监督和管理考核等方面进行了说明。 第二章岗位设置与职数配置 第四条各级团组织学生干部岗位设置 校团委设学生兼职副书记2名,院团委设学生兼职副书记1名;校、院两级团委均设办公室、组织部、新闻宣传中心、社会实践部(根据实际情况,部门设置可适当调整),各部设部长(负责人)1名,设副部长1-2名;各班级团支部设书记、组织委员、宣传与信息委员各1名。 第五条各级学生会学生干部设置 (一)校学生会设主席1名,副主席4-6名,校研究生会、院学生会各设主席1名,副主席2-3名(校、院学生会副主席中1人兼任校、院社团联合会主席);校、院学生会均设秘书处、办公室、学习部、科技部、生活部、文艺部、体育部、宣传部(根据实际情况,部门设置可适当调整),各部设部长(负责人)1名,设副部长2-3名;校学生会秘书长由校团委老师担任。

(完整版)linux文件系统管理-权限管理实验4报告

实验报告 课程Linux系统应用与开发教程实验名称linux文件系统管理-权限管理(高级设置) 一、实验目的 1、掌握Linux文件系统权限的设置 2、掌握linux用户帐号与组管理 3、掌握linux 文件共享的设置方法 4、掌握linux 文件共享的权限设置方法 二、实验内容 1、使用root帐号通过系统提供的6个虚拟控制台登陆到linux,或在x-windows开启一个终端。 2、完成以下的实验内容 (1)、假设你是系统管理员:现要在公司linux服务器系统中新增一些用户与一个用户组。 ?使用groupadd account 添加一个名为account的组 ?使用useradd -G account acc-user1,(该命令将添加一个用户名为acc-user1的用户, 同时会建立一个与用户名同名的私有组(该私有组为用户的默认组,这个组中只有一个用户名),并把该用户将加入account的标准组,同时,按同样的方法建立acc-user2、acc-user3、acc-user4。 ?建立用户后,请使用x-window中的用户与组管理工具查看用户与组建立情况,检查用户与组的归属情况。 (2)、开启多个控制台,分别使用acc-user1、acc-user2、acc-user3登陆系统(可以在控制台分别登陆,也可以在X-windows中多开几个终端程序,默认使用root登陆,然后使用su命令通过切换用户的方式登陆,其语法为“su - user-name”,提示可以在登陆成功后运行命令“id”查看当前登陆的用户属于哪些组,当前的默认组是什么?) (3)、为account组建立一个公共共享目录/home/account-share,满足以下的权限设定要求,以及设置何种的umask: ?该目录的拥有者为acc-user1,所属组为account。 ?在该目录下建立一个/home/account-share/full-share的子目录,修改该目录的权限,使得account组的成员均能在对该目录有完全控制权限,account组外的其他用户没有任何权限,即account组的成员都可以在该目录下建立文件,同时在该子目录full-share下建立的文件,只有文件建立者有权限删除,并且每个用户在该子目录full-share下建立的文件也能自动与该account组成员可读共享。 ?在/home/account-share/为每个用户建立一个与用户名同名的子目录(如/home/account-share/acc-user1为用户acc-user1的目录,其拥有者为acc-user1,所在的组为account),配置该子目录的拥有者有完全控制权限,而同组用户只能读取,同时在用户在该目录下建立的文件,可供同组用户读。 (4)、考虑完成以上的共享目录权限设置,应注意哪些设置。包括目录的权限,目录的拥有者,目录所在的组,具体文件的权限,umask设置等。 (5)、实验报告应体现出使用不同身份的用户对所配置目录的访问测试过程。 三、实验环境 安装有vmware或visual pc软件的window主机,系统中有提供turbolinux或redhat的硬盘

操作系统实验5文件系统:Linux文件管理

实验5 文件系统:Linux文件管理 1.实验目的 (1)掌握Linux提供的文件系统调用的使用方法; (2)熟悉文件和目录操作的系统调用用户接口; (3)了解操作系统文件系统的工作原理和工作方式。 2.实验内容 (1)利用Linux有关系统调用函数编写一个文件工具filetools,要求具有下列功能:*********** 0. 退出 1. 创建新文件 2. 写文件 3. 读文件 4. 复制文件 5. 修改文件权限 6. 查看文件权限 7. 创建子目录 8. 删除子目录 9. 改变当前目录到指定目录 10. 链接操作 *********** 代码: #include #include #include #include #include #include #include #include void menu(void); void openfile(void); void writefile(void); void readfile(void); void copyfile(void); void chmd(void); void ckqx(void); void cjml(void); void scml(void); void ggml(void); void ylj(void); int main() { int choose; int suliangjin=1;

menu(); scanf("%d",&choose); while(choose!=0) { switch(choose) { case 1:openfile();break; case 2:writefile();break; case 3:readfile();break; case 4:copyfile();break; case 5:chmd();break; case 6:ckqx();break; case 7:cjml();break; case 8:scml();break; case 9:ggml();break; case 10:ylj();break; } menu(); scanf("%d",&choose); } return 0; } void menu(void) { printf("文件系统\n"); printf("1.创建新文件\n"); printf("2.写文件\n"); printf("3.读文件\n"); printf("4.复制文件\n"); printf("5.修改文件权限\n"); printf("6.查看文件权限\n"); printf("7.创建子目录\n"); printf("8.删除子目录\n"); printf("9.改变目前目录到指定目录\n"); printf("10.链接操作\n"); printf("0.退出\n"); printf("请输入您的选择...\n"); } void openfile(void) { int fd; if((fd=open("/tmp/hello.c",O_CREAT|O_TRUNC|O_RDWR,0666))<0) perror("open");

操作系统课程设计-模拟文件系统

目录 第1章需求分析 (1) 第2章概要设计 (1) 系统的主要功能 (1) 系统模块功能结构 (1) 运行环境要求 (2) 数据结构设计 (2) 第3章详细设计 (3) 模块设计 (3) 算法流程图 (3) 第4章系统源代码 (4) 第5章系统测试及调试 (4) 运行结果及分析 (4) 系统测试结论 (5) 第6章总结与体会 (6) 第7章参考文献 (6) 附录 (7)

第1章需求分析 通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力;掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,并了解操作系统的发展动向和趋势。 模拟二级文件管理系统的课程设计目的是通过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统,第一级为主目录文件,第二级为用户文件。 第2章概要设计 系统的主要功能 1) 系统运行时根据输入的用户数目创建主目录 2) 能够实现下列命令: Login 用户登录 Create 建立文件 Read 读取文件 Write 写入文件 Delete 删除文件 Mkdir 建立目录 Cd 切换目录 Logout 退出登录 系统模块功能结构

运行环境要求 操作系统windows xp ,开发工具vc++ 数据结构设计 用户结构:账号与密码结构 typedef struct users { char name[8]; char pwd[10]; }users; 本系统有8个默认的用户名,前面是用户名,后面为密码,用户登陆时只要输入正确便可进入系统,否则提示失败要求重新输入。 users usrarray[8] = { "usr1","usr1", "usr2","usr2", "usr3","usr3", "usr4","usr4",

实验二:NTFS文件系统设置实验

实验二 NTFS文件系统设置实验 一、实验目的 1、掌握NTFS文件系统的基本概念 2、掌握NTFS文件系统进行本地安全权限设置的操作 3、掌握磁盘配额等操作 二、实验要求 1、设备要求:1台装有Windows Server 2012操作系统并装有Hyper-V的计算机 2、每组1人,独立完成 三、实验基础 实验在Hyper-V虚拟机完成,掌握Hyper-V的基本操作,理解NTFS文件系统与权限设置的基本操作。 四、实验要求与步骤 任务1: 1)选择Windows 2008/2012虚拟机; 2)添加1个虚拟磁盘(3G容量)-(建议使用SCSI控制器); 3)启动Windows 2008虚拟机,用计算机管理-存储-磁盘管理,将磁盘联机并初始化; 4)新建3个简单卷,空间大小为1G, 分别设置驱动器号为F、G、H,并格式化F盘文件系统为FAT32;G、H盘文件系统为NTFS

任务2: 创建用户S1、S2、S3等,在G盘中建立文件夹G:\DOC,用记事本存放文件111.txt ,222.txt等, 在H盘中建立文件夹H:\S1、H:\S2、H:\S3 操作实现以下设置要求,并验证: 1) G:\DOC中存放着公司重要的资料,只有S1、S2普通用户对其只拥有读取权 限,Administrator对其拥有完全控制权限 2)H盘以S1、S2、S3命名的个人文件夹,对应用户拥有完全控制权限,其它用户无任何权限(如:H:\S1文件夹,S1用户拥有完全控制权限,其他用户无任何权限)

4)文件或文件夹的复制和移动对NTFS权限的影响,实验操作并观察属性的变化 5)在H盘上启用磁盘配额: 把S1 账户的配额设置为:磁盘空间限制为20MB,警告等级为18MB 把S2 账户的配额设置为:磁盘空间限制为30MB,警告等级为28MB 切换到S1 账户,向H:\S1复制一些文件,当复制到一定程度时会出现什么问题?

实验四 文件系统实验报告

实验四文件系统实验 一 . 目的要求 1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。 2、要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。 二 . 例题: 1、设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。 2、程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。另外,为打开文件设置了运行文件目录(AFD)。 3、为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。 4、算法与框图: ①因系统小,文件目录的检索使用了简单的线性搜索。 ②文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0,则表示不允许读写、执行。 ③程序中使用的主要设计结构如下: 主文件目录和用户文件目录( MFD、UFD) 打开文件目录( AFD)(即运行文件目录)

文件系统算法的流程图如下: 三 . 实验题: 1、增加 2~3个文件操作命令,并加以实现。(如移动读写指针,改变文件属性,更换文件名,改变文件保护级别)。 #include #include #include #include #define MAXSIZE 100 #define ADDSIZE 50 #define PT elem+l-> length #define N 4 typedef struct term{/*班级和学期的结构体*/ char class1[10]; char term1[10]; }term; typedef struct student{/*学生成绩信息的结构体*/ term st;/*班级和学期结构体放于此结构体中*/ char num[10]; char name[12]; float course[4]; float total; float average; int bit; }lnode,*stu; typedef struct{ lnode *elem;/*指向上个结构体的指针*/ int size;/*最大能放lnode结构体成员的个数*/ int length;/*当前长度*/ }sqack,*sq; sqack *l; void init(void)/*动态分配存储空间*/ { l-> elem=(stu)malloc(MAXSIZE*sizeof(lnode)); l-> length =0; l-> size=MAXSIZE; } void input(void)/*输入学生的信息*/ { lnode *newbase,*p; char cla[10],ter[10],ch; int n,i; if(l-> length> =l-> size){ newbase=(stu)realloc(l-> elem,(l-> size +ADDSIZE)*sizeof(lnode));/*追加存储空间*/ l-> elem =newbase; l-> size +=ADDSIZE; } p=l-> elem; do { printf( "输入班级和学期(学期用这种格式,如2005年上学期2005 1,2005年下学期2005 2;先输入班级,回车后再输入学期)\n "); gets(cla); gets(ter); printf( "要输入多少个名单?"); scanf( "%d ",&n); printf( "输入学生的成绩\n学号\t姓名\t科目1\t科目2\t科目3\t科目4\n "); for(i=0;i num ,p-> name,p-> course[0],p-> course[1],p-> course[2],p-> course[3]); strcpy(p-> st.class1,cla); strcpy(p-> st.term1,ter); ++l-> length ; } printf( "要继续吗?(y/n) ");

【辽宁石油化工大学专业介绍】_辽宁石油化工大学专业排名

辽宁石油化工大学都有哪些专业: 日语专业、过程装备与控制工程专业、通信工程专业、环境科学专业、金融学专业、油气储运工程专业、市场营销专业、政治学与行政学专业、无机非金属材料工程专业、工程管理专业、材料成型及控制工程专业、信息管理与信息系统专业、金属材料工程专业、机械设计制造及其自动化专业、应用物理学专业、对外汉语专业、英语专业、热能与动力工程专业、数学与应用数学专业、测控技术与仪器专业。 辽宁石油化工大学什么专业好: 化学工程与工艺、应用化学、过程装备与控制工程、油气储运工程、日语、过程装备与控制工程、通信工程、环境科学、金融学、油气储运工程、市场营销、政治学与行政学。以上专业算是辽宁石油化工大学最好的专业了。 辽宁石油化工大学最好的专业: 辽宁石油化工大学化学工程与工艺、应用化学、过程装备与控制工程、油气储运工程等专业可以说是辽宁石油化工大学最有优势的特色专业了,这些专业为同类型高校相关专业和本校的专业建设与改革起到示范带动作用。 辽宁石油化工大学优势专业排名: 其中排名前10的专业是:石油工程、油气储运工程、化学工程与工艺、应用化学、过程装备与控制工程、电气工程及其自动化、会计学、机械设计制造及其自动化、自动化、金融学专业,可以算是辽宁石油化工大学的优势专业了。 专业排名 专业名称 专业批次 1 石油工程 一批 2 油气储运工程 一批

3 化学工程与工艺 一批 4 应用化学 一批 5 过程装备与控制工程 一批 6 电气工程及其自动化 二批 7 会计学 二批 8 机械设计制造及其自动化二批 9 自动化 二批 10 金融学 二批 11 土木工程

12 能源与动力工程 二批 13 材料成型及控制工程 二批 14 高分子材料与工程 二批 15 俄语 二批 16 工程管理 二批 17 材料化学 二批 18 建筑环境与能源应用工程二批 19 安全工程 二批 20

操作系统实验---文件系统

实验报告 实验题目:文件系统 姓名: 学号: 课程名称:操作系统 所在学院:信息科学与工程学院 专业班级:计算机 任课教师:

实验项目名称文件系统 一、实验目的与要求: 1、通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及其内部实现。 2、熟悉文件管理系统的设计方法,加深对所学各种文件操作的了解及其操作方法的特点。 3、通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。 4、通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。 二、实验设备及软件: 一台PC(Linux系统) 三、实验方法(原理、流程图) 试验方法 (1)首先应当确定文件系统的数据结构:主目录、子目录以及活动文件等。主目录和子 目录都以文件的形式存放于磁盘,这样便于查找和修改。 (2)用户创建文件,可以编号存储于磁盘上。如file0,file1,file2…并以编号作为物理地 址,在目录中登记。 文件系统功能流程图 图1.文件系统总体命令分析

图 2.登录流程图图 3. ialloc流程图 图4.balloc流程图图5.密码修改流程图

图6.初始化磁盘 图 7.显示所有子目录 dir/ls 操作流程图

图8.创建文件 creatfile 、创建目录 mkdir 流程图 图9.改变当前路径 cd 操作流程图

实验原理 1.文件操作 ◆mkdir 创建目录文件模块,输入 mkdir 命令,回车,输入文件名,回车,即会在当前目录文件下创建一个名为刚刚输入的文件名的目录文件。在该创建过程中首先要判断该目录中有没有同名的文件,如果有的话就创建失败,还要判断在该目录下有没有创建文件的权限,有权限才可以创建。具体流程图查看第二节,系统流程图设计部分。 ◆del 删除文件模块,输入 del命令,回车,输入文件名,回车,即会在当前目录文件下删除一个名为刚刚输入的文件名的数据文件。在该删除过程中要判断该目录中是否存在该文件,如果不存在就没有必要执行该操作了,还要判断在该目录下有没有删除文件的权限,有权限才可以删除。具体流程图查看第二节,系统流程图设计部分。 ◆ls 显示当前目录下所有目录的模块,输入 ls 命令,回车 ,即会在屏幕上显示当前目录下的所有目录。在该过程中要判断该目录中是否为空,如果为空就没有必要执行该操作了。执行操作时,要调用 readdir (INode inode )函数 ,先读入文件内容到 content 里面,然后直接输出。如果子目录里面还有子目录,则通过递归,一并输出来。具体流程图查看第二节,系统流程图设计部分。 ◆chmod 改变文件权限模块,输入 chmod 命令,回车,输入文件名,回车,即会根据不同类别的用户在屏幕上提示要改变哪一类用户的权限。如果是文件拥有者执行该操作,他可以选择修改自己、其他用户的权限;如果是文件所属组成员执行该操作,他可以选择修改自己、其他用户的权限;如果是其他用户执行该操作,他只能选择修改自己的权限;在该过程中要判断该目录中是否存在该文件,如果不存在就没有必要执行该操作了。执行操作时,要判断对该文件有没有执行写操作的权利,没有就不能进行。具体流程图查看第二节,系统流程图设计部分。 ◆cd 改变当前所在目录的模块。输入 cd,回车,相应的字符串,回车,则会根据输入字符串的不同跳转到不同的目录下。如果字符串是‘ .’ ,则到当前目录;如果字符串是‘ ..’ ,则到父目录;如果字符串是‘/’ ,则到根目录;如果字符串是当前目录下的子目录,则到该子目录;如果字符串是一个决定路径,则到该绝对路径。当然在执行的时候要判断有没有该子目录或者该绝对路径,如果没有的话,就不能执行。具体流程图查看第二节,系统流程图设计部分。 2. 用户操作 ◆login 用户注销模块,输入 login ,回车,当前用户就退出了,需要重新登录。 ◆pw 用户修改口令模块,输入 pw ,回车,则会提示输入原始密码,输入正确了才可以提示输入新密码,并且要求新密码输入两次,两次一样了才能通过修改密码成功。具体流程图查看第二节,系统流程图设计部分。 ◆logout 用户退出系统模块,输入 logout ,回车,系统自动退出。

福建工程学院实验5 linux文件系统

实验五(1) Linux文件系统实验 实验目的 学习Linux中文件系统的使用,理解链接、权限的概念和使用;掌握常用的文件系统的系统调用,加深对文件系统界面的理解。 实验内容 1.学习文件链接的概念和使用(步骤一、步骤二) 2.学习文件权限的概念和管理机制,并学会使用(步骤三) 3.学习和文件相关的系统调用和库函数,进行若干编程练习(步骤四,至少完成两例) 实验步骤 一、文件链接与复制(hard link) 1.使用vi a创建一个文件a Vi a

2.使用ln a b命令创建一个链接

使用cp a c创建一个复制版本 观察3个文件的大小、时间、属主(owner)等属性

3.修改文件a 4.观察文件b的内容,观察文件c的内容,观察3个文件的大小、时间、属主(owner)等属性 5. 6.使用ls –li命令,观察文件a, b, c的inode编号 7.使用rm a删除文件a 8.观察文件b, c是否仍然存在,内容如何 b、c依然存在,b为a改变的内容,c内容不变

9.使用rm b删除文件b,再观察文件b, c是否存在 b不存在,c存在 二、符号链接(软链接)symbolic link / soft link 1.创建文件a 2.使用ln –s a b创建符号一个链接 3.执行上述步骤3-8,观察有什么异同 三、不同用户之间的硬链接和符号链接 1.在用户stu下创建文件a 注意使用chmod命令,将主目录(~stu)权限改为所有其它用户可访问(r-x)(如果不知道chmod命令的用法,可以使用man chmod来查阅) chmod o+rx ~

【辽宁石油化工大学排名】辽宁石油化工大学特色专业-辽宁石油化工大学录取分数线

大学录取分数线     辽宁石油化工大学1950年始建于大连,是新中国第一所石油工业学校,1953年迁至抚顺办学,1958年升格为抚顺石油学院,2000年2月由中央部委划转为辽宁省人民政府领导,实行“中央与地方共建,以地方为主”的管理体制,2002年2月经教育部批准更名为辽宁石油化工大学。建校55年来已培养5万多名毕业生,其中绝大部分已经成为石油石化等各行业的各级领导干部和技术骨干。    学校坐落在辽宁省抚顺市风景秀丽的浑河岸畔,依山傍水,环境优美。校园占地2013亩,建筑面积56.4万平方米,藏书153万册(含电子图书65.4万册),资产总值7.2亿元(不含新校区建设工程待界定资产5.2亿元),教学科研仪器设备总值8684万元。新校区投资6亿元,2005年底已全部建成,新老校区已经连成一片,成为融教学、科研、人文、生态于一体的具有现代风格的大学园区。    学校学科门类比较齐全,已形成以石油石化为特色,工、理、经、管、文、法、教等七大学科协调发展的办学格局和多层次的教育体系。拥有研究生、本科生、国有民办、高职、成人教育和留学生等,各类在校学生17149人(不含顺华学院本科生1858人),其中研究生803人,本科生11747人,高职专科生3769人,成教本专科830人。学校设有石油化工学院、环境与生物工程学院、机械工程学院、储运与建筑工程学院、计算机与通信工程学院、信息与控制工程学院、经济管理学院、理学院、人文学院、外国语学院、体育学院、顺华学院(独立学院)、职业技术学院、成人教育学院、抚顺理工学院等15个学院和研究生部,拥有3个省部级重点学科,4个省级重点实验室和工程技术中心,32个校级工程技术和科研机构。现有2个联合培养博士点、26个硕士点、7个工程硕士领域、3个第二学士学位专业、40个本科专业和20个高职专业,并具有以同等学力申请硕士学位的权力和招收选派留学生的资格。   现有783名专任教师,其中教授和副教授占45.6%;具有博士和硕士学位者占38.1%。有博士生导师和硕士生导师129人。有19人享受政府特殊津贴,13人被评为国家和省的百千万人才,39人为国家和省部级科技专家、学科带头人和优秀骨干教师。学校还

实验二 文件系统及磁盘管理

实验二文件系统及磁盘管理 1.文件系统管理 一、实验目的 ●掌握Linux下文件系统的创建、挂载与卸载。 ●掌握文件系统的自动挂载。 二、项目背景 某企业的Linux服务器中新增了一块硬盘/dev/sdb,请使用fdisk命令新建/dev/sdb1主分区和/dev/sdb2扩展分区,并在扩展分区中新建逻辑分区/dev/sdb5,并使用mkfs命令分别创建vfat和ext3文件系统。然后用fsck命令检查这两个文件系统;最后,把这两个文件系统挂载到系统上。 三、实验内容 练习Linux系统下文件系统的创建、挂载与卸载及自动挂载的实现。 四、实验步骤 子项目1.创建/dev/sdb1和/dev/sdb5 ●使用fdisk命令创建/dev/sdb1主分区。 ●使用fdisk命令创建/dev/sdb2扩展分区。

●使用fdisk命令创建/dev/sdb5逻辑分区。 ●输入子命令w,把设置写入硬盘分区表,退出fdisk并重新启动系统。 ●用mkfs命令在上述刚刚创建的分区上创建ext3文件系统和vfat文件系统。 ●用fsck命令检查上面创建的文件系统。 子项目2.挂载/dev/sdb1和/dev/sdb5 ●利用mkdir命令,在/mnt目录下建立挂载点,mountpoint1和mountpoint2。 ●把上述新创建的ext3分区挂载到/mnt/mountpoint1上。

●把上述新创建的vfat分区挂载到/mnt/mountpoint2上。 ●利用mount命令列出挂载到系统上的分区,查看挂载是否成功。 ●利用umount命令卸载上面的两个分区。 子项目3.实现/dev/sdb1和/dev/sdb5的自动挂载 ●编辑系统文件/etc/fstab文件,把上面两个分区加入此文件中。 ●重新启动系统,显示已经挂载到系统上的分区,检查设置是否成功。 子项目4.挂载光盘和U盘 ●取一张光盘放入光驱中,将光盘挂载到/media/cdrom目录下。查看光盘中的文件。 ●利用与上述相似的命令完成U盘的挂载与卸载。 五、实验思考题 1. 在Linux下能创建Windows 的分区吗?在Linux下能创建Windows的文件系统吗? Windows操作系统可以识别ext3文件系统吗? 2.系统挂装表的文件名?系统挂装表的作用是什么?其文件格式使什么? 3.利用mount命令挂装一个文件系统和将其写入/etc/fstab文件的区别是什么?

操作系统实验-文件系统设计

文件系统设计 1.目的和要求 本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。 实验要求: ①在系统中用一个文件来模拟一个磁盘; ②此系统至少有:Create、delete、open、close、read、write等和部分文件属性的功能。 ③实现这个文件系统。 ④能实际演示这个文件系统。基本上是进入一个界面(此界面就是该文件系统的界面)后,可以实现设计的操作要求。 2.实验内容 1)设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。 2)程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UFD)。另外,为打开文件设置了运行文件目录(AFD)。 3)为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。 4)因系统小,文件目录的检索使用了简单的线性搜索。 5)文件保护简单使用了三位保护码:允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。 6)程序中使用的主要设计结构如下:主文件目录和用户文件目录(MFD、UFD),打开文件目录(AFD)即运行文件目录。 3.实验环境 VC 6.0 4.实验提示 1) format 格式化

只写打开模拟文件,初始化超级快,初始化dinode 位图 block 位图,初始化主目录,初始化etc 目录,初始化管理员admin 目录,初始化用户xiao 目录,初始化 用户passwd 文件,写入模拟硬盘文件。 2 )install 安装 读写打开模拟文件,读取dinode 位图 block 位图,读取主目录,读取etc 目录,读取管理员admin 目录,读取用户xiao 目录,读取 用户passwd 文件。 3 )login 登陆 用户输入用户名和密码,在passwd 文件中查找是否有此用户,核对密码。正确则登陆成功,当前目录设定到当前用户文件夹下。 Login 登录 结束是,登录成功 输入用户名 查找是否有改 用户名 输入密码是 否 密码是否正确 否 4 )ialloc 申请inode 空间 先检测inode 位图是否加锁,是则退出。加锁,检测inode 空间是否还有已满,是则退出。在inode 位图中顺序查找空闲的inode ,找到则返回inode 地址,block 解锁。函数结束。

操作系统--实验六-文件系统设计试验

操作系统--实验六-文件系统设计试验

实验目的与要求: 通过设计一个基于索引结构的文件系统,加深对文件系统的基本知识理解。了解文件系统设计的基本概念。 (1)熟悉文件系统的物理结构; (2)熟悉文件系统的目录管理; (3)掌握文件系统空闲空间管理的基本方法; (4)进一步理解现代操作系统文件管理知识。 实验设备(环境): (1)一台安装有Cygwin Terminal的计算机 (2) Windows XP操作系统 (3)VC++6.0 实验内容: (1)熟悉文件系统的物理结构; (2)熟悉文件系统的目录管理; (3)掌握文件系统空闲空间管理的基本方法; (4)进一步理解现代操作系统文件管理知识。 实验步骤、实验结果及分析: (1) 设计一个文件系统的索引结构,描述逻辑结构与物理索引结构之间的关系; (2) 设计文件目录,描述文件名与文件物理结构之中的映射关系; (3) 定义作业; (4) 设计文件建立; (5)设计文件系统的其它功能;

实验结论: 试验运行结果: 图1程序运行结果 4、思考 该试验中,从功能能上讲,根据所学的文件系统管理方面知识,你所设计的(模拟)文件还有那些没有实现: 对以后设计的修改建议: 目前所做的修改及实际结果如下: 程序清单: #include "stdio.h" #include "stdlib.h" //文件索引表的定义 struct index{ int lr[32]; int pr[32];

char st[32]; }*wq; #define JOBN 20 //文件目录的定义 struct list{ char names[32]; int size[32]; struct index*p[32];//文件的索引表地址}*HEAD; //作业序列 struct que{ char name; int size; }job[JOBN]; int i,j,ly,li; char bb;

辽宁石油化工大学石油炼制工程复习题

《石油炼制工程》复习题 一、名词解释 1、压缩比 气缸总体积与燃烧室体积之比。 2、沥青质 把石油中不溶于低分子正构烷烃,但能溶于热苯的物质称为沥青质。 3、含硫原油 硫含量在0.5~2%之间的原油。 4、加氢裂化双功能催化剂 由金属加氢组分和酸性担体组成的双功能催化剂。 5、剂油比 催化剂循环量与总进料量之比。 6、碱性氮化物 在冰醋酸和苯的样品溶液中能够被高氯酸-冰醋酸滴定的含氮化合物。 7、水—氯平衡 在重整催化剂中,为使催化剂保持合适的氯含量而采用注水注氯措施,使水氯处于适宜的含量称为水-氯平衡。 8、催化裂化总转化率 以新鲜原料为基准计算的转化率。总转化率=新鲜进料 焦炭汽油气体++×100%。 9、汽油的安定性 汽油在常温和液相条件下抵抗氧化的能力。 10、空速 每小时进入反应器的原料量与反应器内催化剂藏量之比称为空间速度(简称空速)。 11、氢油比 氢气与原料的体积比或重量比。 12、自燃点 油品在一定条件下,不需引火能自行燃烧的最低温度。 13、催化重整

催化重整是一个以汽油(主要是直馏汽油)为原料生产高辛烷值汽油及轻芳烃的炼油过程。 14、辛烷值 两种标准燃料混合物中的异辛烷的体积分数值为其辛烷值,其中人为规定标准燃料异辛烷的辛烷值为100,标准燃料正庚烷的辛烷值为0。 15、汽油抗爆性 衡量汽油是否易于发生爆震的性质,用辛烷值表示。 16、二级冷凝冷却 二级冷凝冷却是首先将塔顶油气(例如105℃)基本上全部冷凝(一般冷却到55~90℃),将回流部分泵送回塔顶,然后将出装置的产品部分进一步冷却到安全温度(例如40℃)以下。 17、加氢裂化 在较高压力下,烃分子与氢气在催化剂表面进行裂解和加氢反应生成较小分子的转化过程。 18、催化碳 催化裂化过程中所产生的碳,主要来源于烯烃和芳烃。催化碳 = 总炭量-可汽提炭-附加炭。 19、馏程 从馏分初馏点到终馏点的沸点范围。 20、汽化段数 原油经历的加热汽化蒸馏的次数称为汽化段数。 二、填空 1、油品含烷烃越多,则其粘度(越小),特性因数(越大),折光率(越小),粘度指数(越大)。 2、催化裂化反应生成(气体)、(汽油)、(柴油)、(重质油)(焦炭) 3、加氢精制的主要反应有(加氢脱硫)、(脱氮)、(脱氧)、(脱金属) 4、原油蒸馏塔的分离(精确度)要求不太高, 相邻产品间允许有

相关主题
文本预览
相关文档 最新文档