Wpis z mikrobloga

Jakis Mirek moglby spojrzec czy moj kod jest poprawny? Otoz, czy poprzez memcpy nie bada nadpisywane moje zamiast zapisywania ich w ciagu?

do {
char buffer[2000];
InternetReadFile(hData, (LPVOID)buffer, _countof(buffer), &dwBytesRead);
data = (char*)realloc(data, strlen(buffer) * sizeof(char));
memcpy(data, buffer, strlen(buffer));

} while ( (dwBytesRead > 0));

#cpp #programowanie
  • 8
Jeśli chcesz, żeby w zmiennej data na koniec były wszystkie bajty, to powyższy kod nie zadziała.

Realloc powinien przyjmować poprzedni rozmiar tablicy data + rozmiar buffer'a. A memcpy powinien kopiować tablice buffer pod adres data + ile danych już zostało do niego zapisane.
@Horvitz: Mogłoby to wyglądać na przykład tak:
HINTERNET hData;

(...)

const DWORD bufferSize = 2000;
char buffer[bufferSize];
DWORD dataSize = 0;
char *data;
DWORD dwBytesRead;

do {
InternetReadFile(hData, (LPVOID)buffer, bufferSize, &dwBytesRead);
data = (char*)realloc(data, dataSize + dwBytesRead);
memcpy(data + dataSize, buffer, dwBytesRead);
dataSize += dwBytesRead;
} while((dwBytesRead > 0));

(...)
A samo działanie wydaje się proste (piszę na podstawie dokumentacji, bo nigdy nie używałem tej funkcji).

Bierzesz stream(coś ala czytanie z stdin) typu HINTERNET i wczytujesz z niego MAKSYMALNIE bufferSize bajtów pod adres buffer, dodatkowo metoda modyfikuje wartość zmiennej dwBytesRead wpisując tam ile bajtów udało się przeczytać(zauważ, że przekazujesz wskaźnik na ta zmienną, dzięki czemu ta metoda jest w stanie nadpisać jej wartość).

No i teraz jeśli stream jest pusty to przeczytasz