CFile myfile(szpath, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary); // здесь собираемся писать на жесткий диск
int numbytes;
while (numbytes = remotefile->Read(httpbuff, HTTPBUFLEN))
{
fullbytes += numbytes; // здесь считаем размер файла
strbuffer += httpbuff; // вот здесь вся проблема (см. ниже)
myfile.Write(httpbuff, numbytes);
}
Проблема вот в чем: по numbytes видно что считывается по 512 байт, однако к strbuffer буфер прибавляется не 512 байт а разное число байт: 4, 2, 6, 8, 16 и дальше в разброс. Почему так? И получается что реальный размер файла (fullbytes) отличается от длины строки strbuffer. Почему так? Как ПРАВИЛЬНО преобразовать char httpbuffer[] и BYTE* в CString?
И еще вопрос: CInternetFile::GetLength() не всегда возвращает реальный размер файла, говорят это из-за того, что весь WinInet — это глюк на глюке. Как можно получить размер файла по-другому?
Спасибо.
15.04.05 20:50: Перенесено модератором из 'C/C++' — Павел Кузнецов
Здравствуйте, khatsko, Вы писали:
K>Необходимо считать бинарный файл из интернета, с открытием файла проблем нет (проблема похоже с преобразованием типов). Вот код:
K>#define HTTPBUFLEN 512 // Size of HTTP Buffer... K>char httpbuff[HTTPBUFLEN];
K>CString strbuffer = ""; K>CInternetSession mysession; K>CStdioFile *remotefile = mysession.OpenURL(_szurl,1,INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_RELOAD); // файл открылся нормально
K>Проблема вот в чем: по numbytes видно что считывается по 512 байт, однако к strbuffer буфер прибавляется не 512 байт а разное число байт: 4, 2, 6, 8, 16 и дальше в разброс. Почему так?
А чего ты хотел? Ты считывешь файл как бинарный и пытаешься добавить его в текстовую строку . На первом же нуле добавление в строку обломится. Используй другой контейнер для хранения данных типа CArray или std::vector<char>
K>И еще вопрос: CInternetFile::GetLength() не всегда возвращает реальный размер файла, говорят это из-за того, что весь WinInet — это глюк на глюке.
Обычно говорят те кто в нем не разбирается
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Здравствуйте, AndrewJD, Вы писали:
K>>Проблема вот в чем: по numbytes видно что считывается по 512 байт, однако к strbuffer буфер прибавляется не 512 байт а разное число байт: 4, 2, 6, 8, 16 и дальше в разброс. Почему так?
AJD>А чего ты хотел? Ты считывешь файл как бинарный и пытаешься добавить его в текстовую строку . На первом же нуле добавление в строку обломится. Используй другой контейнер для хранения данных типа CArray или std::vector<char>
А можно использовать char* ?
И еще вопрос: как преобразовать CString в (BYTE*) ?
Здравствуйте, AndrewJD, Вы писали:
K>>Проблема вот в чем: по numbytes видно что считывается по 512 байт, однако к strbuffer буфер прибавляется не 512 байт а разное число байт: 4, 2, 6, 8, 16 и дальше в разброс. Почему так?
AJD>А чего ты хотел? Ты считывешь файл как бинарный и пытаешься добавить его в текстовую строку . На первом же нуле добавление в строку обломится. Используй другой контейнер для хранения данных типа CArray или std::vector<char>
Да в принципе и CString можно использовать... только очень аккуратно. Во всяком случае, не прибавлять к ней прсто LPCSTR — она думает, что он заканчивается нулём.
"AndrewJD" <2437@users.rsdn.ru> wrote in message news:1104297@news.rsdn.ru... > K>И еще вопрос: CInternetFile::GetLength() не всегда > >возвращает реальный размер файла, говорят это из-за того, что весь > >WinInet — это глюк на глюке. > Обычно говорят те кто в нем не разбирается
Нда? Это ничего, что для chunked-передачи размера файла вообще может не быть?