Мне интересно, почему приведенный ниже код не записывает правильные данные в файл. Если я изменю размер буфера на большее значение, этот код будет работать нормально.
Для приведенного ниже кода, если я пытаюсь прочитать файл размером менее 500 байт, он работает хорошо, но для большего файла мне просто нужно увеличить буфер. Чего мне не хватает в цикле чтения?
const int iBuffSiz = 500;
char chBuffer[iBuffSiz];
memset(chBuffer, 0, sizeof(chBuffer));
CFile file;
CFile fileO;
if(file.Open(XML_FILE_NAME, CFile::modeRead | CFile::typeBinary) == FALSE)
{
return;
}
if(fileO.Open(XML_FILE_NAME_O, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary) == FALSE)
{
return;
}
while(file.Read(chBuffer, iBuffSiz) > 0)
{
try{
UINT iCount = strlen(chBuffer);
fileO.Write(chBuffer, iCount);
}
catch (CFileException *exp)
{
TCHAR szCause[255];
exp->GetErrorMessage(szCause, 255);
}
}
//Closing file handle and socket after complete file send
file.Close();
fileO.Close();
CFile::typeBinary
не имеет ничего общего с проблемами. Проблема скорее в том, что у OP нет гарантии, с этим флагом или без него, что содержимое буфера представляет собой строку с нулевым завершением, которая требуется для использованияstrlen()
. Вместо этого проверьте документацию CFile, я думаю, она может сказать вам, сколько байт она прочитала. Наконец, еще два совета: есть лучшие способы скопировать файл (поищите в Интернете!), а перехват, а затем полное игнорирование исключений очень вредно. - person Ulrich Eckhardt   schedule 17.03.2015