⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbcontrol.cpp

📁 数据库模拟程序 实现控制台命令词法分析
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		//	if(文件名存在)
		//获得词典文件中的位置
		if((offsetInIndex = control.findInIndexFile(index)) != -1)
		{
			//从索引文件中删除
			IndexForCiDian tempIndex;
			memset(&tempIndex, 0, sizeof(IndexForCiDian));
			
			file.seekp(offsetInIndex);
			
			
			
			if(file.write((char*)&tempIndex, sizeof(IndexForCiDian)))
			{
#ifdef _DEBUG
				AfxMessageBox("删除索引操作成功!");
#else
				NULL;
#endif
				file.write("\n", 1);
				file.flush();

				//从写文件
				RewriteIndexFile();
			}
			else
			{
#ifdef _DEBUG
				AfxMessageBox("删除索引操作失败!");
#else
				NULL;
#endif
			}
			
			file.close();
			
		}				
		//	else
		else
		{
			//		返回表不存在的提示
			str.Format("%s不存在!删除操作失败!", index.name);
			AfxMessageBox(str);
			file.close();
			return false;
		}
		
		
		//打开词典文件,根据索引文件中找到的位置,及相关信息
		file.open("CiDian.txt", ios::in | ios::out);
		file.seekg(index.startOffset);
		char *buffer = new char[index.item_len];
		memset(buffer, 0, index.item_len);
		
		if(file.write((char*)buffer, index.item_len))
		{
#ifdef _DEBUG
			AfxMessageBox("删除模式操作成功!");
#else
			NULL;
#endif
			file.write("\n", 1);
			file.flush();

			//从写文件/////////
//			RewriteCiDian();
			///////////////////
		}
		
		else
		{
#ifdef _DEBUG
			AfxMessageBox("删除模式操作失败!");
#else
			NULL;
#endif
		}
		
		file.close();
		//	读取词典文件。
		
		
		
	}
	else if(strcmp(word[1].name, "VIEW") == 0)
	{
		//实现视图删除
	}
	return false;
}

/*
从索引表中找到指定名称,类型的indexforCiDian对象
  */
long CDBControl::findInIndexFile(IndexForCiDian &findIndex)
{
	ifstream file;
	long value = -1;
	file.open("IndexForCiDian.txt", ios::in);
	IndexForCiDian index;
	memset(&index, 0, sizeof(IndexForCiDian));
	
	char ch;
	while(file.read((char*)&index, sizeof(IndexForCiDian)))
	{	
		if(strcmp(index.name, findIndex.name) == 0 && index.indexType == findIndex.indexType){
			findIndex = index;
			value = file.tellg();
			file.seekg(-(signed)sizeof(IndexForCiDian), ios::cur);
			value = file.tellg();
			file.seekg(sizeof(IndexForCiDian), ios::cur);
			break;
		}
		file.read(&ch, 1);//读去回车字符
	}
	
	file.close();
	return value;
}

int CDBControl::Select()
{
	return false;
}

int CDBControl::InsertIntoValue(CString strCmd, Word word[], int len)
{
	bool findItInIndex = false;
	IndexForCiDian index;
	memset(&index, 0, sizeof(IndexForCiDian));
	
	char ch[10];
	memset(ch, 0, 10);
		
	long offset = -1;
	strcpy(index.name, word[2].name);
	index.indexType = TABLE;
	
	offset = findInIndexFile(index);
	
	if(offset == -1){
		CString str;
		str.Format(" %s 不存在!", word[2].name);
		AfxMessageBox(str);
		return false;
	}

	fstream file;
	char temp[20];
	memset(temp, 0, 20);
	strcpy(temp, word[2].name);
	strcat(temp, ".tab");

	file.open(temp, ios::in | ios::nocreate);
	int count = (index.item_len - NAME_LEN) / sizeof(DataItem);
	if(file.fail())
	{
		file.close();
		ofstream ff;
		ff.open(temp, ios::out);
		
		//写入表头数据 ,说明表中每个记录有多少属性
		char aaa[10];
		memset(aaa, 0, 10);
		itoa(count, aaa, 9);
		ff.write(aaa, 10);
		ff<<endl;
		ff.close();
	}
	file.close();

	file.clear();
	file.open(temp, ios::out | ios::in | ios::app);

	file.write(word[2].name, NAME_LEN);
	int i = 5;
	
	char buff[200];
	int com = 0;//数据项数计数
	while(1)
	{
		memset(buff, 0, 200);
		while(strcmp(word[i].name, ",") != 0 && strcmp(word[i].name, ")") != 0)
		{
			strcat(buff, word[i].name);
			i++;
		}
		
		file.write(buff, ITEM_LEN);//////此语句要求每个数据项最大为19个字节
		file.write(";", 1);//分号作为项目的分隔符
		if(file.fail())
			AfxMessageBox("afasf");
		com = com + 1;
		if(strcmp(word[i].name, ")") == 0)
			break;
		i++;
	}
	
	file<<endl;
	file.close();

//	file.close();
	return false;
}

