📄 record.h
字号:
#ifndef _RECORD_H_
#define _RECORD_H_
#pragma warning(disable: 4786)
#include "CatalogManager.h"
#include "Exception.h"
#include <string>
#include <fstream>
#include <vector>
#include "stdafx.h"
using namespace std;
class RecordHead
{
public:
bool m_valid; //有效无效的标志
int m_recordID; //记录的序号
int m_nextRecordID; //记录链中下一条记录的序号
RecordHead(bool valid = false, int recordID = -1, int nextID = -1);
};
class RecordManager
{
int m_recordAmount; //记录条数
int m_firstBlank; //第一条空白记录的序号
CatalogFile m_cataFile;
int m_attrAmount; //属性个数
fstream m_recdFile; //记录文件流
fstream m_cataIn; //日志文件流
public:
RecordManager(const string & tableName);
~RecordManager();
int GetRecordAmount(); //获取属性个数
int GetFirstBlank(); //获取第一个空白位置
void WriteFileHead(int amount, int first); //写入recd文件头信息
int GetSize(); //获取一条记录大小
RecordHead GetRecordHead(int id); //获取记录头信息
void WriteRecordHead(int id, RecordHead head); //写入记录头信息
void EnValid(int id, bool flag); //置Valid为有效活无效
bool IsEnd(int id); //判断是否最后一条记录
void WriteRecord(int id,const vector<string> & v_str,int line); //写入记录
string GetRecord(int id); //获取记录字符串
template <class T> //读写属性值(flag==‘i’为读
// flag=='o' 为写)
bool RecordAtrrIO(T &attr, int recdID, int attrID, char flag,int size){
RecordHead head;
CatalogFile catatmp;
int pos=0; //属性再记录中的位置
if(attrID>=m_attrAmount)
return false;
m_cataIn.seekg(20, ios::beg);
for(int i=0; i<attrID; i++)
{
m_cataIn.read((char*)&catatmp, sizeof(catatmp));
pos+=catatmp.size;
}
if(flag=='i')
{
m_recdFile.seekg((sizeof(int)*2+sizeof(RecordHead)), ios::beg);
m_recdFile.seekg((sizeof(RecordHead)+GetSize())*recdID, ios::cur);
m_recdFile.seekg(pos, ios::cur);
m_recdFile.read((char *)&attr,size);
}
else
if(flag=='o')
{
m_recdFile.seekp((sizeof(int)*2+sizeof(RecordHead)), ios::beg);
m_recdFile.seekp((sizeof(RecordHead)+GetSize())*recdID, ios::cur);
m_recdFile.seekp(pos, ios::cur);
m_recdFile.write((char *)&attr,size);
}
return true;
}
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -