关于 二进制 数据文件(100分)

  • 主题发起人 主题发起人 鹤起风云
  • 开始时间 开始时间

鹤起风云

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟想用c++ builder 做一个二进制数据库,
数据结构如下:
代码 名称 修改时间 内容
功能:添加 、对指定记录修改、删除 ,分别以 代码、名称、修改时间 排序
请问哪位大侠有这方面资料 和代码,给小弟指点迷津!
我的email是:forsse@163.com,若分数不够,小弟可再加分
 
老兄,直接用现成的数据库不好呀,这可是好写的东东哟。
 
你直接用ClientDataSet不是很好吗?Midas可是一个不错的轻型数据库哦.
而且发布很简单,只要把主程序与MIDAS.DLL这个库文件一起发布就行了.
 
你参考一下这个
在TC2.0(具体我是在Tornado II开发环境使用C编译器,Tornado II是用来开发实时操作系统VxWork的工具)使用.我想将WinNT下的数据库(*.DB)转换为二进制文件数据库,以便能在VxWorks中使用。
我首先将Paradox数据库文件放到Table1中,再把数据库的信息依次写到文件中。(代码如下:)
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "MainUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
int __fastcall TForm1::GetDBFieldNum(void)
{ //获得字段数目
FieldNum=DBGrid1->Columns->Count;
return FieldNum;
}
//---------------------------------------------------------------------------
int __fastcall TForm1::GetRecordNum(void)
{ //获取记录数目
RecordNum=Table1->RecordCount;
return RecordNum;
}
//---------------------------------------------------------------------------
int __fastcall TForm1::GetFieldInf(void)
{ //获取字段的信息(字段名、字段类型、字段长度)
RecordLength=0;
for (int i=0;i<FieldNum;i++)
{
FieName=DBGrid1->Columns->Items->FieldName;
FieType=Table1->Fields->DataType;
FieLength=Table1->Fields->DisplayWidth;
RecordLength=RecordLength+FieLength;
}
return RecordLength;
}
//---------------------------------------------------------------------------
int __fastcall TForm1::WriteFileHead()
{ //写入字段数、记录数、记录长度
fwrite(&amp;FieldNum,sizeof(int),1,fp);
fwrite(&amp;RecordNum,sizeof(int),1,fp);
fwrite(&amp;RecordLength,sizeof(int),1,fp);
for (int i=0;i<FieldNum;i++)
{ //写入字段信息(字段名、字段类型、字段长度)
fwrite(&amp;FieName,80,1,fp);
fwrite(&amp;FieType,20,1,fp);
fwrite(&amp;FieLength,10,1,fp);
}
}
//---------------------------------------------------------------------------
int __fastcall TForm1::ReadFileHead()
{ //读取文件头信息(字段数、记录数、记录长度)和记录的结构信息
rewind(fp);
fread(&amp;FieldNum,sizeof(int),1,fp);
fread(&amp;RecordNum,sizeof(int),1,fp);
fread(&amp;RecordLength,sizeof(int),1,fp);
for (int i=0;i<FieldNum;i++)
{
fread(&amp;FieName1,80,1,fp);
fread(&amp;FieType,20,1,fp);
fread(&amp;FieLength,10,1,fp);
}
SeekNum=ftell(fp);
return SeekNum;
}
//---------------------------------------------------------------------------
int __fastcall TForm1::WriteRecord()
{
AnsiString Record;
AnsiString TmpFie;
Table1->First();
while (!Table1->Eof)
{
Record="";
for (int i=0;i<FieldNum;i++)
{
TmpFie="";
TmpFie=Table1->FieldByName(FieName)->AsString;
fwrite(&amp;TmpFie,FieLength,1,fp);
}
Table1->Next();
}
return ((ftell(fp)-SeekNum)/ RecordLength);
}
//----------------------------------------------------------------------------
int __fastcall TForm1::ReadRecord()
{
fclose(fp);
fp=fopen(SaveDialog1->FileName.c_str(),"rb+");
fseek(fp,SeekNum,0);
int Counter;
AnsiString FieStr1[50];
while (!feof(fp))
{
for (int i=0;i<FieldNum;i++)
{
if(fread(&amp;FieStr1,FieLength,1,fp))
StringGrid1->Cells[i+1][Counter+1]=FieStr1;
else
break;
}
Counter=Counter+1;
}
return (ftell(fp)-SeekNum)/RecordLength;

}
//----------------------------------------------------------------------------
void __fastcall TForm1::RefreshGrid()
{
StringGrid1->ColCount=FieldNum+1;
StringGrid1->RowCount=RecordNum+2;
StringGrid1->FixedRows=1;
StringGrid1->FixedCols=1;
StringGrid1->ColWidths[0]=12;
for (int i=0;i<FieldNum;i++)
{
StringGrid1->Cells[i+1][0]=FieName1;
StringGrid1->ColWidths[i+1]=40+FieLength*2;
}
}
//----------------------------------------------------------------------------
int __fastcall TForm1::First()
{
fseek(fp,SeekNum,0);
return 1;
}
//---------------------------------------------------------------------------
int __fastcall TForm1::Last()
{
fseek(fp,-0,2);
return (ftell(fp)-SeekNum)/RecordLength;
}
//---------------------------------------------------------------------------
int __fastcall TForm1::Next()
{
if(!fseek(fp,RecordLength,1)) return -1;
else
return ((ftell(fp)-SeekNum)/RecordLength);
}
//---------------------------------------------------------------------------
int __fastcall TForm1::Append()
{
fseek(fp,sizeof(int),0);
RecordNum=RecordNum+1;
fwrite(&amp;RecordNum,sizeof(int),1,fp);
fseek(fp,-0,2);
for (int i=0;i<FieldNum;i++)
{
fwrite(&amp;FieStr,FieLength,1,fp);
}
return (ftell(fp)-SeekNum)/RecordLength;
}
//---------------------------------------------------------------------------
int __fastcall TForm1::Insert()
{
}
//---------------------------------------------------------------------------
int __fastcall TForm1::Delete()
{
}
//---------------------------------------------------------------------------
int __fastcall TForm1::Edit()
{
}
//---------------------------------------------------------------------------
int __fastcall TForm1::Local()
{
}
//---------------------------------------------------------------------------
int __fastcall TForm1::Find()
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N1Click(TObject *Sender)
{
OpenDialog1->Filter="Paradox 7.0 files(*.DB)|*.DB|Any file(*.*)|*.*";
OpenDialog1->Title="请选择要转换的文件";
OpenDialog1->Execute();
if(FileExists(OpenDialog1->FileName)&amp;&amp;(OpenDialog1->FileName!=""))
{
Table1->Active=false;
Table1->DatabaseName=ExtractFilePath(OpenDialog1->FileName);
Table1->TableName=OpenDialog1->FileName;
Table1->Active=true;
GetDBFieldNum();
GetRecordNum();
GetFieldInf();
N3Click(NULL);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N3Click(TObject *Sender)
{
SaveDialog1->Filter="Binary file (*.Dat)|*.Dat";
SaveDialog1->Title="保存到文件";
if(SaveDialog1->Execute()&amp;&amp;(SaveDialog1->FileName!=""))
{
if ((fp=fopen(SaveDialog1->FileName.c_str(),"wb+"))!=NULL)
WriteFileHead();
WriteRecord();
ReadFileHead();
RefreshGrid();
ReadRecord();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::X1Click(TObject *Sender)
{
Table1->Active=false;
Form1->Close();
}
//---------------------------------------------------------------------------

上面的代码用到的全局变量如下:
FILE *fp;
int FieldNum,RecordNum,RecordLength;
AnsiString FieStr[50];
AnsiString FieName[50],FieName1[50];
AnsiString FieType[50];
int FieLength[50];
int SeekNum;
 
使用一个定长的struct比较方便。
打开使用fopen(fn,"rb")
读取使用fread
写使用fwrite
读写都每次读取一个struct的长度。
 
楼主,我上个学期刚好用CB帮宿舍哥们写了个这玩意,不知道你要不要
代码全给你,给我你的邮箱,我发给你
有用就给分哦,嘿嘿[:D] 看我的分那么底,急啊
 
fstream 流也很方便呀
fstream fio("c://fname", ios::in|ios::out|ios::|binary);
fio.write()
fio.read()
fio.seekg()
fio.seekp()
都可用呀
 
后退
顶部