操作系统的文件读写-c++实现

#include <iostream>
using namespace std;
struct Page//文件目录
{
	string name;//文件名
	int num;//起始块号
	int length;//文件长度
	Page *pre;
	Page *next;
};
struct Node//物理块
{
	int num;//为0时为空
	string str;//逻辑记录
};
int frees=32;//空闲物理块号
Node node[32];

void init(Page *head)//初始化
{
	for(int i=0;i<32;i++)
	{
		node[i].num=0;
		node[i].str="";
	}
	head->name=" ";
	head->num=-1;
	head->length=0;
	head->pre=NULL;
	head->next=NULL;
}
void create(Page *head)//新建文件
{
	cout<<"请输入文件名\n";
	string str;
	cin>>str;
	Page *temp=new Page();
	Page *temp1=new Page();
	temp->name=str;
	for(temp1=head;temp1!=NULL;temp1=temp1->next) //文件名已存在
	{
		if(str==temp1->name)
		{
			cout<<"文件名已存在,请重新输入\n";
			delete temp;
			delete temp1;
			return ;
		}
	}
	cout<<"请输入文件长度\n";
	int leng;
	cin>>leng;
	if(leng>frees) //判断是否有足够的空闲块
	{
		cout<<"磁盘空间不足\n";
		delete temp;
		return ;
	}
	frees-=leng;
	cout<<"请输入文件内容\n";
	string str1[leng];
	for(int i=0;i<leng;i++)//输入文件内容
	{
		cin>>str1[i];
	}
	int cou=0;
	for(int i=0;i<leng;i++)
	{
		for(int j=0;j<32;j++)
		{
			if(node[j].num==0)//查找空闲块
			{
				if(i==0) //起始块号
				{
					cou=j;
					temp->num=j;
					temp->length=leng;

					temp->next = head->next;	//头插法插入新作业
					if(head->next != NULL)
		        		head->next->pre = temp;
					temp->pre = head;
					head->next = temp;
					node[j].str=str1[i];
					node[cou].num=-1;

				}
				else if(i==leng-1)//末尾
				{
					node[j].str=str1[i];
					node[cou].num=j;
					node[j].num=-1;

				}
				else//中间
				{
					node[j].str=str1[i];
					node[cou].num=j;
					node[j].num=-1;
					cou=j;
				}
				break;
			}
		}
	}
	cout<<"新建成功\n";
}

void change(Page *head)//插入内容,设定每次只能插入一段内容
{
	if(frees==0) {cout<<"无空闲块\n";return ;}
	cout<<"请输入要修改的文件名\n";
	string str;
	cin>>str;
	Page *temp=new Page();
	for(temp=head;temp!=NULL;temp=temp->next)
	{
		if(temp->name==str)
		{
			temp->length++;
			cout<<"在第几段文件插入\n";
			int nu;
			cin>>nu;
			cout<<"请输入文件内容\n";
			string str1;
			cin>>str1;
			int temp1=temp->num;
			string temp2=str1;
			int i=1;
			string nk;
			while(1)//插入位置之后的内容后移
			{
				if(i==temp->length-1)
				{
					for(int k=0;k<32;k++)
					{
						if(node[k].num==0)
						{
							string nk2=temp2;
							temp2=node[temp1].str;
							node[temp1].num=k;
							node[temp1].str=nk2;
							temp1=k;
							break;
						}
					}
					node[temp1].str=temp2;
					node[temp1].num=-1;
					break;
				}
				nk=temp2;
				temp2=node[temp1].str;
				if(i>nu) node[temp1].str=nk;
				if(i==nu) node[temp1].str=str1;
				temp1=node[temp1].num;
				i++;
			}
			cout<<"插入成功\n";
			frees--;//空闲块减一
			return;
		}
	}
	cout<<"文件名不存在"<<endl;
}
void shanchu(Page *head)//删除
{
	cout<<"请输入要删除的文件名\n";
	string str;
	cin>>str;
	Page *temp=new Page();
	for(temp=head;temp!=NULL;temp=temp->next)
	{
		if(temp->name==str)
		{
			int i=temp->num;
			while(1)
			{
				frees++;//每次空闲块加1
				node[i].str="";
				if(node[i].num==-1)
				{
					node[i].num=0;
					break;
				}
				int temp1=node[i].num;
				node[i].num=0;
				i=temp1;
			}
			temp->pre->next=temp->next;//删除输入的文件
			if(temp->next!=NULL) temp->next->pre=temp->pre;
			cout<<"删除成功\n";
			delete temp;
			return ;
		}
	}
	cout<<"文件不存在\n";
}
void print1(Page *head)//打印文件目录
{
	cout<<"文件目录如下:\n";
	cout<<"文件名       文件长度\n";
	Page *temp=new Page();
	for(temp=head->next;temp!=NULL;temp=temp->next)
	{
		cout<<temp->name<<"             "<<temp->length<<"\n";
	}
	delete temp;
}
void print2()//打印文件定位表
{
	cout<<"块号        指向       内容"<<endl;
	for(int i=0;i<32;i++)
	{
		cout<<i<<"           "<<node[i].num<<"         "<<node[i].str<<endl;
	}
}
int main()
{
	Page *head=new Page();
	init(head);
	while(1)
	{
		int choice;
		cout<<".....................................\n";
		cout<<"1、新建文件\n2、修改文件\n3、删除文件\n4、查看文件目录\n5、查看文件定位表(FAT)\n";
		cout<<".....................................\n";
		cin>>choice;
		switch(choice)
		{
			case 1:
				create(head);
				break;
			case 2:
				change(head);
				break;
			case 3:
				shanchu(head);
				break;
			case 4:
				print1(head);
				break;
			case 5:
				print2();
				break;
			default:
				cout<<"没有此操作,请重新输入\n";
		}
	}
}


1.文件创建写入
2.文件修改
3.删除文件
4.查看文件目录
5.查看文件定位表

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小徐同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值