请教:我的VC++代码中关于文件读写的问题

llyp2000 2004-08-01 09:11:11


为了读写一些数据,我定义了如下结构:
struct{
BYTE length1;
BYTE length2;
WORD length3;
WORD length4;
CString name;
}PROJECTA

现在我需要把这些相关数据写到一个文件(C:\P1.ndt)中去,有如下函数:
SaveProject(LPCTSTR lpszPathName)//lpszPathName为C:\P1.ndt
{
CFile file;
CFileException fe;

// 打开文件
if (!file.Open(lpszPathName, CFile::modeCreate |
CFile::modeReadWrite | CFile::shareExclusive, &fe))
{
// 失败
ReportSaveLoadException(lpszPathName, &fe,
TRUE, AFX_IDP_INVALID_FILENAME);

// 返回
return ;
}

//结构的对象
PROJECTA project_a;
CString Pathname = "d:\\get\\igma";
//保存数据
project_a.length1 = (BYTE) 24;
project_a.length2 = (BYTE) Pathname.GetLength());
project_a.length3 = (WORD) 880;
project_a.length4 = (WORD) 980;
project_a.name = Pathname;

//写文件
file.Write((LPSTR)&project_a, 6+Pathname.GetLength());
//关闭文件
file.Close();
return;
}

为了读出文件(C:\P1.ndt)中的数据又定义了如下读文件函数:
ReadProject(LPCTSTR lpszPathName)//lpszPathName为C:\P1.ndt
{
//结构的对象
PROJECTA project_a;
CFile file;
CFileException fe;
DWORD dwFileSize;//文件大小

// 打开文件
if (!file.Open(lpszPathName, CFile::modeRead | CFile::modeReadWrite, &fe))
{
// 失败
ReportSaveLoadException(lpszPathName, &fe,
TRUE, AFX_IDP_INVALID_FILENAME);

// 返回
return ;
}

//读文件
if ( file.Read((LPSTR)&project_a, dwFileSize) != dwFileSize )
{
// 大小不对,返回。
return ;
}
//读取数据
int L1 = project_a.length1;
int L2 = project_a.length2;
int L3 = project_a.length3;
int L4 = project_a.length4;
CString Pathname = project_a.name;

//关闭文件
file.Close();
return;
}

但是这样读文件的话执行到int L3 = project_a.length3就会出错。如果改成如下代码:
ReadProject(LPCTSTR lpszPathName)//lpszPathName为C:\P1.ndt
{
//结构的对象
PROJECTA project_a;
CFile file;
CFileException fe;
DWORD dwFileSize;//文件大小

// 打开文件
if (!file.Open(lpszPathName, CFile::modeRead | CFile::modeReadWrite, &fe))
{
// 失败
ReportSaveLoadException(lpszPathName, &fe,
TRUE, AFX_IDP_INVALID_FILENAME);

// 返回
return ;
}

//读文件
if ( file.Read((LPSTR)&project_a, 6) != 6 )
{
// 大小不对,返回。
return ;
}
//读取数据
int L1 = project_a.length1;
int L2 = project_a.length2;
int L3 = project_a.length3;
int L4 = project_a.length4;
if ( file.Read((LPSTR)project_a.name.GetBuffer(L2), dwFileSize-6) != dwFileSize-6)
{
// 大小不对,返回NULL。
return NULL;
}
CString Pathname = project_a.name;

//关闭文件
file.Close();
return;
}
此时返回的Pathname并不是我们保存的值"d:\\get\\igma",而是乱码一堆。

请教高手们,到底是哪里出了问题呢?帮我把把脉~~~
有点长,烦请务必帮忙。多谢!
...全文
128 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyelf 2004-08-01
  • 打赏
  • 举报
回复
不要使用CString


struct{
BYTE length1;
BYTE length2;
WORD length3;
WORD length4;
char name[MAX_PATH];//
}PROJECTA
enoloo 2004-08-01
  • 打赏
  • 举报
回复
CString对象占用的大小和str.GetLength()是不一样的。可以用记事本打开文件看看。

建议用CStdioFile.

16,548

社区成员

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

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

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