📄 dbcontrol.cpp
字号:
// 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 + -