sscanf 第一个参数问题

justdothat126com 2011-07-07 03:43:36
void CwuziqiView::OnOpen()
{
// TODO: 在此添加命令处理程序代码
CFileDialog dlg(TRUE,_T("wzq"),NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("(*.WZQ)|*.wzq|All Files|*.*||"),this);
if(dlg.DoModal()==IDOK)
dlg.GetFileName();
else
return;
CString str;
int i,j,m;
CStdioFile file;

if(file.Open(dlg.GetFileName(),CFile::modeRead)==0)
{
AfxMessageBox(_T("save error!"));
return;
}
CArchive ar(&file,CArchive::load);
for(i=0;i<19;i++)

for(j=0;j<19;j++)
{
ar.ReadString(str);
sscanf((char*)str.GetBuffer(),"%d",&m); //疑问
if(m==-1)

wzq[i][j]=-1;

if(m==0)

wzq[i][j]=0;

if(m==1)

wzq[i][j]=1;
}
ar.ReadString(str);
sscanf((char*)str.GetBuffer(),"%d",&m);
if(m==1)
colorwhite=TRUE;
else
colorwhite=FALSE;
file.Close();
ar.Close();
Invalidate(FALSE);
}

这是一个五子棋游戏,打开存档的代码,
保存时是按数字保存的
通过file.WriteString(_T("-1\n")); file.WriteString(_T("0\n")); file.WriteString(_T("1\n"));

sscanf((char*)str.GetBuffer(),"%d",&m); 问题一定在这里 不过不知道怎么正确的处理第一个参数,
我这样写的结果是,棋盘上的数据全部被转换成棋盘上的第一个数据。

不知道如何处理第一个参数 希望前辈们说说你们的经验
...全文
304 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
mr_moon 2011-07-17
  • 打赏
  • 举报
回复
你是不是unicode的。
justdothat126com 2011-07-07
  • 打赏
  • 举报
回复
SOS
justdothat126com 2011-07-07
  • 打赏
  • 举报
回复
我这是VS2010
sscanf((char*)str,"%d",&m); 这句会报错
“类型转换”: 无法从“CString”转换为“char *”
justdothat126com 2011-07-07
  • 打赏
  • 举报
回复
void CwuziqiView::OnSave()
{
// TODO: 在此添加命令处理程序代码
//设置保存的文件,后缀名wzq

CFileDialog dlg(FALSE,_T("wzq"),NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("(*.WZQ)|*.wzq|All Files|*.*||"),this);

//如果公共类对话框为确定

if(dlg.DoModal()==IDOK)

//获取文件名

dlg.GetFileName();

//否则,退出

else

return;

//字符串变量

CString str;

int i,j;



CStdioFile file;

//如果有问题,退出

if(file.Open(dlg.GetFileName(),CFile::modeCreate|CFile::modeWrite|CFile::typeText)==0)

{

AfxMessageBox(_T("save error!"));

return;

}

//循环把棋盘数组的值写进文件

for(i=0;i<19;i++)

for(j=0;j<19;j++)

{

if(wzq[i][j]==-1)

file.WriteString(_T("-1\n"));

if(wzq[i][j]==0)

file.WriteString(_T("0\n"));

if(wzq[i][j]==1)

file.WriteString(_T("1\n"));

}

//保存当前下棋颜色

if(colorwhite==TRUE)

file.WriteString(_T("1\n"));

else

file.WriteString(_T("0\n"));

//关闭文件

file.Close();

}


这里是保存的源代码,

我想读取出棋子所对应的数字,不过每次都是读同一行代码,不用GetBuffer也是这样 救命啊~
今晚又失眠 2011-07-07
  • 打赏
  • 举报
回复
这是我最近用到的:
char sValue[1024] = {0};
long nValue = 0;
sscanf(sValue,"%x",&nValue);

//如sValue为“0x0010”转换后nValue=0x10即为16
Eleven 2011-07-07
  • 打赏
  • 举报
回复
你利用CString的相关成员函数就可以CString::Tokenize()/Find/Mid/Left/Right()等
shiyunqiang 2011-07-07
  • 打赏
  • 举报
回复
如果每一行有多个数字可以尝试使用下面的格式:

如每行存储的数据为:10 11 12 13 14 15

读取:
sscanf((char*)str, "%d %d %d %d %d", &x, &y, &z, &u, &v);
shiyunqiang 2011-07-07
  • 打赏
  • 举报
回复
sscanf((char*)str.GetBuffer(),"%d",&m);

你这样用每次读取的都是同一个数字。
shiyunqiang 2011-07-07
  • 打赏
  • 举报
回复
GetBuffer返回一个可以供调用者写入的内存,并且,可以给定大小。
justdothat126com 2011-07-07
  • 打赏
  • 举报
回复
直接用也不行,str和str.GetBuffer(),有啥区别。。
shiyunqiang 2011-07-07
  • 打赏
  • 举报
回复
干嘛要使用str.GetBuffer(),直接使用str试试。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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