有关CFile类读写文件的问题(HELP!SOS!)

greenhornet 2004-04-12 10:20:03
typedef struct Table
{
int ID;
CString Name;
int FieldsNumber;
Table * pTable;
}TableList;
TableList *headT,*pT,*rT;//表头指针,当前指针,表尾指针
在内存中经过前几步操作,已经建立了一个链表,每个节点都是TableList型的,现在我要将其写入文件,还要将其从文件中顺序读出,并且要重新形成一个链表,请问我该怎么办呢?多谢了!
...全文
93 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kmlin 2004-04-13
  • 打赏
  • 举报
回复
重新定义结构体:
typedef struct Table
{
int ID;
int NameLen;
CString Name;
int FieldsNumber;
Table * pTable;
}TableList;
其中NameLen = Name.Getlength();
然后,把ID,NameLen,FieldsNumber,Name的值写入一个buffer,(使用sprintf函数)
按照一个结构体一行写入文件即可。
读时同理(使用sscanf函数)。
greenhornet 2004-04-13
  • 打赏
  • 举报
回复
这个是写文件的程序,大家帮忙看看吧,哪里出了错误啊?
void CMyDBMSView::OnMenuDdlSaveTable()
{
// TODO: Add your command handler code here
CFileDialog TSdlg(FALSE,"tbl","*.tbl");
if(TSdlg.DoModal ()==IDOK)
{
CFile TSfile;
VERIFY(TSfile.Open (TSdlg.GetPathName (),CFile::modeWrite|CFile::modeCreate));
TableList *ptrST;
ptrST=g_headT;
int IntTIDLength;
int IntTNLength;
int IntTFNLength;
CString TID;//Table ID
CString TFN;//Table FieldsNumber
while (ptrST!=NULL)
{
IntTIDLength=sizeof(ptrST->ID )+1;
TSfile.Write (&IntTIDLength,sizeof(IntTIDLength));
TID.Format ("%d",ptrST->ID );
TSfile.Write (TID ,IntTIDLength);
IntTNLength=ptrST->Name.GetLength ()+1;
TSfile.Write (&IntTNLength,sizeof(IntTNLength));
TSfile.Write (ptrST->Name ,IntTNLength);
IntTFNLength=sizeof(ptrST->FieldsNumber )+1;
TSfile.Write (&IntTFNLength,sizeof(IntTFNLength));
TFN.Format ("%d",ptrST->FieldsNumber );
TSfile.Write (TFN ,IntTNLength);
ptrST=ptrST->pTable ;
}
TSfile.Close ();
MessageBox("数据表文件成功保存!");
}
}
greenhornet 2004-04-13
  • 打赏
  • 举报
回复
这是读文件的程序,然后将其链接成链表,但是只能顺利的读出第一个结点,第二个结点读出的内容就不正常了,为什么呢?
void CMyDBMSView::OnMenuDdlOpenTable()
{
// TODO: Add your command handler code here
CFileDialog Tdlg(TRUE,"tbl","*.tbl");
if(Tdlg.DoModal ()==IDOK)
{
CFile Tfile;
VERIFY(Tfile.Open (Tdlg.GetPathName (),CFile::modeRead));
TableList * ptrRT1;
ptrRT1=new TableList;
char * pstrID;
char * pstrName;
char * pstrField;
int IntTIDLength;
int IntTNLength;
int IntFNLength;
long LongFileLength;
long TmpFileLength=0;
LongFileLength=Tfile.GetLength ();
Tfile.Seek (TmpFileLength,CFile::begin );
while(TmpFileLength<LongFileLength)
{
//begin to read the ID
Tfile.Read (&IntTIDLength,sizeof(IntTIDLength)); pstrID=new char[IntTIDLength];
Tfile.Read (pstrID,IntTIDLength);
int TID;
TID=atoi(pstrID);
ptrRT1->ID =TID;
//begin to read the name
Tfile.Read (&IntTNLength,sizeof(IntTNLength)); pstrName=new char[IntTNLength];
Tfile.Read (pstrName,IntTNLength);
ptrRT1->Name =pstrName;
//begin to read the length
Tfile.Read (&IntFNLength,sizeof(IntFNLength)); pstrField=new char[IntFNLength];
Tfile.Read (pstrField,IntFNLength);
int TFN;
TFN=atoi(pstrField);
ptrRT1->FieldsNumber =TFN;
//end of get values to node
//begin to link the tablelist;
if(headT==NULL)
headT=ptrRT1;
else
rT->pTable =ptrRT1;
rT=ptrRT1;
if(rT!=NULL)
rT->pTable =NULL;
g_headT=headT;
ptrRT1=NULL;
ptrRT1=new TableList;
TmpFileLength=Tfile.GetPosition ();
}
Tfile.Close ();
}
}
greenhornet 2004-04-12
  • 打赏
  • 举报
回复
要是用CFile的write和read要怎么能够实现呢?大侠们帮个忙吧
薛定谔之死猫 2004-04-12
  • 打赏
  • 举报
回复
你可以仿照MFC的对象序列化,不过可以直接顺序存入,再取出
薛定谔之死猫 2004-04-12
  • 打赏
  • 举报
回复
对象序列化麻,按顺序做就好了

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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