如何动态分配 CFile 类型的变量? (C++、CFile、新)
How can I dynamically allocate a CFile type of variable? (C++, CFile, new)
static TCHAR BASED_CODE szFilter[] = _T("YUV Files|*.yuv|")
CFileDialog fileDlg(TRUE, _T("yuv"), _T("bus.yuv"), OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilter);
if (fileDlg.DoModal() == IDOK)
{
CString pathName = fileDlg.GetPathName();
CFile* pImgFile = NULL;
pImgFile = new CFile(pathName, CFile::modeRead || CFile::typeBinary);
}
我参考了以下站点中的示例。 https://msdn.microsoft.com/en-us/library/b569d0t4.aspx
static TCHAR BASED_CODE szFilter[] = _T("YUV Files|*.yuv|")
CFileDialog fileDlg(TRUE, _T("yuv"), _T("bus.yuv"), OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilter);
if (fileDlg.DoModal() == IDOK)
{
CString pathName = fileDlg.GetPathName();
CFile imgFile;
CFileException e;
if (!imgFile.Open(pathName, CFile::modeRead || CFile::typeBinary, &e))
{
TRACE(_T("File could not be opened %d\n"), e.m_cause);
}
}
我参考了以下站点中的第一个示例。 https://msdn.microsoft.com/en-us/library/hwbccf8z.aspx
我在第二个代码中使用了CFile,Open的方法
上面的代码,如何打开文件?
当我使用动态分配时,它会自动打开文件吗?
imgLength = pImgFile->GetLength();
CString str;
str.Format(_T("Your SYSTEM.INI file is %I64u bytes long."), imgLength);
AfxMessageBox(str);
我尝试将此代码附加到第一个代码。
它工作没有任何问题,我认为变量 pImgFile 很好地指向了文件的地址。
一般不需要在堆上创建CFile
。
CFile
有几个构造函数:
CFile( );
CFile(
CAtlTransactionManager* pTM
);
CFile(
HANDLE hFile
);
CFile(
LPCTSTR lpszFileName,
UINT nOpenFlags
);
CFile(
LPCTSTR lpszFileName,
UINT nOpenFlags,
CAtlTransactionManager* pTM
);
第四个和第五个构造函数在内部调用Open
。所以他们确实打开了文件。
另一个问题是您应该使用 operator |
而不是 ||
来组合开放标志。
我建议使用默认的 CFile 构造函数,然后调用 Open
。请注意,它不会在出现错误时抛出异常(取而代之的是 returns FALSE
),并且您不需要在其周围放置 try/catch
。如果失败,您也可以选择将 CFileException*
传递给 Open
以获取更多信息。
static TCHAR BASED_CODE szFilter[] = _T("YUV Files|*.yuv|")
CFileDialog fileDlg(TRUE, _T("yuv"), _T("bus.yuv"), OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilter);
if (fileDlg.DoModal() == IDOK)
{
CString pathName = fileDlg.GetPathName();
CFile* pImgFile = NULL;
pImgFile = new CFile(pathName, CFile::modeRead || CFile::typeBinary);
}
我参考了以下站点中的示例。 https://msdn.microsoft.com/en-us/library/b569d0t4.aspx
static TCHAR BASED_CODE szFilter[] = _T("YUV Files|*.yuv|")
CFileDialog fileDlg(TRUE, _T("yuv"), _T("bus.yuv"), OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilter);
if (fileDlg.DoModal() == IDOK)
{
CString pathName = fileDlg.GetPathName();
CFile imgFile;
CFileException e;
if (!imgFile.Open(pathName, CFile::modeRead || CFile::typeBinary, &e))
{
TRACE(_T("File could not be opened %d\n"), e.m_cause);
}
}
我参考了以下站点中的第一个示例。 https://msdn.microsoft.com/en-us/library/hwbccf8z.aspx
我在第二个代码中使用了CFile,Open的方法
上面的代码,如何打开文件?
当我使用动态分配时,它会自动打开文件吗?
imgLength = pImgFile->GetLength();
CString str;
str.Format(_T("Your SYSTEM.INI file is %I64u bytes long."), imgLength);
AfxMessageBox(str);
我尝试将此代码附加到第一个代码。
它工作没有任何问题,我认为变量 pImgFile 很好地指向了文件的地址。
一般不需要在堆上创建CFile
。
CFile
有几个构造函数:
CFile( );
CFile(
CAtlTransactionManager* pTM
);
CFile(
HANDLE hFile
);
CFile(
LPCTSTR lpszFileName,
UINT nOpenFlags
);
CFile(
LPCTSTR lpszFileName,
UINT nOpenFlags,
CAtlTransactionManager* pTM
);
第四个和第五个构造函数在内部调用Open
。所以他们确实打开了文件。
另一个问题是您应该使用 operator |
而不是 ||
来组合开放标志。
我建议使用默认的 CFile 构造函数,然后调用 Open
。请注意,它不会在出现错误时抛出异常(取而代之的是 returns FALSE
),并且您不需要在其周围放置 try/catch
。如果失败,您也可以选择将 CFileException*
传递给 Open
以获取更多信息。