Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Bild downloaden

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
08.06.2003, 12:06 Uhr
~x-bay
Gast


Ich möchte mit InternetReadFile ein Bild herunterladen, es wird auch genau die entsprechende Byte-Anzahl heruntergeladen, aber nach einem anschliessenden Speichern in eine Datei auf der Festplatte ist die Datei nicht lesbar. Hat jemand einen Tip:

So hab ichs (auszugweise) gemacht:
char *glWebBuffer=NULL;
sQueryString = "http://pic.autoscout24.com/images/7/6/5/18088567_1.jpg";
HINTERNET hInternet, hQuerySite;
DWORD dwBytesRead, dwBytesTotal=0;
FILE *f;
hInternet=InternetOpen("XWebQuery",PRE_CONFIG_INTERNET_ACCESS,NULL,NULL,0);
hQuerySite=InternetOpenUrl(hInternet,sQueryString,NULL,0,INTERNET_FLAG_RELOAD,0);
do
{
if (!InternetReadFile (hQuerySite, (LPVOID)szData, sizeof(szData)-1, &dwBytesRead) ) break;
if (dwBytesRead == 0) break; //finish
szData [dwBytesRead] = '\0';
dwBytesTotal +=dwBytesRead;
if (!glWebBuffer)
{
glWebBuffer = (char*)malloc(sizeof(char)*(dwBytesTotal+1));
if (glWebBuffer) strcpy(glWebBuffer, szData);
else
MessageBox(NULL, "lack of memory", "internal program-error", MB_OK | MB_TASKMODAL);
}
else
{
glWebBuffer = (char*)realloc(glWebBuffer, sizeof(char)*(dwBytesTotal+1));
if (glWebBuffer) strcat(glWebBuffer, szData);
else
MessageBox(NULL, "lack of memory", "internal program-error", MB_OK | MB_TASKMODAL);
}
}
while (dwBytesRead > 0);
InternetCloseHandle(hQuerySite);
InternetCloseHandle(hInternet);
f=fopen(szFileName+1,"wb");
fwrite(glWebBuffer,1,dwBytesTotal,f);
fclose(f);
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.06.2003, 12:43 Uhr
ao

(Operator)


Hallo x-bay,

ich hab nicht jede Zeile bis ins Letzte nachgeprüft, aber folgender grundsätzlicher Fehler ist mir aufgefallen:

Du behandelst die heruntergeladenen Daten wie einen String (d.h. druckbaren Text, der mit einem NUL-Zeichen abgeschlossen wird). Tatsächlich ist es ein Feld von Bytes, in denen es kein besonderes Terminator-Zeichen gibt. Stattdessen hast du die Längeninformation in dwBytesRead.

Also: strcpy, strcat oder irgendwelche andere string-Funktionen nicht verwenden, denn diese stoppen automatisch beim ersten Vorkommen von '\0'! Stattdessen memcpy benutzen.

Das händische Terminieren von szData in szData[dwBytesRead] = 0; würde ich auch sein lassen, das verwirrt hier nur.

In dem Zusammenhang: szData anders nennen, denn es ist in Wahrheit kein "sz", also zero-terminated string.

Und nochn Vorschlag: Ich würde nicht das ganze Bild zuerst in den Speicher laden, den Puffer jedesmal mit realloc vergrößern und am Ende alles gemeinsam wegschreiben. Das funktioniert mit kleinen Dateien, aber bei größeren fragmentiert es mächtig den Arbeitsspeicher, weil du immer größere Blöcke wegwirfst. Stattdessen würde ich so vorgehen:


Code:
Internet-Verbindung öffnen
Plattendatei öffnen
einen Puffer bereitstellen (z.B. 64 K). Der muß nicht dynamisch geholt werden, du kannst auch einfach char buffer [64 * 1024]; sagen.

do {
InternetRead (hQuerySite, buffer, sizeof (buffer), &dwBytesRead);
fwrite (buffer, 1, dwBytesRead, file);
} while (dwBytesRead == sizeof(buffer));

Internet-Verbindung und Plattendatei schließen.



(ohne Test runtergetippt, keine Gewähr).

Aber das machst du (wenn überhaupt) besser erst im zweiten Schritt, wenn die Fehler mit der String-Verarbeitung behoben hast.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.06.2003, 13:18 Uhr
~x-bay
Gast


Hallo ao !
Vielen Dank, es geht !!
Das mit memcpy war der entscheidende Hinweis.
Schöne Feiertage noch.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: