求高人帮助,有关文件的读取和指针操作问题?

amiao 2003-10-15 12:28:35
求高人帮助,为什么读出来的cpyfilelist是空啊?
解决了问题,再加分......

//记录结构件-----------------------------------------------------------------
typedef struct
{
char oldver[10];
char newver[10];
int cpyfilenum;
PBuf cpyfilelist;
int delfilenum;
char datetime[20];
char netpath[200];
}FileHistory;
typedef FileHistory *PFileHistory;


//写入文件-------------------------------------------------------------------
TList *recordlist;

//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
PFileHistory pszBuffer = new FileHistory;
AnsiString sPath = ExtractFilePath(Application->ExeName) + "UpdMng.dat";

StrCopy(pszBuffer->oldver, "1.0.0003");
StrCopy(pszBuffer->newver, "1.0.0004");
StrCopy(pszBuffer->datetime, AnsiString(Now()).c_str());
StrCopy(pszBuffer->netpath, "F:\\share\\");

pszBuffer->delfilenum = 3;
pszBuffer->cpyfilenum = 3;

pszBuffer->cpyfilelist = new Buf[pszBuffer->cpyfilenum];
AnsiString sTemp;
for (int i=0; i<pszBuffer->cpyfilenum; i++)
{
sTemp = "F:\\share\\" + AnsiString(i+1) + ".txt";
StrCopy(pszBuffer->cpyfilelist[i], sTemp.c_str());
}

int iFileHandle = FileOpen(sPath, fmOpenReadWrite);
if (iFileHandle != -1)
{
int iSize = sizeof(FileHistory) + pszBuffer->cpyfilenum * MaxLen;
FileSeek(iFileHandle, 0, 2);
FileWrite(iFileHandle, (char *)pszBuffer, iSize);
}
FileClose(iFileHandle);

delete [] pszBuffer->cpyfilelist;
delete [] pszBuffer;
}
//---------------------------------------------------------------------------


//从文件读取-----------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
PFileHistory pszBuffer = new FileHistory;
AnsiString sPath = ExtractFilePath(Application->ExeName) + "UpdMng.dat";

int iFileHandle = FileOpen(sPath, fmOpenRead);
if (iFileHandle != -1)
{
int iFileLength = FileSeek(iFileHandle, 0, 2);
FileSeek(iFileHandle, 0, 0);

PFileHistory pTemp;
int iSize = iFileLength;
int StructSize;
while (iSize >= sizeof(FileHistory))
{
pTemp = new FileHistory;
pTemp->cpyfilelist = new Buf[3];
StructSize = sizeof(FileHistory) + 3*MaxLen;
iSize = FileRead(iFileHandle, (char *)pTemp, StructSize);
if (iSize > 0) recordlist->Add(pTemp);
else
{
delete [] pTemp->cpyfilelist;
delete [] pTemp;
}
}
}
FileClose(iFileHandle);

if (recordlist->Count > 0)
{
Memo1->Lines->Clear();
int j;
for (int i=0; i<recordlist->Count; i++)
{
pszBuffer = (FileHistory *)recordlist->Items[i];

Memo1->Lines->Add(pszBuffer->oldver);
Memo1->Lines->Add(pszBuffer->newver);
Memo1->Lines->Add(pszBuffer->cpyfilenum);
Memo1->Lines->Add(pszBuffer->delfilenum);
Memo1->Lines->Add(pszBuffer->netpath);
Memo1->Lines->Add(pszBuffer->datetime);

for (j=0; j<pszBuffer->cpyfilenum; j++)
Memo1->Lines->Add(pszBuffer->cpyfilelist[j]);

Memo1->Lines->Add("--------------------------------------");
}
}

delete [] pszBuffer;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
recordlist = new TList;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
PFileHistory temp = new FileHistory;
for (int i=0; i<recordlist->Count; i++)
{
temp = (PFileHistory) recordlist->Items[i];
delete [] temp;
}
delete recordlist;
}
//---------------------------------------------------------------------------

...全文
30 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yjy1001 2003-10-15
  • 打赏
  • 举报
回复
typedef char Buf[MaxLen];?
无法理解为什么这么定义

有看到一个五星的了 帅……! 不过也证实了 信誉跟等级没有联系(新来 什么都不懂)
amiao 2003-10-15
  • 打赏
  • 举报
回复
Buf的定义我想应该没有问题,cpyfilelist主要是第一条读不出,后面两条有时能读出
真搞不懂,楼上的五星上将,帮帮忙吧!我一直是搞Delphi的,近来公司要用BCB,还没入门呢
Wingsun 2003-10-15
  • 打赏
  • 举报
回复
BUF定义不对吧!
怎么是typedef char Buf[MaxLen];?
amiao 2003-10-15
  • 打赏
  • 举报
回复
更正。。。

//记录结构件-----------------------------------------------------------------
#define MaxLen 200
typedef char Buf[MaxLen];
typedef Buf *PBuf;

typedef struct
{
char oldver[10];
char newver[10];
int cpyfilenum;
PBuf cpyfilelist;
int delfilenum;
char datetime[20];
char netpath[200];
}FileHistory;
typedef FileHistory *PFileHistory;
amiao 2003-10-15
  • 打赏
  • 举报
回复
我都是一条条写入、读出的了,测试通过,放分了。。。

void __fastcall TForm1::Button1Click(TObject *Sender)
{
// ClearAllotList(recordlist);
AnsiString sPath = ExtractFilePath(Application->ExeName) + "UpdMng.dat";

int iFileHandle = FileOpen(sPath, fmOpenRead);
if (iFileHandle != -1)
{
FileSeek(iFileHandle, 0, 0);

PFileHistory pTemp;
int iSize = sizeof(pTemp->oldver);
while (iSize >= sizeof(pTemp->oldver))
{
pTemp = new FileHistory;

//从文件中读取记录
iSize = FileRead(iFileHandle, (char *)pTemp->oldver, sizeof(pTemp->oldver));
if (iSize == 0) break;
FileRead(iFileHandle, (char *)pTemp->newver, sizeof(pTemp->newver));
FileRead(iFileHandle, (char *)&pTemp->cpyfilenum, sizeof(pTemp->cpyfilenum));
FileRead(iFileHandle, (char *)&pTemp->delfilenum, sizeof(pTemp->cpyfilenum));
FileRead(iFileHandle, (char *)pTemp->datetime, sizeof(pTemp->datetime));
FileRead(iFileHandle, (char *)pTemp->netpath, sizeof(pTemp->netpath));

if (pTemp->cpyfilenum != 0)
pTemp->cpyfilelist = new Buf[pTemp->cpyfilenum];
for (int i=0; i<pTemp->cpyfilenum; i++)
FileRead(iFileHandle, (char *)pTemp->cpyfilelist[i], MaxLen);
recordlist->Add(pTemp);
}
delete [] pTemp;
}
FileClose(iFileHandle);

if (recordlist->Count > 0)
{
Memo1->Lines->Clear();
int j;
PFileHistory pszBuffer = new FileHistory;
for (int i=0; i<recordlist->Count; i++)
{
pszBuffer = (FileHistory *)recordlist->Items[i];

Memo1->Lines->Add(pszBuffer->oldver);
Memo1->Lines->Add(pszBuffer->newver);
Memo1->Lines->Add(pszBuffer->cpyfilenum);
Memo1->Lines->Add(pszBuffer->delfilenum);
Memo1->Lines->Add(pszBuffer->netpath);
Memo1->Lines->Add(pszBuffer->datetime);

for (j=0; j<pszBuffer->cpyfilenum; j++)
Memo1->Lines->Add(pszBuffer->cpyfilelist[j]);

Memo1->Lines->Add("--------------------------------------");
}
delete [] pszBuffer;
}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
PFileHistory pszBuffer = new FileHistory;
AnsiString sPath = ExtractFilePath(Application->ExeName) + "UpdMng.dat";

StrCopy(pszBuffer->oldver, "1.0.0003");
StrCopy(pszBuffer->newver, "1.0.0004");
StrCopy(pszBuffer->datetime, AnsiString(Now()).c_str());
StrCopy(pszBuffer->netpath, "F:\\share\\");

pszBuffer->delfilenum = 3;
pszBuffer->cpyfilenum = 3;

pszBuffer->cpyfilelist = new Buf[pszBuffer->cpyfilenum];
AnsiString sTemp;
for (int i=0; i<pszBuffer->cpyfilenum; i++)
{
sTemp = "F:\\share\\" + AnsiString(i+1) + ".txt";
StrCopy(pszBuffer->cpyfilelist[i], sTemp.c_str());
}

int iFileHandle = FileOpen(sPath, fmOpenReadWrite);
if (iFileHandle != -1)
{
//移动到文件尾
FileSeek(iFileHandle, 0, 2);

//结构记录一笔笔写入文件
FileWrite(iFileHandle, (char *)pszBuffer->oldver, sizeof(pszBuffer->oldver));
FileWrite(iFileHandle, (char *)pszBuffer->newver, sizeof(pszBuffer->newver));
FileWrite(iFileHandle, (char *)&pszBuffer->cpyfilenum, sizeof(pszBuffer->cpyfilenum));
FileWrite(iFileHandle, (char *)&pszBuffer->delfilenum, sizeof(pszBuffer->delfilenum));
FileWrite(iFileHandle, (char *)pszBuffer->datetime, sizeof(pszBuffer->datetime));
FileWrite(iFileHandle, (char *)pszBuffer->netpath, sizeof(pszBuffer->netpath));
for (int i=0; i<pszBuffer->cpyfilenum; i++)
FileWrite(iFileHandle, (char *)pszBuffer->cpyfilelist[i], MaxLen);
}
FileClose(iFileHandle);

delete [] pszBuffer->cpyfilelist;
delete [] pszBuffer;
MessageBox(this->Handle, "Write data record to file success!", "hint", MB_OK+MB_ICONINFORMATION);
}
//---------------------------------------------------------------------------
jiangchun_xn 2003-10-15
  • 打赏
  • 举报
回复
char Buf[MaxLen];
char *PBuf;
zgoalh 2003-10-15
  • 打赏
  • 举报
回复
捧场ing... ...
amiao 2003-10-15
  • 打赏
  • 举报
回复
那么应该怎么定义?

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