请教文件操作类CFile的一个问题

ryrx 2005-04-15 09:52:22
CFile类的函数:

UINT Read( void* lpBuf, UINT nCount );
void Write( const void* lpBuf, UINT nCount );

  参数lpBuf为指向存放数据的缓存的指针,nCount为要读入或写入的字节数,Read()返回的为实际读取的字节数。

请问“参数lpBuf为指向存放数据的缓存的指针”,这个缓存自己如何定义啊?
...全文
170 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ryrx 2005-04-16
  • 打赏
  • 举报
回复
没人理了,up
ryrx 2005-04-15
  • 打赏
  • 举报
回复
我现在把有关SCORE结构体的内容改为:

SCORE data; //SCOR是自定义的结构体,声明见头文件ListBoxDlg.h
data.name=m_strName; //给结构体各项赋值
data.score1=m_nScore1;
data.score2=m_nScore2;
data.score3=m_nScore3;

m_List.SetItemDataPtr(nIndex,new SCORE(data));//将取得的索引号与结构体数据相关联


//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++ 将数据写入磁盘文件 +++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

CFile creatFile;
CFileException creatFileException;
if (!creatFile.Open("BoxRecord.txt",CFile::modeCreate|CFile::modeReadWrite,&creatFileException))
{
MessageBox("文件创建失败!");
return;
}

creatFile.Write(&data,sizeof(data));
creatFile.Close();
MessageBox("文件创建成功!");

————————————————————————————————
查看所建立的文件内容仍旧是乱码,但是在用如下的读取程序从文件读到结构体时,可以显示:

void CListBoxDlg::OnRead() //读取按钮按下时的响应程序
{
// TODO: Add your control notification handler code here

SCORE data;
CFile readFile;
CFileException creatFileException;
if (!readFile.Open("BoxRecord.txt",CFile::modeRead,&creatFileException))
{
MessageBox("文件读取失败!");
return;
}

readFile.Read(&data,sizeof(data)); //文件内容读入结构体
readFile.Close();

//将结构体内容与控件相关联:
m_strName = data.name;
int nIndex = m_List.AddString(m_strName);
m_List.SetItemDataPtr(nIndex,new SCORE(data));//将取得的索引号与结构体数据相关联


MessageBox("文件读取成功!");

}

——————————————————————————————————————
按下读取按钮后,可以将文件的内容读出,其中
m_nScore1
m_nScore2
m_nScore3
的值都显示正确,但是m_strName显示为空
难道语句:
m_strName = data.name;有问题?
并且在退出应用程序后,会发生内存操作错误
xift_2008 2005-04-15
  • 打赏
  • 举报
回复
creatFile.Write(data->name,strlen(data->name));
creatFile.Write(data->score1,strlen(data->score1));
...

如果楼主想使用
creatFile.Write(data,sizeof(data));
必须使用序列化写入文件。
bonehate 2005-04-15
  • 打赏
  • 举报
回复
date是结构,你打的是指针值.
应当分别打.
CString s;
s=data->name=m_strName; //给结构体各项赋值
s=s+(转串) data->score1=m_nScore1;
data->score2=m_nScore2;
data->score3

creatFile.Write(s,sizeof(s));
ryrx 2005-04-15
  • 打赏
  • 举报
回复
以下程序是一个函数,当按下“添加记录”时响应的程序:

