我在使用以下代码时遇到了一些问题。我见过大量使用 InternetReadFile 保存到文件的示例。但是我找不到一个,或者让它为 char[] 工作。我想把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);
}
最佳答案
变量声明
char xyz[] = "Hello World!";
会告诉编译器把字符串的内容放到栈上。当然,当您的函数返回时,堆栈就会消失。
所以在你的情况下:
char holdBuff[] = "";
...
*content = holdBuff;
这告诉编译器创建一个长度为 1 的字符串(NULL 终止符)作为局部变量。仅仅因为您将 content
的值设置为 holdBuff
并不意味着 holdBuff
指向的内容不再存在。
你必须纠正两件事。首先,您必须使用 strcpy()
或类似的函数。其次,必须为holdBuff
分配足够的空间。
例子:
char holdBuff[4096]; // or some other sufficiently large size
...
*content = malloc (strlen(holdBuff) + 1);
strcpy (*content, holdBuff);
完成后,您需要在 main()
中free(content)
。
现在,关于如何实际进行串联:如果您完全忘记使用 szBuff
并直接写入 holdBuff
,您的性能会好得多。
char* temp = holdBuff;
while (InternetReadFile(hRequest, temp, 1024, &bytesRead) == TRUE && bytesRead > 0)
{
temp += bytesRead;
}
*temp = '\0'; // manually append NULL terminator
现在 holdBuff
将拥有您想要的数据,无需中间连接。
关于c - InternetReadFile 到 C 中的 Char*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4140529/