从Web URL下载内容

时间:2019-05-22 13:07:09

标签: c++ readfile wininet

我正在尝试使用WinInet.h从URL地址获取数据。这是我的简化代码:

LPCTSTR url = (LPCTSTR) "https://example.com"; // 2.9.1
HINTERNET connection = InternetOpenA(NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
HINTERNET request = InternetOpenUrlA(connection, url, NULL, 0, INTERNET_FLAG_RELOAD, 0);

char status_code[10];
DWORD info_size = 10000;
HttpQueryInfoA(request, HTTP_QUERY_STATUS_CODE, status_code, &info_size, NULL);

DWORD size;
DWORD dwRead = 0;
InternetQueryDataAvailable(request, &size, 0, 0); // size = 5

char * buffer = new char[size]; // size = 5
InternetReadFile(request, buffer, size, &dwRead);
OutputDebugString(buffer); // 1.2.3ýýýý

InternetCloseHandle(connection);
InternetCloseHandle(request);

效果很好,但是URL地址上的数据为2.9.1,但是缓冲区返回了2.9.1ýýýý

如果我尝试在char之后打印char,这是结果:

for (int i = 0; i < size; i++)
    OutputDebugString(&buffer[i]);

char[0] = 2.9.1ýýýý
char[1] = .9.1ýýýý
char[2] = 9.1ýýýý
char[3] = .1ýýýý
char[4] = 1ýýýý

有人可以向我解释为什么会这样吗?

1 个答案:

答案 0 :(得分:2)

您接收到的数据是C样式的字符串,即以空字符结尾的字符数组。这里的重要部分是一个5个字符的字符串实际上需要一个大小为6的数组,例如:

*=

由6个字符组成的数组,分别为"hello" 'h''e''l''l''o'。 / p>

'\0'将遍历数组打印字符,直到到达OutputDebugString

在这种情况下,您不会为终止的'\0'分配任何空间,因此'\0'会一直继续下去,直到在内存中碰巧有OutputDebugString为止(或直到​​它到达内存)。

更改此位:

'\0'

成为

char * buffer = new char[size]; // size = 5
InternetReadFile(request, buffer, size, &dwRead);