Читать CByteArray из CFile

Я пишу CByteArray в файл:

    CFile myFile;
CByteArray m_baToques;

if(myFile.Open(_T(file), CFile::modeReadWrite | CFile::modeCreate))
{
myFile.Write(m_baToques.GetData(),m_baToques.GetSize());
myFile.Write(m_baDst.GetData(), m_baDst.GetSize());
myFile.Write(m_baFeriados.GetData(), m_baFeriados.GetSize());
}

Теперь, как читать CByteArray из файла?

Я попробую:

    CFile myFile;
if(myFile.Open(_T(file), CFile::modeReadWrite | CFile::modeCreate))
{
myFile.Read(m_baToques,m_baToques.GetSize());
myFile.Read(m_baDst, m_baDst.GetSize());
myFile.Read(m_baFeriados, m_baFeriados.GetSize());
}

ошибка C2664: «CFile :: Read»: невозможно преобразовать параметр 1 из «CByteArray» в «void *»

-1

Решение

Глядя на документация для CFile::Read, мы видим, что он принимает два параметра:

virtual UINT CFile::Read(void* lpBuf, UINT nCount);

lpBuf

Указатель на предоставленный пользователем буфер, который должен принимать данные, прочитанные из файла.

nCount

Максимальное количество байтов для чтения из файла. Для файлов в текстовом режиме пары возврата каретки и перевода строки считаются одиночными символами.

lpBuf не тип CByteArray, это void*, Таким образом ошибка компилятора.

Читать в CByteArray, мы должны выделить буфер через CByteArray а также получить указатель на указанный буфер что мы можем использовать для lpBuf:

CByteArray buffer;
buffer.SetSize(1024); // ensure that buffer is allocated and the size we want it
UINT bytesRead = myFile.Read(buffer.GetData(), buffer.GetSize());
// use bytesRead value and data now in buffer as needed

Обратите внимание, что в вашем вопросе у вас есть следующая строка на пути чтения:

if(myFile.Open(_T(file), CFile::modeReadWrite | CFile::modeCreate))

CFile::modeCreate приведет к урезанию файла до 0 байтов. Там не будет ничего читать.

Ты хотел написать что-то еще подобное?

if(myFile.Open(_T(file), CFile::modeRead | CFile::typeBinary | CFile::modeNoTruncate))
0

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

чтобы завершить вопрос с полнофункциональным кодом:
(протестировано под Visual Studio 2017)

BOOL ReadBinaryFile (TCHAR * имя файла) {

CFileStatus filestatus;
BOOL ok = CFile::GetStatus(filename, filestatus);
if (!ok)
return FALSE;

CFile myFile;
ok = myFile.Open(filename, CFile::modeRead | CFile::typeBinary | CFile::modeNoTruncate);
if (!ok)
return FALSE;

INT_PTR SIZE = (INT_PTR) filestatus.m_size;

// To read into a CByteArray, we need to allocate a buffer via CByteArray and get a pointer to said buffer that we can use for lpBuf:
CByteArray buffer;
buffer.SetSize(SIZE); // ensure that buffer is allocated and the size we want it
UINT bytesRead = myFile.Read(buffer.GetData(), SIZE);

myFile.Close();
return TRUE;

}

0

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