从Web URL下载内容
Downloading content from web URL
我正在尝试使用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ýýýý
。
如果我尝试在字符之后打印字符,这就是结果:
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ýýýý
谁能向我解释为什么会发生这种情况?
您要接收的数据是C风格的字符串,即零字符终止字符数组。这里重要的部分是,实际上有5个字符的字符串需要大小6的数组,例如:
"hello"
由6个字符的数组组成,'h'
,'e'
,'l'
,'l'
,'o'
,' '
。
OutputDebugString
将通过数组打印字符,直到达到 ' '
。
在这种情况下,您不会在任何地方分配终止' '
的任何地方,因此OutputDebugString
将继续进行,直到内存中恰好有' '
(或直到它到达内存,它不允许访问(。
更改此位:
char * buffer = new char[size]; // size = 5
InternetReadFile(request, buffer, size, &dwRead);
为
char * buffer = new char[size + 1]; // size = 5, allocate 6 chars
InternetReadFile(request, buffer, size, &dwRead);
buffer [size] = ' ';
相关文章:
- 如何使用url确定网站协议
- 下载URL中的所有文件
- 使用libcurl提交批量url的正确BING Api POST url是什么
- VisualStudio:使用 Suse Enterprise Server 12 SP5 时,不会下载远程库标头
- 将所有 URL 组织在类中的一个位置
- 从 C++ 上的网址下载文件
- libcurl :显示正在运行的上传和下载速率
- 从 C++ 中的 URL 获取结果
- 在 NVIDIA GEFORCE GTX 1050 上下载适用于 Windows 10 的 openCL 1.2
- 在加载 MSHTML 文档之前从 MSHTML 文档中删除无效的 URL
- 连接到 URL Sqlite 数据库C++
- 从Web URL下载内容
- 无法从QT 4.8中的URL存储下载的文件
- 如何在http代理后面下载带有ftp url的文件
- 在c++中使用curl从url下载图像
- Curl-通过登录从间接URL下载文件
- 如何在 Linux 中使用C++下载受密码保护的 URL
- 用C++将文件从URL下载到磁盘
- 让网页使用特定的URL来下载HTML资源
- c++ /CLI - URL下载到文件