?? os.cpp
字號:
////////////////////////////////////////////////////////////
// 編譯工具:Visual c++ 6.0 //
// //
// 作者:~小楚*smill~ 、藍色的天空 //
// 郵件:qvb20974151@163.com //
// //
// 復制、傳播請保留作者信息,謝謝! //
// //
////////////////////////////////////////////////////////////
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
void fileCreate(char *fileName,int fileLenght); //創建文件,文件最大長度為1萬
void fileDel(char *fileName); //刪除文件
void fileRead(char *fileName,int postion,int lenght);
void fileWrite(char *fileName,int position,char *s); //函數聲明
void fileAsk(char *fileName); //查詢文件屬性
void fileType(char *fileName); //顯示文件內容
void fileRen(char *fileName,char *newName); //重命名文件
void fileDir(); //列出所有文件
void fileClose(char *fileName); //關閉一個文件
int requestDisk(int *startPosition,int *maxLength); //分配磁盤空間
/////////////////////////////////
//模擬磁盤空間
char disk[10000];
///////////////////////////////
//磁盤空間管理
struct freeDiskTable
{
int start; //開始位置
int length; //占用長度
int maxLength; //最大長度
int useFlag; //使用標志,1為占用,0為空閑
};
//////////////////////////////////
//文件表
struct fileTable
{
char fileName[20]; //文件名字
int start; //開始位置
int length; //文件長度
int maxLength; //最大長度
char fileKind[8]; //文件種類,此默認為txt
struct tm *timeinfo; //文件創建時間
};
////////////////////////////////
//打開文件表
struct openFileTable
{
char fileName[20]; //文件名字
char fileKind[8]; //文件類型
int start; //文件開始位置
int length; //文件長度
int maxLength; //最大長度
int openCount; //打開文件的進程數
struct tm *timeinfo; //文件創建時間
};
//////////////////////////////
typedef struct freeDiskTable LinDataType; //定義鏈表的數據類型
#include "LinList.h" //鏈表操作集合
SLNode *freeDiskTableHead; //定義磁盤分配表鏈表 頭指針
#define MaxSize 100 //定義線性表 最大長度
typedef struct fileTable SeqDataType; //定義線性表數據類型
#include "SeqList.h" //線性表操作集合
SeqList L; //文件表,模擬文件操作嘛,文件數不多,故可以用 線性表,簡化操作^_^
struct openFileTable OFT[10]; //打開文件表數組
int OFT_count=0; //打開文件表占用長度
void main()
{
struct orderTable //命令表
{
char name[8];
};
char orderInput[30]; //存儲用戶輸入的命令字符串
char orderName[8]; //命令名字
char fileName[20]; //命令參數1,是文件名字
char parameter2[6]; //命令參數2,是個數字
char parameter3[30]; //命令參數3,是字符串或數字
struct orderTable u[9]; //命令表
int i=0;
int flag=0; //用戶輸入串 讀寫位置 標志
int flagOrder=-1;
/////////////////////////////////////
LinListInitiate(&freeDiskTableHead);//磁盤空間分配鍵表初始化
struct freeDiskTable temp;
temp.length=0;
temp.maxLength=10000;
temp.start=0;
temp.useFlag=0;
if(!LinListInsert(freeDiskTableHead,0,temp))
{
printf("初始磁盤空閑表失敗!");
system("pause");
exit(0);
}
/////////////////////////////////////
//文件表初始化
SeqListInitiate(&L); //初始化 文件表
/////////////////////////////////////
for(i=0;i<2;i++)
for(int j=0;j<2;j++)
{
system("color fc");
printf("\n\n\n\n\n\n\n\n\n 作者:XXX 操作系統課程設計\n");
for(int k=0;k<30000000;k++);
system("cls");
system("color f3");
printf("\n\n\n\n\n\n\n\n\n 作者:XXX 操作系統課程設計\n");
for(k=0;k<30000000;k++);
system("cls");
}
system("color 17"); //設置背景色 和 前景色
////////////////////////////////////////////////////////////
//初始化命令表
strcpy(u[0].name,"create");
strcpy(u[1].name,"delete");
strcpy(u[2].name,"read");
strcpy(u[3].name,"write");
strcpy(u[4].name,"ask");
strcpy(u[5].name,"type");
strcpy(u[6].name,"ren");
strcpy(u[7].name,"dir");
strcpy(u[8].name,"close");
////////////////////////////////////////////////////////////
while(1)
{
printf("\n");
printf("|******************************************************|\n");
printf("|* create-創建 delete-刪除 read-讀取 write-寫入 *|\n");
printf("|* ask-查詢 type-顯示 ren-重命名 dir-顯示文件 *|\n");
printf("|* close-關閉文件 *|\n");
printf("|* 輸入'命令 ?'獲得幫助,例如'create ?',exit-退出程序 *|\n");
printf("|******************************************************|\n");
printf("請輸入命令:>");
fflush(stdin); //清空緩沖區
gets(orderInput); //獲取用戶輸入串
if(!strcmp(orderInput,"exit"))exit(0); //當用戶輸入 exit 退出程序
system("cls"); //清屏
for(i=0;orderInput[i]!=' '&&orderInput[i]!='\0';i++)//以空格為界 分解用戶輸入串
{
orderName[i]=orderInput[i];
}
flag=i;//保存讀寫指針
if(flag>6) //命令名長度 小于6
{
printf("輸入的命令有誤,請重新輸入!\n");
continue ;
}
orderName[i]='\0';
flagOrder=-1; //初始化標志位,flagOrder 指明命令在命令表中的位置
for(i=0;i<9;i++)
{
if(!strcmp(orderName,u[i].name))
{
flagOrder=i; //記錄命令的位置,以便訪問
break;
}
}
if(flagOrder==-1)
{
printf("你輸入的命令有誤!請重新輸入!\n");
continue ;
}
/////////////////////////////////////////////////////
//以空格為界,分解字符串,分解出第一個字符串放到fileName中
for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='\0';i++)
{
fileName[i-flag-1]=orderInput[i];
}
fileName[i-flag-1]='\0'; //為字符串數組 置一個結束標志
/////////////////////////////////////////////////////
flag=i; //下一個字符串 讀寫指針
if(!strcmp(fileName,"?")) //顯示命令幫助
{
switch(flagOrder)
{
case 0:
printf("創建一個文件 格式 create [filename][filelength]\n");
printf("例如: create a1 1000 ,將創建名為a1,長度為1000字節的文件\n");
break;
case 1:
printf("刪除一個文件 格式 delete [filename] \n");
printf("例如: delete a1,將刪除名為a1的文件\n");
break;
case 2:
printf("讀取一個文件 格式 read [filename][postion][length]\n");
printf("例如: read a1 8 3,從a1文件第8個字節開始,顯示3字節內容\n");
break;
case 3:
printf("寫一個文件 格式 write [fileName][postion][conten] \n");
printf("例始: write a1 15 test,從a1文件第15字節開始寫入 test 字符串\n");
break;
case 4:
printf("顯示文件的屬性,格式 ask [filename]\n");
printf("例如 ask a1 ,將顯示文件 a1的屬性\n");
break;
case 5:
printf("顯示文件的所有內容,格式 type [filename]\n");
printf("例如 type a1,將顯示文件 a1的所有內容\n");
break;
case 6:
printf("重命名一個文件,格式 ren [oldFileName][newFileName]\n");
printf("例如ren a1 b1 ,將a1改名為b1\n");
break;
case 7:
printf("顯示所有文件,例如 dir,將顯示所有文件\n");
break;
case 8:
printf("關閉文件,格式 close [fileName]\n");
printf("例如,close a1,將關閉文件a1\n");
break;
default:
printf("命令錯誤");
}
getch();
}
else
{
switch(flagOrder)//對相應的命令 進行參數處理
{
case 0:
{
int Temp[4]={1,10,100,1000};
int sum=0;
int len=0;
for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='\0';i++)
{
parameter2[i-flag-1]=orderInput[i];
}
parameter2[i-flag-1]='\0'; //為字符串數組 置一個結束標志
flag=i;
len=strlen(parameter2); //求字符串數組的長度
for(i=0;i<len;i++) //把第二個參數 字符串變成整數
sum=sum+((int)parameter2[len-i-1]-48)*Temp[i];
fileCreate(fileName,sum); //將命令和參數 傳給建文件模塊執行
}
break;
case 1:
fileDel(fileName); //刪除文件
break;
case 2:
{
int Temp[4]={1,10,100,1000};
int sum=0;
int len=0;
int sum2=0;
//////////////////////////////////////////////////////////
for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='\0';i++)
{
parameter2[i-flag-1]=orderInput[i];
}
parameter2[i-flag-1]='\0';
flag=i;
len=strlen(parameter2); //求字符串數組的長度
for(i=0;i<len;i++) //把第二個參數 字符串變成整數
sum=sum+((int)parameter2[len-i-1]-48)*Temp[i];
///////////////////////////////////////////////////////////
for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='\0';i++)
{
parameter3[i-flag-1]=orderInput[i]; //把第三個參數變成整型
}
parameter3[i-flag-1]='\0';
flag=i;
len=strlen(parameter3);
for(i=0;i<len;i++)
sum2=sum2+((int)parameter3[len-i-1]-48)*Temp[i];
fileRead(fileName,sum,sum2); //調用讀文件模塊
}
break;
case 3:
{
int Temp[4]={1,10,100,1000};
int sum=0;
int len=0;
//////////////////////////////////////////////////////////
for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='\0';i++)
{
parameter2[i-flag-1]=orderInput[i];
}
parameter2[i-flag-1]='\0';
flag=i;
len=strlen(parameter2); //求字符串數組的長度
for(i=0;i<len;i++) //把第二個參數 字符串變成整數
sum=sum+((int)parameter2[len-i-1]-48)*Temp[i];
///////////////////////////////////////////////////////////
for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='\0';i++)
{
parameter3[i-flag-1]=orderInput[i]; //獲取第三個參數,為字符串
}
parameter3[i-flag-1]='\0';
flag=i;
//////////////////////////////////////////////////////////
fileWrite(fileName,sum,parameter3); //調用寫文件模塊
}
break;
case 4:
fileAsk(fileName); //查詢文件屬性
break;
case 5:
fileType(fileName); //顯示文件內容
break;
case 6:
{
for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='\0';i++)
{
parameter2[i-flag-1]=orderInput[i];
}
parameter2[i-flag-1]='\0';
flag=i;
fileRen(fileName,parameter2);
}
break;
case 7:
fileDir();
break;
case 8:
fileClose(fileName);
break;
default:
printf("錯誤!沒有可執行的命令");
}
}
}
}
//以上主函數,主函數進行數據結構的定義 分析用戶輸入的命令。
//提供命令幫助。把命令和參數,傳遞給執行模塊
//////////////////////////////////////////////////////////////////////
void fileCreate(char *fileName,int fileLength)//沒有寫到打開文件表
{
int i=0;
time_t rawtime;
int startPosition=0; //文件開始位置,等磁盤分配函數 返回值
int maxLength=fileLength;
struct fileTable temp;
for(i=0;i<L.size;i++)
if(!strcmp(fileName,L.list[i].fileName)) //判斷是否重名,如果重名直接返回
{
printf("文件重名,請取別的名字!\n");
return ; //文件重名,退出創建函數
}
if(!requestDisk(&startPosition,&maxLength))
{
printf("申請磁盤空間失敗!無法建立文件!\n");
return ; //申請磁盤空間失敗,退出創建函數
}
strcpy(temp.fileName,fileName);
strcpy(temp.fileKind,"txt"); //設置文件類型為 txt
temp.length=0; //創建的時候,還沒寫入內容,是空文件,長度設為0
temp.maxLength=fileLength; //文件的最大長度
temp.start=startPosition; //文件的開始位置
time(&rawtime); //獲取時間
temp.timeinfo=localtime(&rawtime); //把時間寫到結構體里去
if(!SeqListInsert(&L,L.size,temp)) //把文件 插入到文件表
{
printf("插入文件表失敗!\n");
system("pause");
exit(0); //把文件插入到 文件表,如果失敗,退出程序
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -