данные изменяются в потоке
Код:
int cnct()
{
HINTERNET hOpen;
HINTERNET hSession;
HINTERNET hRequest;
LPWCH szAppName;
GetModuleFileName(0, szAppName,16);
hOpen=InternetOpen( szAppName,
INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY,
NULL, NULL, 0);
if (hOpen != NULL) {
wprintf(L"connection %i\n",hOpen);
hSession=InternetConnect(hOpen, szlpServer, nServerPort, L"", L"", INTERNET_SERVICE_HTTP, 0, 0);
if (hSession != NULL) {
wprintf(L"session %i\n",hSession);
hRequest=HttpOpenRequest(hSession, L"GET", szlpPath, HTTP_VERSION, L"", 0, INTERNET_FLAG_RELOAD, 0);
if (hRequest != NULL) {
wprintf(L"request %i\n",hRequest);
BOOL bSend=HttpSendRequest(hRequest, NULL, 0, NULL, 0);
if (bSend) {
wprintf(L"send (true) %i\n",bSend);
int nC=1;
ofstream sStream("C:\\test\\tst.bmp",ios::out|ios::binary);
if (sStream.is_open()) for(;;) {
char szData[1025];
DWORD dwBytesRead;
BOOL bRead=InternetReadFile(hRequest, &szData, sizeof(szData)-1, &dwBytesRead);
if (bRead == FALSE || dwBytesRead == 0) break;
szData[dwBytesRead] = 0;
sStream << szData;
if (nC<4||dwBytesRead<1024) printf("data (size %i, step %i):\n%s\n",dwBytesRead, nC, szData);
nC++;
}
}
}
InternetCloseHandle(hRequest);
}
InternetCloseHandle(hSession);
}
InternetCloseHandle(hOpen);
return 0;
}
{
HINTERNET hOpen;
HINTERNET hSession;
HINTERNET hRequest;
LPWCH szAppName;
GetModuleFileName(0, szAppName,16);
hOpen=InternetOpen( szAppName,
INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY,
NULL, NULL, 0);
if (hOpen != NULL) {
wprintf(L"connection %i\n",hOpen);
hSession=InternetConnect(hOpen, szlpServer, nServerPort, L"", L"", INTERNET_SERVICE_HTTP, 0, 0);
if (hSession != NULL) {
wprintf(L"session %i\n",hSession);
hRequest=HttpOpenRequest(hSession, L"GET", szlpPath, HTTP_VERSION, L"", 0, INTERNET_FLAG_RELOAD, 0);
if (hRequest != NULL) {
wprintf(L"request %i\n",hRequest);
BOOL bSend=HttpSendRequest(hRequest, NULL, 0, NULL, 0);
if (bSend) {
wprintf(L"send (true) %i\n",bSend);
int nC=1;
ofstream sStream("C:\\test\\tst.bmp",ios::out|ios::binary);
if (sStream.is_open()) for(;;) {
char szData[1025];
DWORD dwBytesRead;
BOOL bRead=InternetReadFile(hRequest, &szData, sizeof(szData)-1, &dwBytesRead);
if (bRead == FALSE || dwBytesRead == 0) break;
szData[dwBytesRead] = 0;
sStream << szData;
if (nC<4||dwBytesRead<1024) printf("data (size %i, step %i):\n%s\n",dwBytesRead, nC, szData);
nC++;
}
}
}
InternetCloseHandle(hRequest);
}
InternetCloseHandle(hSession);
}
InternetCloseHandle(hOpen);
return 0;
}
Код:
sStream << szData;
использовать функцию write:
Код:
sStream.write(szData, dwBytesRead);
?
Насколько я знаю, при использовании оператора << при записи в файл char-овской строки символы строки записываются до тех пор, пока очередной символ не окажется символом конца строки '\0', и нет никаких гарантий, что в считываемом буфере символ конца строки окажется обязательно в конце буфера, а не где-нибудь в середине или в начале...
При использовании же write символы записываемого буфера пишутся в файл независимо от того, имеют ли какие-нибудь значение = '\0' или нет.
Спасибо огромное! Помогло. Действительно я не подумал, что в бинарном потоке могут встречаться символы 0