MFC读取文件的问题(主要是CString问题)

CFileDialogfileDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTI... CFileDialog fileDlg( TRUE, NULL, NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT | OFN_FILEMUSTEXIST,
(LPCTSTR)_TEXT("All Files (*.*)|*.*|"), NULL );
if( fileDlg.DoModal() == IDOK )
{
CString tempfilename = fileDlg.GetPathName();
CStdioFile tempfile( tempfilename, CFile::modeRead );
CString str;
int tempint[10];
CString tempstr[5];
for( int i = 0 ; i < 10 ; i += 2 )
{
tempfile.ReadString( str );
swscanf( str , _T("%6d%6d%20s"), &tempint[i], &tempint[i+1], tempstr[i/2] );
}
tempfile.Close();
}
程序运行完确定后会出现
1270910759.exe 中的 0x74170000 处有未经处理的异常: 0xC0000005: Access violation
错误提示。经我上网查,是swscanf中%s的问题。请教大神如何处理。
同时,每次swscanf之后,tempstr数组所有元素都被赋值,就是swscanf作用于所有tempstr元素上,是的数组中的元素是一个值。请教大神有没有其他方法。
还有,我试过网上的sscanf的方法,其中第一个CString参数需要显式转型,为(LPSTR)(LPCTSTR)str。但是转型之后只剩首字母。请教大神如何正确将CString转换为 const char*。可否麻烦各位大神列出有效可靠的CString与其他类型的转换。
展开
 我来答
mylxhccshhp
2014-02-18 · TA获得超过136个赞
知道小有建树答主
回答量:79
采纳率:0%
帮助的人:125万
展开全部

你既然都用了字符串泛型宏_T()了

那就用_stscanf_s吧,这样不管是UNICODE还是多字节字符集都可以

还有你scanf里用CString是肯定不行的 scanf是向一个缓冲区中填东西

CString在空构造下显然是不会分配内存的,内部的指针是NULL,属于禁止访问内存区,

肯定报Access violation错误;
应该用TCHAR buff[21]

你可以这样:

CString str;
int tempint[10];
CString tempstr[5];
TCHAR buff[21];
for( int i = 0 ; i < 10 ; i += 2 )
{
    tempfile.ReadString( str );
    _stscanf_s( str , _T("%6d%6d%20s"), &tempint[i], &tempint[i+1], buff, _countof(buff));
    tempstr[i/2] = buff;
}
wangpaishi
2014-02-17 · TA获得超过570个赞
知道小有建树答主
回答量:932
采纳率:52%
帮助的人:757万
展开全部
LPSTR 是 STR

LPCTSTR 是 TSTR

你的字符编码选的是Unicode吗?

swscanf
功能:
用于处理宽字符字符串,和sscanf功能相同

所以判断你的是宽字符了

那么,你把 (LPSTR)(LPCTSTR)str 肯定有问题,宽字符被强制转换为“窄”字符了,wchar -> char

CString tempstr[5];

使用tempstr[i/2],不对,你应该至少先把tempstr[i/2]设置一个Capacity之后,再GetBuffer用到这里
否则你还是换成 TCHAR [5][21];吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
司彤苼2D
2014-02-17
知道答主
回答量:29
采纳率:0%
帮助的人:8.2万
展开全部
关于CString的转换CString 的format成员函数不知道行不行,另外,自己总结的一个CString转Flaot/double:

double
a;

CString
B;

a=_tstof(B);
经过vs2010调试
追问
format成员函数不是讲对应的CString赋值吗?也就是把我的str改变了,而tempstr数组元素未变。是这样的吧?。
您的double a是双精度类型。我的问题是针对字符串的问题。谢谢您的关注。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2014-02-17
展开全部
int tempint[10];
&tempint[i+1]数组不都越界了么
追问
tempint[0...9]。我每次i+2,最后一次i=8循环,i+1=9,应该是没越界的。
追答
嗯,不好意思,看错了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式