InternetReadFile to Char * in C - PullRequest
       9

InternetReadFile to Char * in C

1 голос
/ 10 ноября 2010

У меня небольшая проблема со следующим кодом.Я видел множество примеров использования InternetReadFile для сохранения в файл.Но я не могу найти ни одного, или заставить его работать на символ [].Я хочу добавить szBuffer, чтобы получить holdBuff, а затем установить содержимое равным holdBuff.

#include <stdio.h>
#include <tchar.h>
#include <string.h>
#include <windows.h>
#include <WinInet.h>

HINTERNET hSession;
void urlToChar(char* url, char** content);

int main()
{
    hSession = InternetOpen("Mozilla/4.0 (compatible) Poison", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    char* content;
    urlToChar("http://google.com/", &content);
    printf("%s",content);
    return 0;
}

void urlToChar(char* url, char** content)
{
    HINTERNET hConnect = InternetConnect(hSession, _T(""),INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
    HINTERNET hRequest = InternetOpenUrl(hSession, url, NULL, 0, 0, 0);
    if (hRequest)
    {
        char holdBuff[] = "";
        char szBuff[1025];
        memset(szBuff, 0x00, sizeof(szBuff));
        DWORD bytesRead;
        while (InternetReadFile(hRequest, szBuff, 1024, &bytesRead) == TRUE && bytesRead > 0)
        {
            // Cat szBuff to holdBuff
            memset(szBuff, 0x00, sizeof(szBuff));
        }
        *content = holdBuff;
        // memset(holdBuff, 0x00, sizeof(holdBuff));  <-- Need this?
    }
    InternetCloseHandle(hRequest);
    InternetCloseHandle(hConnect);
}

Ответы [ 2 ]

2 голосов
/ 10 ноября 2010

Объявление переменной

char xyz[] = "Hello World!";

скажет компилятору поместить содержимое строки в стек.Конечно, стек исчезает, когда ваша функция возвращает.

Так что в вашем случае:

char holdBuff[] = "";
...
*content = holdBuff;

Это говорит компилятору создать строку длины один (терминатор NULL) в виделокальная переменная.То, что вы установили значение content равным holdBuff, не означает, что то, на что указывал holdBuff, больше не существует.

Вы должны исправить две вещи.Во-первых, вы должны использовать strcpy() или аналогичную функцию.Во-вторых, вы должны выделить достаточно места для holdBuff.

Пример:

char holdBuff[4096];    // or some other sufficiently large size
...
*content = malloc (strlen(holdBuff) + 1);
strcpy (*content, holdBuff);

Затем вам нужно будет free(content) в main(), как только вы закончите с ним.

Теперь о том, как на самом деле выполнить конкатенацию: ваша производительность будет намного лучше, если вы вообще забудете об использовании szBuff и просто напишите прямо в holdBuff.

char* temp = holdBuff;
while (InternetReadFile(hRequest, temp, 1024, &bytesRead) == TRUE && bytesRead > 0)
{
    temp += bytesRead;
}
*temp = '\0';    // manually append NULL terminator

Now holdBuff будет иметь данные, которые вы хотите, без необходимости промежуточной конкатенации.

0 голосов
/ 10 ноября 2010
void urlToChar(char* url, char** content)
{
    HINTERNET hConnect = InternetConnect(hSession, _T(""),INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
    HINTERNET hRequest = InternetOpenUrl(hSession, url, NULL, 0, 0, 0);
    if (hRequest)
    {
        char holdBuff[] = "";   //do not use fixed size char array and allocate buffer in stack,you can allocate large enough buffer in heap,but recommend you can use string or CString
        char szBuff[1025];
        memset(szBuff, 0x00, sizeof(szBuff));
        DWORD bytesRead;
        while (InternetReadFile(hRequest, szBuff, 1024, &bytesRead) == TRUE && bytesRead > 0)
        {
            // Cat szBuff to holdBuff
            //strcat when using char array
            // operator+ when using stl string
            // [stl string][1]
            memset(szBuff, 0x00, sizeof(szBuff));
        }
        *content = holdBuff;
        // memset(holdBuff, 0x00, sizeof(holdBuff));  <-- Need this?
    }
    InternetCloseHandle(hRequest);
    InternetCloseHandle(hConnect);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...