void CListBoxDlg::OnDataAdd() //ADD按钮的响应函数
{
// TODO: Add your control notification handler code here

UpdateData(TRUE); //控件数据传向相关变量;

if (m_strName.IsEmpty())
{
MessageBox("姓名不能为空!");
return;
}

m_strName.TrimLeft(); //去除左边空格
m_strName.TrimRight(); //去除右边空格
if ((m_List.FindString(-1,m_strName))!=LB_ERR) //查找有无重复项
{
MessageBox("列表框中已经有相同姓名,不能添加!");
return;
}

int nIndex = m_List.AddString(m_strName); //正式添加列表项,并取得索引号

SCORE *data=new SCORE; //SCOR是自定义的结构体,声明见头文件ListBoxDlg.h
data->name=m_strName; //给结构体各项赋值
data->score1=m_nScore1;
data->score2=m_nScore2;
data->score3=m_nScore3;

m_List.SetItemDataPtr(nIndex,data); //将取得的索引号与结构体数据相关联


//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++ 将数据写入磁盘文件 +++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

CFile creatFile;
CFileException creatFileException;
if (!creatFile.Open("BoxRecord.txt",CFile::modeCreate|CFile::modeReadWrite,&creatFileException))
{
MessageBox("文件创建失败!");
return;
}

creatFile.Write(data,sizeof(data));
creatFile.Close();
MessageBox("文件创建成功!");
}

————————————————————————————————————————————
运行后,结构体data的数据如下:
m_strName="测试名称"
m_nScore1=100
m_nScore2=100
m_nScore3=100

按下ADD按钮,提示文件创建成功,去看此文件,内容为“?B”
请问怎么回事?为什么不是:测试名称100100100
Featured 2005-04-15
  • 打赏
  • 举报
回复
当然会的。放心好了。
ryrx 2005-04-15
  • 打赏
  • 举报
回复
谢谢大家,再请问如果是结构体,写入文件后,再读出来的数据重新放入结构体,数据会自动对应吗?
菜牛 2005-04-15
  • 打赏
  • 举报
回复
所谓“缓存”,就是一块内存区域,可以是一个变量(基本数据类型变量、结构变量、类变量、各种自定义变量),也可以是动态分配的一块内存区域。
cnwolf 2005-04-15
  • 打赏
  • 举报
回复
自己分配一段连续的空间,可以在栈上,也可以在堆上
晨星 2005-04-15
  • 打赏
  • 举报
回复
总之就是一块空间,比如可以直接从二进制文件中读一个double进来:

double d;
file.Read(&d, sizeof(d));

当然,前提是当时这个文件的这个位置上原来也就是写入了一个double,否则谁知到读出来的double等于几。
file.Write(&d, sizeof(d));

也可以把一整个结构体写入读出,但这样的程序可能会产生文件在需要跨平台共享的时候可能有问题,因为非字符数据有字节顺序问题,结构体有字节对齐问题。
晨星 2005-04-15
  • 打赏
  • 举报
回复
就是一块可以存放字符内容的空间呗。

比如:
CFile file;
file.Open(.....);

char buffer[1024];
int len = file.Read(buffer, sizeof(buffer));
fisker0303 2005-04-15
  • 打赏
  • 举报
回复
怎么定义都行,char、结构体...
ryrx 2005-04-15
  • 打赏
  • 举报
回复
ok,读写文件的问题,我改用CArchive类的WriteString()和ReadString()函数解决了。

最后一个问题:
如何获得打开文件的文件指针位置?
Seek()函数是用来定位的,哪个函数用来获取当前位置?
xift_2008 2005-04-15
  • 打赏
  • 举报
回复
复杂的结构体最好用序列化读写比较合适。
晨星 2005-04-15
  • 打赏
  • 举报
回复
CString类中至少有个buffer指针,而且很可能拥有虚汗数,也就是拥有需表指针。
使用Read/Write读写结构体,最好只是那样直接操作简单类型或简单类型的数组。
晨星 2005-04-15
  • 打赏
  • 举报
回复
不要直接ReadWrite复杂的类对象和拥有指针的结构体,甚至拥有虚汗数表指针的对象。危险。
Write就是整个结构体里的内容全部作为字节序列写出去,而不管其意义,而指针通常它本身根本没什么意义,它指向的内容才有意义。
而指针只能是运行时分配,更不能从文件中读进来。
ryrx 2005-04-15
  • 打赏
  • 举报
回复
补充一下:
m_nScore1 属于 int
m_nScore2 属于 int
m_nScore3 属于 int
m_strName 属于 CString
SCORE结构体的成员属性与上面的变量一一对应

那read出来的数据会是什么类型?

16,471

社区成员

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

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

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