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与其他类型的转换。 展开
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与其他类型的转换。 展开
展开全部
你既然都用了字符串泛型宏_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;
}
展开全部
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];吧
LPCTSTR 是 TSTR
你的字符编码选的是Unicode吗?
swscanf
功能:
用于处理宽字符字符串,和sscanf功能相同
所以判断你的是宽字符了
那么,你把 (LPSTR)(LPCTSTR)str 肯定有问题,宽字符被强制转换为“窄”字符了,wchar -> char
CString tempstr[5];
使用tempstr[i/2],不对,你应该至少先把tempstr[i/2]设置一个Capacity之后,再GetBuffer用到这里
否则你还是换成 TCHAR [5][21];吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
关于CString的转换CString 的format成员函数不知道行不行,另外,自己总结的一个CString转Flaot/double:
double
a;
CString
B;
a=_tstof(B);
经过vs2010调试
double
a;
CString
B;
a=_tstof(B);
经过vs2010调试
追问
format成员函数不是讲对应的CString赋值吗?也就是把我的str改变了,而tempstr数组元素未变。是这样的吧?。
您的double a是双精度类型。我的问题是针对字符串的问题。谢谢您的关注。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-02-17
展开全部
int tempint[10];
&tempint[i+1]数组不都越界了么
&tempint[i+1]数组不都越界了么
追问
tempint[0...9]。我每次i+2,最后一次i=8循环,i+1=9,应该是没越界的。
追答
嗯,不好意思,看错了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询