Проблема: сложить разные типы
От: khatsko  
Дата: 02.04.05 11:38
Оценка:
Прошу помочь разобраться со сложением типов. Уже несколько дней бьюсь — ничего не получается, понять не могу.

Необходимо считать бинарный файл из интернета, с открытием файла проблем нет (проблема похоже с преобразованием типов). Вот код:

#define HTTPBUFLEN 512 // Size of HTTP Buffer...
char httpbuff[HTTPBUFLEN];

CString strbuffer = "";
int fullbytes = 0;

CInternetSession mysession;
CStdioFile *remotefile = mysession.OpenURL(_szurl,1,INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_RELOAD); // файл открылся нормально

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++' — Павел Кузнецов
Re: Проблема: сложить разные типы
От: AndrewJD США  
Дата: 02.04.05 13:00
Оценка:
Здравствуйте, 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."
Re[2]: Проблема: сложить разные типы
От: khatsko  
Дата: 02.04.05 13:09
Оценка:
Здравствуйте, AndrewJD, Вы писали:

K>>Проблема вот в чем: по numbytes видно что считывается по 512 байт, однако к strbuffer буфер прибавляется не 512 байт а разное число байт: 4, 2, 6, 8, 16 и дальше в разброс. Почему так?


AJD>А чего ты хотел? Ты считывешь файл как бинарный и пытаешься добавить его в текстовую строку . На первом же нуле добавление в строку обломится. Используй другой контейнер для хранения данных типа CArray или std::vector<char>


А можно использовать char* ?

И еще вопрос: как преобразовать CString в (BYTE*) ?
Re[3]: Проблема: сложить разные типы
От: AndrewJD США  
Дата: 02.04.05 13:33
Оценка:
Здравствуйте, khatsko, Вы писали:

K>А можно использовать char* ?

Разве что таким способом:

char* pBuf = new char[nSize];


K>И еще вопрос: как преобразовать CString в (BYTE*) ?


Если для чтения — обычным кастом. Для записи используй CString::GetBuffer(nSize);
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[4]: Проблема: сложить разные типы
От: khatsko  
Дата: 02.04.05 13:41
Оценка:
Здравствуйте, AndrewJD, Вы писали:

AJD>Если для чтения — обычным кастом. Для записи используй CString::GetBuffer(nSize);


Сделал как ты сказал: использовал CArray для хранения буфера:

CArray <char, char> strbuffer;

здесь символы нормально читаются в массив strbuffer, далее необходимо преобразовать этот массив в BYTE*:

BYTE* buffer;
buffer = (BYTE*)malloc(fullbytes);

strcpy((LPTSTR)buffer, "");

for (int i = 0; i<strbuffer.GetSize(); i++) strcat((LPTSTR)buffer, (LPCTSTR)strbuffer[i]);

... и на последней функции strcat вылетает ошибка. Что здесь неправильно?
Re[2]: Проблема: сложить разные типы
От: Кодт Россия  
Дата: 02.04.05 15:22
Оценка:
Здравствуйте, AndrewJD, Вы писали:

K>>Проблема вот в чем: по numbytes видно что считывается по 512 байт, однако к strbuffer буфер прибавляется не 512 байт а разное число байт: 4, 2, 6, 8, 16 и дальше в разброс. Почему так?


AJD>А чего ты хотел? Ты считывешь файл как бинарный и пытаешься добавить его в текстовую строку . На первом же нуле добавление в строку обломится. Используй другой контейнер для хранения данных типа CArray или std::vector<char>


Да в принципе и CString можно использовать... только очень аккуратно. Во всяком случае, не прибавлять к ней прсто LPCSTR — она думает, что он заканчивается нулём.
Перекуём баги на фичи!
Re[5]: Проблема: сложить разные типы
От: AndrewJD США  
Дата: 03.04.05 10:19
Оценка:
Здравствуйте, khatsko, Вы писали:

K>Сделал как ты сказал: использовал CArray для хранения буфера:

K> CArray <char, char> strbuffer;
Можно и

    #define HTTPBUFLEN 512 // Size of HTTP Buffer...
    BYTE httpbuff[HTTPBUFLEN];
    CArray <BYTE, BYTE> byteBuffer;

    int fullbytes = 0;

    CInternetSession mysession;
    CStdioFile *remotefile = mysession.OpenURL(_szurl,1,INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_RELOAD); // файл открылся нормально

    CFile myfile(szpath, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary); // здесь собираемся писать на жесткий диск
    int numbytes;

    while (numbytes = remotefile->Read(httpbuff, HTTPBUFLEN))
    {
        byteBuffer.SetSize(fullbytes  + numbytes, 4096); // resize array if necessary
        BYTE* pBuf = const_cast<BYTE*>(byteBuffer.GetData() + fullbytes);
        CopyMemory(pBuf, httpbuff, numbytes);

        fullbytes  += numbytes; // здесь считаем размер файла
    }
    myfile.Write(byteBuffer.GetData(), fullbytes);
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[2]: Проблема: сложить разные типы
От: SkyDance Земля  
Дата: 05.04.05 09:41
Оценка:
"AndrewJD" <2437@users.rsdn.ru> wrote in message news:1104297@news.rsdn.ru...
> K>И еще вопрос: CInternetFile::GetLength() не всегда
> >возвращает реальный размер файла, говорят это из-за того, что весь
> >WinInet — это глюк на глюке.
> Обычно говорят те кто в нем не разбирается

Нда? Это ничего, что для chunked-передачи размера файла вообще может не быть?


.
Posted via RSDN NNTP Server 1.9
Re[3]: Проблема: сложить разные типы
От: AndrewJD США  
Дата: 05.04.05 11:42
Оценка:
Здравствуйте, SkyDance, Вы писали:

SD>Нда? Это ничего, что для chunked-передачи размера файла вообще может не быть?


В чем проблема собственно?
"For every complex problem, there is a solution that is simple, neat,
and wrong."
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.