计算机操作系统专业课程设计_第1页
计算机操作系统专业课程设计_第2页
计算机操作系统专业课程设计_第3页
计算机操作系统专业课程设计_第4页
计算机操作系统专业课程设计_第5页
已阅读5页,还剩51页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机操作系统课程设计

班级:计091-1

姓名:

学号:

使用语言:C++

指导老师:

学院:

一、系统要求

1、试验目标

经过一个简单多用户文件系统设计,加深了解文件系统内部功效及内部实现。

2、试验内容

为linux系统设计一个简单二级文件系统。要求做到以下几点:

(1)能够实现下列几条命令(最少4条);

login用户登陆

dir列文件目录

create创建文件

delete删除文件

open打开文件

close关闭文件

read读文件

write写文件

(2)列目录时要列出文件名、物理地址、保护码和文件长度;

(3)源文件能够进行读写保护。

二、系统分析

1、设计思想

本文件为二级文件系统,即要实现对文件增删改查,同时又含有登陆系统、

注册用户功效,各个用户之间文件系统互不干扰。

本文件系统采取两级目录,其中第一级对应于用户账号,第二级对应于用户

帐号下文件。另外,为了简便文件系统未考虑文件共享,文件系统安全和管道文

件和设备文件等特殊内容。

系统采取结构体来存放用户、文件目录、文件数据内容:

048*548*5+44*5048*5+44*50+264x200

用户区文件目录区文件数据区

每个分区全部是由结构体组成,每个个去结构体个数由格式化系统是决定。

整个系统编码组成关键分为:

唱Workspace'file':1project^

-@filefiles

HSSourceFiles

国mymain.cpp

盟mysys.cpp

囱myuserfile.cpp

-PjHeaderFiles

Blallstruct.h

i]mysys.h

i]myuserfile.h

"1ResourceFiles

Allstruct.h定义了每个分区结构体;

Mysys.h申明了对系统操作多种方法;

Myuserfile.h申明了对文件操作多种方法;

Myrnain.cpp整个系统主函数,操作入口;

Mysys.cpp包含了mysys.h,实现了操作系统多种方法;

Myuserfile.cpp包含了myuserfile.h,实现了操作文件多种方法;

2、关键数据结构

Allstruct.h文件内容:

structs_user〃用户区结构体

longisuse;〃是否使用

charname[2()];〃用户名

charpsd[20];//密码

longaddress;//目录地址

(;

structs_list〃目录结构体

lungisuse;〃是否使用

charname[20];〃文件名字

longmyaddress;//本条目录地址

longpointaddress;//指向文件地址

longisfile;〃是否锁定

longpointsize;〃目标文件大小

longnextaddress;〃下条目录地址

};

structs_file〃文件结构体

{

longisuse;〃是否使用

charcontent[256];//文件内容

longnext;〃下个文件块地址

);

三、系统实施

1、假如首次进入系统,还没有文件系统,则会提醒格式化文件系统,创建分区,

并初始化分区:

陛想爆盘文件小存在,是台生成?V/N

底在创建。jj。、____

2、刚初始化后,没有用户,提醒创建用户:

序拟磁盘文件不存在,是否生成?丫/N

y

正在创建。。。。

阚建完成!是否创建用户?Y/N

府输入新用户的用户名:

情输入密码

123

情再次输入密码

123

品入存储。。。。

前建用户成功。

3、用户创建成功后出现对系统操作菜单

4、注册用户功效:

2

请输入新用户的用户名:

adnin

请输入密码

123

请再次输入密码:

123

进入存储。、。。。

创建用户成功。

XXXXXXXXX*XXXXXMXXXXX

请选择:

1.

2.

3.

5、用户登录,登录成功后显示目前用户下全部文件及其具体信息,同时显示对

文件操作菜单:

情输入用户名:

情输入密码

123

图陆成功!欢迎您川

当前目录下的文件:

此用户没有创建文件,目录为空!

““

再)EK)

>泽

/•・

1文

•看

2件

•建

3除

•文

4•改

定状

态转

5•否

退

程序

0•销

6、新注册用户默认为没有文件,选择创建文件,而且每次对文件操作后显示目

前用户全部文件和操作菜单:

p

请输入文件名<字母和数字,最多19个字符〉:

aa

