请教关于文件中不同数据结构的读取问题(75分)

  • 主题发起人 主题发起人 cdvoice415
  • 开始时间 开始时间
C

cdvoice415

Unregistered / Unconfirmed
GUEST, unregistred user!
文件里的存入结构如下:
结构一(struct a)(1 个)
结构二(struct b)(n 个)个数不定的
再存入一个段结束符
用的是fputc(250,fp)(不知道用什么比较好)
以上为一个段
然后再重复上面的方法存入数据
一个文件里面有n个这样的段
现在不知道怎样读出
首先因为存入结构的多样,试过一些循环都不正确
其次是对文件读取的不熟悉,对文件指针的运作不是很清楚。
请教大侠!在11月前要完成的555
thx very much
 
看你的意思,难道要用C语言读?
思路:
1.读取 Struct a
2.读取1Byte判断是不是250,如果是,则转到1
3.让文件指针向回走一个字节的长度
4.读取 Struct b
5.如果已到达文件尾,则退出;否则转到2
 
是否可以知道STRUCT 2的个数?
 
type
TStruct1=record
.... // 假设全是简单类型
end;

TStruct2=record
.... // 假设全是简单类型
end;

TStruct2Arr = array of TSTruct2;
TStruct3=record
struct1: TStruct1;
struct2: TStruct2Arr;
end;
TStruct3Arr = array of TSTruct3;
var
Data: TStruct3Arr;
fileid, cnt1, cnt2: Integer;
endchar: char;
begin
fileid := fileopen(filename, fmOpenRead or fmShareDenyNone);
cnt1 := 1;
cnt2 := 1;
repeat
setlength(data, cnt1);
fileread(fileid, data[cnt1-1].struct1.firstfield, sizeof(TStruct1));
// 读入struct1
repeat
setlength(data[cnt1-1].struct2, cnt2);
fileread(fileid, data[cnt1-1].struct2[cnt2-1].firstfield, sizeof(TStruct2));
// 读入struct2;
inc(cnt2);
fileread(fileid, endchar, 1);
if endchar<>段结束符 then
fileseek(fileid, -1, 1);
until endchar=段结束符;
inc(cnt1);
if fileread(fileid, endchar, 1)>0 then
// 判断文件读完了吗
fileseek(fileid, -1, 1)
else
break;
until false;
fileclose(fileid);

end;
 
我觉得如果如下面这样的文件组织结构, 读起来会方便多:
段个数|struct1|struct2个数|struct2|struct2|...|struct1|struct2个数|struct2....
 
很感谢pearl大侠的指教
不过我用的是bcb,需要c语言编程
所以这个用pascal写的程序看不太明白^_^
而且没有存入struct的个数是因为不可能在运行前知道确切个数
否则当然是好做的。
不知道这位大侠知不知道用c语言怎么编写呢?
谢谢!!
 
其实实际上要存入三种struct
后面两种struct的数目都不知道
并且要用两种结束符号分开
所以先试试存入两种struct来读一读先^_^

struct ChPoint//第二种结构
{
unsigned char x1;
unsigned char y1;
unsigned char r;
unsigned char Edgex1;
unsigned char Edgey1;
unsigned char Edgex2;
unsigned char Edgey2;
unsigned char Ptype;
unsigned char Pspeed;
int squen;
} ;
struct StrokeHead
{
int InterTime;
int StrSort;
int StrType;
int Sequen;
int Component;
} ;

//我自己试过的结构
if(fpc!=NULL)
{
fread(&amp;headone,sizeof(struct StrokeHead),1,fpc);
while(!feof(fpc))
{
Jend=int (fgetc(fpc));
if(Jend!=250)
{
fseek(fpc,-sizeof(char),1);
fread(&amp;ttry,sizeof(struct ChPoint),1,fpc);
int a1s=ttry.x1;
int b1s=ttry.y1;
int c1s=ttry.Edgex1;
int d1s=ttry.Edgey1;
int e1s=ttry.Edgex2;
int f1s=ttry.Edgey2;
int g1=ttry.r;

RichEdit2->Lines->Append(IntToStr(a1s)+","+IntToStr(b1s)+","+IntToStr(c1s)+","+IntToStr(d1s)+","+IntToStr(e1s)+","+IntToStr(f1s));
Image2->Canvas->Pen->Color=clBlack;
//这里进行数据处理
Application->ProcessMessages();
Sleep(30);
int a1s=0;
int b1s=0;
int c1s=0;
int d1s=0;
int e1s=0;
int f1s=0;
int g1=0;

}

}
}

else
ShowMessage("打开文件失败");
 
c就更好读了!
定义3个struct就可以了
 
谢谢二位帮忙
 
后退
顶部