c ++使用wininet获取网页
c++ fetching web page using wininet
我正在尝试使用 WinInet 下载网页。我使用了这里给出的代码:http://www.cplusplus.com/forum/windows/109799/
大部分情况下都有效,但似乎存在一些我不知道如何解决的编码问题。
例如,这一行(使用 www.whosebug.com 作为示例页面):
<link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Shared/stacks.css?v=48511da708b8">
作为此行返回:
<link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Shared/stacks.css?cks.css?ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌðA6÷v=48511da708b8">
(为了不发垃圾邮件,我实际上已经删除了大部分特殊字符)
在此代码中:
while(InternetReadFile(OpenAddress, DataReceived, 4096, &NumberOfBytesRead) && NumberOfBytesRead )
{
cout << DataReceived;
}
DataReceived
正在接收任意字节。它不是 null-terminated 字符串,但代码将它传递给需要 null-terminated 字符串的 operator<<
重载。所以打印超出了接收数据的末尾,从周围的内存中打印字节,直到遇到随机 0x00
字节。
改用 istream::write()
方法,这样您就可以准确地告诉它要打印多少个字符:
cout.write(DataReceived, NumberOfBytesRead);
我正在尝试使用 WinInet 下载网页。我使用了这里给出的代码:http://www.cplusplus.com/forum/windows/109799/
大部分情况下都有效,但似乎存在一些我不知道如何解决的编码问题。
例如,这一行(使用 www.whosebug.com 作为示例页面):
<link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Shared/stacks.css?v=48511da708b8">
作为此行返回:
<link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Shared/stacks.css?cks.css?ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌðA6÷v=48511da708b8">
(为了不发垃圾邮件,我实际上已经删除了大部分特殊字符)
在此代码中:
while(InternetReadFile(OpenAddress, DataReceived, 4096, &NumberOfBytesRead) && NumberOfBytesRead )
{
cout << DataReceived;
}
DataReceived
正在接收任意字节。它不是 null-terminated 字符串,但代码将它传递给需要 null-terminated 字符串的 operator<<
重载。所以打印超出了接收数据的末尾,从周围的内存中打印字节,直到遇到随机 0x00
字节。
改用 istream::write()
方法,这样您就可以准确地告诉它要打印多少个字符:
cout.write(DataReceived, NumberOfBytesRead);