文件由多少个字符n组成?<必须小于2550个字符〉

128

文件是否锁定?9锁定/n〈或其他〉自由读写

隹前目录下的文件:

区件名大小是否锁定物理地址

128V2440

XXXXXXXXXXXXXXXXX

7、此次新建文件为锁定状态,不能被删除:

8、对文件查看,默认创建时候用0填充文件内容:

XXXXXXX**XXX*XXXX・XXVXXXXXXX

蒋输入要查看的文件的名字:(仅限当前目录)

aa

0000000000000000000000000000000000000000000000000000000000000003QQQ0I

000000000000000000000000000000000000000000000000

文件查看成功!

文件名大小是否锁定物理地址

aa128丫2440

MMMMMMMMMM-M-M-M-M-M-M-M-M-M-M-M-M-M-MMMMMMMMMMMMMM

9、修改文件内容:

餐输入要修改的文件的名字:(仅限当前目录)

蓄入内容:

sdfsdfsfsdfsdfsdfsdfsdfsdfsdfsdf

文件修改成功!

当前目录下的文件:

文件名大小是否锁定物理地址

31a128¥2440

10、对文件锁定进行装换:

同输入要转换是否锁定的文件的名字:(仅限当前目录〉

aa

反件己转换为自由读写!

性前目录下的文件:

因件名大小是否锁定物理地址

aa128N2440

11、删除文件:

清输入要删除的文件的名字:〈仅限当前目录〉

文件删除成功!

当前目录下的文件:

此用户没有创建文件,目录为空!

12、注销登录退出系统:

主输

的选

AS择

CD/.

查看

文4

1M

2新建

文M

3删除

文M

4修改L

状态

转换

是否

5定

退

程序

0注销

如销!

Messanykeytocontinue

四、功效实现

Mysys.h

#include<stdio.h>

#include"myuserfile.h"

classMSystenn

{"封装了管理系统方法

〃组员变量

private:

FILE*myfile;

MUserniyuser;

〃组员函数

public:

MSysterm(){)

voidoutNameO;〃打印登陆后川户名

intchcack();〃检验虚拟文件系统跟是否存在

intmyformatO;〃初始化虚拟磁盘

intcreateuser();〃创建用户

intlogin();〃用户登录

voidiiiyinainO;〃主控制程序

intlogout();〃用户注销

);

Myuserfile.h

#includc<stdio.h>

classMUser〃封装了管理文件方法

{

〃组员变量

public:

FILE*myfile;

charname[20];〃用户名

charpsd[2O];〃密码

longlistaddress;〃目录地址

longmyaddress;〃此用户地址

private:

longlastaddress;〃最终一个目录地址

〃组员函数

public:

intcrea(eFile();〃增加文件

intdelFile(charfilename[20]);//删除文件

intrevampFile(charfHename[20]);〃修改文件

intmydir();〃列出目前目录全部文件:夹)

intviewFile(charfilename[20]);〃查看文件

intmyConversion(charfilename[20]);〃转换是否锁定状态

private:

intisSanie(charfilename_f[20],charfilename_s[2O]);

Mymain.cpp

#include<stdio.h>

#includc<iostrcam>

#include"mysys.h"

#include<limits>

usingnamespacestd;

intmain()

(

charnod1;

intn_select=2,i_l=0;

MSystermmysys;

/***********文件不存在程序人口************/

if(mysys.cheack()==・l)〃磁盘空间不存在

{

COUIVV”虚拟磁盘文件不存在,是否生成?Y/Nu«endl;

cin»nodl;

cin.clcar();//清除流错误标识

cin.ignore(numeric_limits<streamsize>::max(),'\n');//清空输入流

if(nod1=='Y'||nodl=='y')

couivv"正在创建。。。。"vvendl;

if(mysys.myfbrmal()!=l)〃创建磁盘空间

{

cuuiW创建磁盘空间失败!立即退出。"v<cndl;

cin»nodl;

return2;

)

coui«”创建完成!是否创建用户?Y/N”《endl;

cin»nodl;

cin.clear();//清除流错误标识

cin.ignore(nuiTieric_limits<streanisize>::max(),,\n,);//清空输入流

if(nodl=='Y1|nod1=='y')

{

if(mysys.createuser()==1)〃创建用户

(

cout<〈"创建用户成功。"«endl;

)

else

|

cout«”创建用户失败!立即退出。"vvendl;

return3;

)

)

else

coutvv,匿名用户无法进入系统,正在退;|[。。。"«endl;

return4;

else

couivv”程序已结束!按任意键退出…。yvcmll;

returnI;

/***********文件存在程序入口**************/

for(;;)

cout<v"^****木*功*水*木*木木***木*木”«end卜

coui<v"请选择:"«endl;

cou(«"1.登录"vvendlvv”2.注册”<<endlvv”3,退出""endl;

coutvv"*******才*水***木**木****“v<end卜

cin»n_select;

cin.clearO;//清除流错误标识

cin.ignorc(nuincric_liinits<strcamsizc>::max(),'\n');//清空输入流

if(n_select==1)

for(imi_l=0;i」v=3;i」++)〃登录

if(mysys.login()==l)

coutw”登陆成功!欢迎您

mysys.outNameO;

break;

I

else

(

cout«"ffl户名不存在或密码错误!"«endl;

)

I

if(i_l==4)

(

coutvvFF法用户!Zvendk〈”输入任意键退出°Nvendl;

cin»nod1;

return5;

)

break;

)

if(n_select==2)

(

if(mysys.crcatcuscr()==1)//创建用户

(

coutvv,创建用户成功。"vvendl;

)

else

(

coutw,创建用户失败!"«endl;

if(n_select==3)

return6;

mysys.mymain();

return0;

}

Mysys.epp

#include"mysys.h"

#include"allstruct.h"

#include<iostream>

#inciudc<stdio.h>

#include<limils>〃用于清除残留输入流

usingnamespacestd;

in(MSysterm::cheack。〃检验虚拟空间是否存在

{

inyfiic=fopcn("tcstI.txt","r");

if(myfile==NULL)

(

return-1;〃返回代表文件不存在

)

fclose(myfile);

return1;

intMSys(erm::myformat()

inti=l;

inyfile=fopcn(ntesiI.txt","\v");

if(myfile==NULL)

{

return-1;

)

s_uscrms_uscr;

ms_user.isuse=O;

s_listms」ist;

ms_list.isuse=O;

s_filcms_file;

ms_tlle.isuse=O;

for(i=1;i<=5;i++)

{

if(fwrite(&ms_user,sizeof(ms_user),l,myfile)!=l)〃用户区格式化

{

cout<v”用户格式信息写入失败!"vvendl;

fclose(myfile);

return-2;

)

)

for(i=1;i<=50;i++)

if(fwrite(&ms」isi,sizeof(ms」ist)」,myfile)!=l)〃H录区格式化

coui<<”目录格式信息写入失败!”《endl;

fclose(myfile);

return-3;

)

)

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

(

if(fwrite(&ms_file,sizeof(ms_fne),1,myfile)!=l)〃数据区格式化

{

cout<<“数据格式信息写入失败!”《cndl;

fclose(inyfile);

return-4;

)

)

fclose(myfile);

return1;

I

intMSystenn::createuser()〃创建用户

{

s_userms_user,ms_user2;

intnowaddress=0,issame=0,m=0,i=1;〃统计H前扫描指针,密码比对标志位,循环使用

变量

coutvv”正在检验用户空间是否足够…。”《endl;

myfilc=fopcn("tcst1.txt","r");

for(i=1;iv=5;i++,fseek(myfile,44,1),nowaddress++)〃检验用户空间是否足够

(

if(fread(&ms_user2.isuse,4,l尸=0)

(

couiv<”读取用户空间失败,虚拟磁盘格式错误,可能己被损坏”<vendl;

fclose(myfile);

return-1;

)

if(ms_user2.isuse==0)

{

break;

)

I

if(i==6)

{

cout<<”用户空间已满!创建用户失败”《endl;

return-2;

)

for(;;)

(

coutvv”请输入新用户用户名:"vvendl;

cin»ms_;

cin.clear();//清除流错误标识

cin.ignore(numeric_limits<streamsize>::max(),'\n,'i;//清空输入流

fseek(myfile,0,0);

for(i=l;iv=5;i++)〃检验用户名

if(fread(&ms_user2.isuse,4,1,myfile)==O)〃找到被使用用户区,下一步读取名字

(

cout<<,读取用户空间失败,虚拟磁盘格式错误,可能已被损坏”<<endl;

fck)su(inyfilc);

return-I;

)

if(ms_user2isuse==O)

{

fseek(myfile,44,l);

)

else

{

if(fread(&ms_,20,1,myfile)==O)〃读取用户区名字

(

读取用户空间失败,虚拟磁盘格式错误.可能已被损坏

"«endl;

fclose(myfile);

return-1;

)

for(m=0;m<=19;m++)

(

if(ms_[m]!=ms_[m])

{

issame=0;

break;

else

issame=I;

if(ms_[m]=='\0')

{

break;

)

I

)

if(issame==I)

(

coutvv"用户名反复!请重新输入:"Wendi;

break;

)

fseek(myfile,24.1);

)

)

if(i>=6)

{

for(;;)〃输入密码

(

coutvv,请输入密码,最多19位。"«endl;

cin»ms_user.psd;

cin.clearO;//清除流错误标识

cin.ignore(numeric_limits<streamsize>::max(),,\n');//清空输入流

cout<<,请再次输入密码:"«endl;

cin»ms_user2.psd;

cin.clear();//清除流错误标识

cin.ignore(numericjimits<streamsize>::max(),,\n');//清空输入流

for(in=0;m<=19;m++)

{

if(ms_user.psd[m]!=ms_user2.psc[ml)

(

issame=0;

couivv"两次密码不匹配"«',«ms_user.psd«,,

"«ms_user2.psd«,r"«m«endl;

break;

)

else

(

issame=1;

if(ms_uscr.psd[m]=='\0')

{

break;

if(issame==1)

(

break;

)

}

cout<<"进入存放。。。。"<<cndl;

ms_user.isus?=1;〃空间使用置为使用(1);

ms_user.address=0;〃默认不存在目录

fclose(myfile);

myfile=fopen("test1.txt,\"r+");

fseck(myfHe,48*nowaddrcss,0);

if(fwrite(&ms_user,sizeof(ms_user),I,myfile)==0)

(

cout«,写入用户信息失败!"《endl;

}

else

(

break;

)

I

I

fclose(myfile);

return1;

)

intMSysterm::login()〃用户登录

(

s_userms_user,ms_user2;

intissamc=0,m=0,i=0;//比较标识,循环使用变量

couivv”请输入用户名:"«endl;

cin»ins_;

cin.clear。;〃清除流错误标识

cin.ignorc(numcric_liinits<strcamsizc>::max(),'\n');//清空输入流

myfile=fopen("test1.txt","'r");

for(i=1;i<=5;i++)

if(fread(&ms_user2.isuse,4,1,myfile)==0)〃读取被使用用户区

cout<〈”读取用户空间失败,虚拟磁盘格式错误,可能已被损坏“<<cndl;

fclose(myfile);

return-1;

)

if(nis_user2.isusc==0)

{

fseek(myfile,44,1);

continue;

)

else

{

if(fread(&ms_,20.1.myfile尸=0)〃读取名字

{

coutv<,读取用户空间失败,虚拟磁盘格式错误,可能已被损坏"<<endl;

fclose(myfile);

return-I;

)

for(m=0;m<=19;m++)

(

if(ms_[m]!=nis_[m])

{

issame=0;

break;

)

else

issame=I;

if(ms_[ml=='\0')

break;

1

)

}

if(issame==1)

(

if(fread(&ms_user2.psd,20』.myfile)==O)〃读取密码

{

COUIVV”读取密码失败!磁盘错误。,'«endl;

fclose(myfile);

return-1;

)

for(intk=0;k<=2;k++)

(

cony〈”请输入密码:”〈Vendl;

cin»ms_user.psd;

cin.clear();//清除流错误标识

cin.ignore(numeric_limits<streamsize>::maxOAn');//清空输入流

foi(m=0;m<=19;m++)

(

if(ms_user.psd[m]!=ms_user2.psd[m])

{

issame=0;

break;

else

issamc=1;

if(ms_user.psd[m]==*\0')

{

break;

)

)

I

if(issame==0)

{

couivv"密码错误,请重新输入。"<<end];

I

else

{

if(fread(&ms_user2.address,4,1,myfile)==0)〃读取目录地址

{

ccnit<<"读取目录失败!磁盘错误c"〈Vendl;

fclose(inyfile);

return-1;

)

for(m=0;m<=19;m++)〃对对象myuser赋值

{

fm]-ms_[m];

myuser.psd[m]=ms_usei2.psd[m];

)

myuser.lisiaddress=ms_user2.address;

myuser.myaddress=(i-1)*48;

fclose(myfile);

return1;〃返回登录成功

)

fclose(myfile);

return-2;〃密码错误

}

fseek(myfile,24,l);

fclose(myfile);

return-1;

voidMSyslerm::mymain()〃主控制程序

intm_point=9,myget=0;〃统计使用第几层控制台,接收函数返回值

charni_nameI[2()],m_nanic2l20J;

for(;;)

if(m_point==0)

myget=logout();

break;

couivvendlw”**************************************************************

*木木木木*木***木*木****«end卜

cout<<”目前目录下文件:“<<cndl;

myget=myuser.mydir();

**********"«endl;

coutw"*******今************************«endl:

coutv〈”请输入您选择:"v<endl;

coul«"1.查看文件内容”vvendl;

cout«"2.新建文件"<<endl;

cout«u3.删除文件"wendl;

cout«M4.修改文件"<<endl;

cout«,'5.是否锁定状态转换"<vendl;

cout«"0.注销,退出程序"wendl;

coutw"*******才***********************"<<end卜

cin»m_point;

cin.clcar();//清除流错误标识

cin.ignore(numeric_limits<streamsize>::max(),,\n,);//清空输入流

switch(m_point)

(

caseI:

if(myuser.listaddress==0)

(

couivv"您还没有创建文件!"«endl;

break;

)

cout«,请输入要查看文件名字:(仅限目前目录)”<<endl;

cin»m_namel;

cin.clear();〃清除流错误标识

cin.ignore(numeric_limits<streamsize>::max(),'\n,);//清空输入流

myget=myuser.viewFile(m_nanie1);

switch(myget)

{

caseI:

{

以)111«”文件查看成功!"<vcndl;

break;

1

case-1:

{

couivv"磁盘打开失败!"«endl;

break;

}

case-2:

{

coutvv”文件不存在!"«endl;

break;

)

default:

(

break;

)

I

break;

}//case1文件打开

case2:

myget=myuser.createFile();

switch(myget)

|

caseI:

{

couivv”创建成功!

break;

1

case-1:

{

couivv"磁盘打开失败!n«endl;

break;

}

case-2:

{

coutvv"目录空间已满!"vvendl;

break;

}

case-3:

{

cout«"数据空间已满!M«endl;

break;

}

case-4:

{

coutvv"文件名已存在!”<vendl;

break;

default:

〃cout<v”创建文件失败,原因未知!M«endl;

break;

I

)

break;

}//case2新建文件

case3:

(

if(myuser.1istaddrcss-0)

(

couivv"您还没有创建文件!"«endl;

break;

)

cout«,请输入要删除文件名字:(仅限目前目录)“<vendl;

cin»m_name1;

cin.clear();//清除流错误标识

cin.ignore(numeric_limits<streamsize>::max(),,\n');//清空输入流

myget=myuser.delFile(m_nameI);

switch(myget)

(

case1:

(

couivv"文件删除成功!n«endl;

break;

case-1:

cout«"磁盘打开失败!H«endl;

break;

1

case-2:

(

coul<<"文件不存在!"«endl;

break;

}

case-4:

(

coutvv”文件锁定!不能删除!"«endl;

break;

}

default:

{

cciit<〈”未知原因,删除失败!"vvendl;

break;

)

)

break;

}//case3删除文件

case4:

(

if(myuscr.listaddrcss==0)

{

coinvv”您还没有创建文件!"«endl;

break;

cout«,请输入要修改文件名字:(仅限目前目录)“<<cndl;

cin»m_namel;

cin.clear。;〃清除流错误标识

cin.ignore(numeric_limits<streamsize>::max(),'\n,);//清空输入流

inygcl=myuscr.ruvaiiipFilc(iii_iianic1);

switch(mygel)

(

case1:

{

couivv"文件修改成功!"«endl;

break;

}

case-1:

{

coutvv"磁盘打开失败!"«endl;

break;

1

case-2:

{

cout<<”文件不存在!"«endl;

break;

1

case-4:

{

//coutvv"文件锁定!无法修改!"«endl;

break;

case-5:

cout<〈”输入内容过多!无法修改!"«endl;

break;

I

default:

{

//coutvv"未知原因,修改失败!"Wendi;

break;

)

I

break;

}//case4修改文件

case5:

|

if(myuser.listaddress==0)

(

cout<<"您还没有创建文件!M«endl;

break;

)

cout«,请输入要转换是否锁定文件名字:(仅限目前目录)”<<endl;

cin»m_naniel;

cin.clear();〃清除流错误标识

cin.ignore(numeric_liinits<streamsize>::max(),'\n');//清空输入流

inygct=myuser.myConversion(m_namc1);

switch(mygel)

case0:

cout«"文件已转换为锁定!"«cndl;

break;

)

case1:

(

coui<v"文件已转换为自由读写!"vvendl;

break;

}

case-1:

(

coutvv"磁盘打开失败!"«endl;

break;

}

case-2:

{

ccut<〈"文件不存在!"vvendl;

break;

)

default:

{

COUKV”未知原因,修改失败!”<vendl;

break;

)

)

break;

}//case5转换是否锁定状态

default:

break;

}//switch

}

)

intMSysteim::logout()〃用户注销

{

charword[20]={'O'J;

for(inti=0;i<=19;i++)

(

[i]=word[i];

myuser.psd[i]=word[i];

)

fclose(myfile);

coutvv"已注销!"«endl;

return1;

)

voidMSyslerm::oulName()//打印登陆后用户名

(

cout«myuscr.namc«cndl;

)

Myuserfile.cpp

#include<iostream>

#include<stdio.h>

#includc<iomanip>

#include〈limits〉〃用于清除残留输入流

#includc"myuserfile.h"

#include"allstruct.h"

usingnamespacestd;

intMUser::createFile()〃增加文件

|

s」ist

s_filems_file;

longnowaddress=0,(address[10],num_char=0;//E录循环统计变量,数据块地址变量

组,字符个数(文件大小)

intf_ad_num=0,myerr=0,i=1;〃写入块数,是否在最终写入时失败(失败置1)

charfLname[20]={''},m='0',e='\0',f_islock;

longold_lastaddress=lastaddress;〃上一个R录地址(用于犯错回滚)

myfile=fopcn("tcst1.txt","r+");

if(myfile==NULL)

(

coutvv"读取磁盘失败!,'«endl;

fclose(myfile);

return-1;

I

fseek(myfile,48*5.0);//文件指针跳到目录区

for(i=l;i<=50;i++,fseck(myfile,40,l),nowaddress++)〃检验目录空间是否足够

(

if(fread(&ms」ist.isuse4Lmyfile)==0)〃读取是否使用

{

cout<<”读取目录空间失败,虚拟磁盘格式错误,可能已被损坏“<<cndl;

fclose(mytile);

return-1;

if(ms」ist.isuse==O)〃假如读取到未使用则跳出检测

{

break;

}

I

if(i==51)

|

cout«n目录空间已满!创建文件失败"<<endl;

fclose(myfile);

return-2;

1

上eek(myfile,48*5+44*50,0);〃文件指针跳到数据区

fo「(i=l;iv=200;i++1seek(myfile,260,l))〃检验数据空间是否足够(初步检验)

{

if(fread(&ms_fi1e.isiiqe,4,l,myfi1e)==0)〃读取是否使用

(

COUIVV”读取数据空间失败,虚拟磁盘格式错误,可能已被损坏“vvendl;

fclose(myfile);

return-1;

)

if(ms_file.isuse==0)〃假如有空白数据块则跳出

{

break;

)

I

if(i==201)

cout<<“数据空间已满!创建文件失败"<<cndl;

tclose(myfile);

return-2;

}

coutw”请输入文件名(字母和数字,最多19个字符):"vvendl;

cin»Lname;

cin.clear();//清除流错误标识

cin.ignore(numeric_liniits<streainsize>::max(),'\n');//清空输入流

fseek(myfile,48*5,0);〃文件指针跳到目录区

for(i=l;iv=50;i++)〃检验文件名是否被使用

{

if(fread(&ms_Hs[,sizeof(ms」ist)」,myfile)==0)〃读取目录

{

coutvv”读取目录空间失败,虚拟磁盘格式错误,可能已被损坏“Wendi;

fclose(myfilc):

return-1;

I

if(msjist.isuse=1)〃假如读取到未使用则跳出检测

(

if(isSame(Lname,ms_)==I)

(

fclose(myfile);

return-4;

for(;;)

coutw"文件由多少个字符m组成?(必需小于2550个字符)"wendl;

cin»nuni_char;

cin.clear();//清除流错误标识

cin.ignore(numeric_limits<streamsize>::max(),'\n,);//清空输入流

if(num_char<=2550)

{

break;

)

couivv”文件长度必需小于2550个字符。“<<endl;

)

ms_list.pointsize=num_char;

coutw”文件是否锁定?y锁定/n(或其它)自由读写"wendl;〃确定是否锁定

cin»Lislock;

cin.clear();//清除流错误标识

cin.ignore(numeric_]imits<streainsize>::max(),'\n');//清空输入流

if(f_islock==y||Uslock==,Y')

{

msjist.isfile=0;

}

else

msjist.isfile=1;

fseek(myfile,48*5+44*50,0);〃文件指针跳到数据区

for(i=0;i<=199&&f_ad_num<=(num_char/255);i++,fseek(inyfile,260,l))〃检验数据空

间是否足够

{

if(fread(&ms_file.isuse,4,1,myfile)==O)

{

cout<〈”读取数据空间失败,虚拟磁盘格式错误,可能已被损坏”《endl;

fclose(inyfile);

return-I;

}

if(ms_file.isuse-0)〃假如有空白区块

(

f_address[f_ad_num]=i*264+48*5+44*50;〃统计下目前空白区块绝对物理地址

f_ad_num++;〃先用后加

)

)

if(f_ad_num<=(num_char/255))〃空白地址不足

{

coutvv"没有足够磁盘空间,创建失败!"«endl;

fclose(niyfilc);

return-3;

)

ms_file.isuse=1;

inik=(V/for循环变量

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

if(i<(f_ad_num-1))〃对下个数据块进行链接

rns_file.next=Caddress[i+1];

else

ms_file.next=0;

fseek(myfne,fladdress[i],O);〃跳转到空白数据块

if(num_char>255)〃数据太多,一个区块放不了

if(fwrite(&ms_file.isuse,4,l,niyfile)==())〃写入已被使用

coutvv'数据模块写入isuse失败"《endl;

mycrr=1;

for(k=1;k<=255;k++)〃写入数据

if(fwrite(&m,1,1,myfile)==0)

coutvv"数据模块写入内容失败"vvendl;

myerr=1;

if(fwrite(&e,1,1,myfile)==0)//写入结束符

cout«,数据模块写入结束符失败”《cndl;

myerr=1;

if(fwritc(&nis_filc.ncxt,4,1jnyfilc)==0)〃写入F个数据块地址

coutvv'数据模块写入next失败"vvendl;

myerr=1;

)

num_char-=255;

)

else//数据小于一个区块大小

(

if(fwrite(&ms_file.isuse,4,l,myfile)==0)〃区块置为己使用

(

cout«'数据模块写入isusc失败"<<endl;

myerr=1;

)

for(k=1;k<=num_char;k++)

(

if(fwrite(&in,I,I,myfile)==0)

(

cout<<”数据模块写入内容失败”《endl;

myerr=1;

}

)

for(k=l;k<=(256-num_char);k++)〃写入数据

{

if(fwrite(&e,l,l,myfile)==0)

coutvv”数据模块写入结束符失败"<<endl;

niyerr=1;

)

if(fwrite(&ms_file.next,4,l,myfile)==0)〃写入下个文件链接地址,就是写入0

(

COUIVV,数据模块写入ncxl失败,yvcndl;

myerr=I;

)

}〃判定是否最终一个数据块结束

}〃数据块写入结束

〃开始写入目录区

ms」ist.isuse=1;

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

(

[i]=Lname[i];

I

ms_list.niyaddress=nowaddress*44+48*5;〃计算出地址

ms_list.pointaddress=f_address[0];〃赋值首个文件块池址

msjist.nextaddress=0;〃因为

if(lastaddress==0)〃被写入目录是首目录

{

fseek(myfile,msJist.rnyaddress,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论