Как я могу динамически выделить тип переменной CFile? (C ++, CFile, новый)

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 хорошо указывает адрес файла.

0

Решение

В общем нет необходимости создавать 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 затем. Обратите внимание, что по желанию вы можете пройти CFileException в Open вызов. В этом случае он не выдаст исключение в случае ошибки, и вам не нужно помещать try/catch вокруг него. Так что, в принципе, у вас есть больше возможностей для контроля поведения, если вы звоните Open вручную.

1

Другие решения


По вопросам рекламы [email protected]