2010-11-10 18 views
1

我在下面的代碼中遇到了一些問題。我見過很多使用InternetReadFile保存到文件的示例。但我無法找到一個,或讓它爲char []工作。我想添加szBuffer來獲取holdBuff,然後設置內容等於holdBuff。InternetReadFile轉換爲C中的字符*

#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); 
} 
+0

你得到了什麼錯誤? – chrisaycock 2010-11-10 01:48:45

+0

沒有錯誤,我只是沒有找到合適的代碼來連接szBuff來holdBuff – Lienau 2010-11-10 02:02:09

+0

啊,現在我明白了爲什麼你的循環中有一條評論。我已經添加到我的答案。 – chrisaycock 2010-11-10 02:20:45

回答

2

變量聲明

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 

現在holdBuff將有你想要的,無需中介級聯的數據。

+0

工作完美,非常感謝。在過去的一天裏,我一直把頭髮拉出來。 – Lienau 2010-11-10 03:14:51

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[] = ""; //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); 
} 
+0

突出顯示您的代碼並按下「代碼」格式化按鈕(1010的東西)。 – chrisaycock 2010-11-10 02:26:22