int CDBControl::ReadFromCiDian(const IndexForCiDian &index, Data &data)
{
	fstream file;
	file.open("CiDian.txt", ios::in | ios::out );

	memset(&data, 0, sizeof(Data));
	file.seekg(index.startOffset, ios::beg);
	file.read(data.name, 40);
	data.pDataArray_len = (index.item_len - 40) / sizeof(DataItem);
	data.pDataArray = new DataItem[data.pDataArray_len];
	int i = 0;
	for(i = 0; i < data.pDataArray_len; i++)
	{
		file.read((char*)&(data.pDataArray[i]), sizeof(DataItem));
	}

	return true;
}

int CDBControl::ReadFromCiDian(long indexID, Data &data)
{
	IndexForCiDian index;
	memset(&index, 0, sizeof(IndexForCiDian));
	if(ReadFromIndex(indexID, index))
	{
		ifstream file;
		file.open("CiDian.txt", ios::nocreate);
		file.seekg(index.startOffset);
		if(file.read(data.name, NAME_LEN))
		{	
			int count = (index.item_len - NAME_LEN) / sizeof(DataItem);
			DataItem *dataItem = new DataItem[count];
			memset(dataItem, 0, count * sizeof(DataItem));
			int i = 0;
			while(i <= count - 1)
			{
				file.read((char*)&(dataItem[i]), sizeof(DataItem));
				i++;
			}
			data.pDataArray = dataItem;
			data.pDataArray_len = count;
		}
	/*
	if(file.good())
		AfxMessageBox(index.name);
	else
		AfxMessageBox("Error!");
	*/
		file.close();
		return true;
	}
	return false;
}

int CDBControl::RewriteIndexFile()
{
	fstream file;
	file.open("IndexForCiDian.txt", ios::in );

	//获得文件长度
	file.seekg(0 ,ios::end);
	long fileLen = file.tellg();
	long count = fileLen / sizeof(IndexForCiDian);

	//重置指针
	file.seekg(ios::beg);

	int i = 0;
	char buff[10];
	memset(buff, 0, 10);
	IndexForCiDian *index = new IndexForCiDian[count];
	while(file.read((char*)&(index[i]), sizeof(IndexForCiDian)))
	{
		file.read(buff, 1);//读取回车
		if(index[i].name[0] != 0)
			i++;
	}

	file.close();
	
	//从写文件
	file.open("IndexForCiDian.txt", ios::out);
	int com = i - 1;
	i = 0;
	while(i <= com)
	{
		file.write((char*)&(index[i]), sizeof(IndexForCiDian));
		file.write("\n", 1);
		i++;
	}
	file.close();
	return true;
}

int CDBControl::RewriteCiDian()
{
	fstream file;
	char buff[400];
	memset(buff, 0, 400);
	file.open("CiDian.txt", ios::in);
	file.seekg(0 ,ios::end);
	long fileLen = file.tellg();
	long count = 0;
/*	while(file.getline(buff, 400))
	{
		memset(buff, 0, 400);
		count++;
	}
	*/
	file.seekg(0, ios::beg);
	while(file.read(buff, 1))
	{
		if(buff[0] == '\n')
			count++;
	}
	char (*p)[400] = new char[count][400];
	int *len = new int[count];

	file.clear();
	file.seekg(ios::beg);
	int i = 0, j = 0;
	char ch[2];
	memset(ch, 0, 2);
	while(file.read(ch, 1))
	{
		if(ch[0] != '\n')
			file.seekg(-1, ios::cur);
		else
			continue;
		
		i = 0;
		memset(buff, 0, 400);
		while(file.read(ch, 1))
		{
			if(ch[0] == '\n')
				break;
			else
			{
				buff[i] = ch[0];
				i++;
			}
		}
		
		if(buff[0] != 0)
		{
			int m = 0;
			for(m = 0; m <= i - 1; m++)
				p[j][m] = buff[m];
			len[j] = i - 1;
			j++;//记录个数计数
		}
	}
	file.close();

	//从写文件
	file.open("CiDian.txt", ios::out);
	file.close();
	file.open("CiDian.txt", ios::out | ios::app);

	int com = j - 1;
	i = 0;
	int m = 0, n = 0;
	while(i <= com)
	{
		while(m <= len[n])
		{
			file.write(&p[i][m], 1);
			m++;
		}
		n++;
		m = 0;
		file.write("\n", 1);
		i++;
	}
	file.close();
	delete [] p;
	delete [] len;
	return true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -