最近在做一个小程序,就是要读取文件进行数据解析,打开文件要使用fopen来实现。但是文件的路径中存在汉字,从而导致使用fopen打开改文件失败的问题,由于不经常使用,花了很久时间才解决了这个问题,于是想把该问题的解决方法记录下来。以下是两种实现方法:
(1)使用_wfopen来实现:
将获取的路径名和文件名的字符串(CString类型)转换为wchar_t类型,如:
CFileDialog dlg(TRUE, //TRUE为OPEN对话框,FALSE为SAVE AS对话框
NULL,
NULL,
OFN_HIDEREADONLY | OFN_FILEMUSTEXIST,
//文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,
//每种文件类型间用 | 分隔,末尾用 || 指明
// (LPCTSTR)_TEXT("JPG Files (*.jpg)|*.jpg|All Files (*.*)|*.*||"),
(LPCTSTR)_TEXT("TXT Files (*.txt)|*.txt||"),
NULL);
dlg.m_ofn.nFilterIndex = 1;
dlg.m_ofn.hwndOwner = m_hWnd;
dlg.m_ofn.lStructSize = sizeof(OPENFILENAME);
dlg.m_ofn.lpstrTitle = TEXT("打开文本文件...\0");
dlg.m_ofn.nMaxFile = MAX_PATH;
if(dlg.DoModal()==IDOK)
{
FilePathName = dlg.GetPathName(); //文件名保存在了FilePathName里
}
FileName = strPathName.AllocSysString();
(1)使用_wfopen来实现:
将获取的路径名和文件名的字符串(CString类型)转换为wchar_t类型,如:
CString strPathName;/*获取到的文件名*/
wchar_t *FileName =NULL;
FILE *pFile = NULL;CFileDialog dlg(TRUE, //TRUE为OPEN对话框,FALSE为SAVE AS对话框
NULL,
NULL,
OFN_HIDEREADONLY | OFN_FILEMUSTEXIST,
//文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,
//每种文件类型间用 | 分隔,末尾用 || 指明
// (LPCTSTR)_TEXT("JPG Files (*.jpg)|*.jpg|All Files (*.*)|*.*||"),
(LPCTSTR)_TEXT("TXT Files (*.txt)|*.txt||"),
NULL);
dlg.m_ofn.nFilterIndex = 1;
dlg.m_ofn.hwndOwner = m_hWnd;
dlg.m_ofn.lStructSize = sizeof(OPENFILENAME);
dlg.m_ofn.lpstrTitle = TEXT("打开文本文件...\0");
dlg.m_ofn.nMaxFile = MAX_PATH;
if(dlg.DoModal()==IDOK)
{
FilePathName = dlg.GetPathName(); //文件名保存在了FilePathName里
}
FileName = strPathName.AllocSysString();
pFile = _wfopen((const wchar_t*)pbyConfigName, L"rb");
SysFreeString(FileName ); // 注意,用完后释放内存!
CFile file.open((LPCTSTR)strPathName, CFile::modeRead, NULL);