我正试图获取Barack Obama的Wikipedia页面的源代码并将其保存到文件中。
一切正常,直到我打开文件并看到其中一些奇怪的字符:
如您所见,EOT1024
出现在文件中,但没有出现在我使用Google Chrome浏览器检查过的网站的实际源代码中。我想知道为什么会这样,如何阻止它发生。
我的代码:
#include <iostream>
#include <windows.h>
#include <wininet.h>
#include <fstream>
int main(){
std::string textLink = "https://en.wikipedia.org/wiki/Barack_Obama";
std::ofstream file;
HINTERNET hInternet, hFile;
char buf[1024];
DWORD bytes_read;
int finished = 0;
bool e=false;
std::string waste;
file.open("data.txt",std::ios::out);
hInternet = InternetOpenW(L"Whatever", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if (hInternet == NULL) {
printf("InternetOpen failed\n");
}
hFile = InternetOpenUrl(hInternet, textLink.c_str(), NULL, 0L, 0, 0);
if (hFile == NULL) {
printf("InternetOpenUrl failed\n");
}
while (!finished) {
if (InternetReadFile(hFile, buf, sizeof(buf), &bytes_read)) {
if (bytes_read > 0) {
file << bytes_read << buf;
}
else {
finished = 1;
}
}
else {
printf("InternetReadFile failed\n");
finished = 1;
}
}
InternetCloseHandle(hInternet);
InternetCloseHandle(hFile);
file.close();
}
在记事本中查看文本文件时,就在这里:
https://drive.google.com/open?id=1Ty-a1o29RWSQiO1zTLym6XH4dJvUjpTO
我不明白为什么我会在写入的data.txt
文件中得到这些字符。
注意::我什至没有看到EOT1024
,而是得到了EOT21
,EOT1016
和其他看似随机的字符。
答案 0 :(得分:5)
您实际上是将整数bytes_read
写入文件:
file << bytes_read << buf;
有您的“ 1024”(在读取1024个字节的情况下)。
不要那样做。
此外,您似乎假设buf
为空终止。而是流式传输bytes_read
中的第一个buf
;这就是为什么你有那个整数。
所以:
file.write(&buf[0], bytes_read);
普通读取为每次InternetReadFile的调用检索指定的dwNumberOfBytesToRead,直到到达文件末尾。为了确保检索到所有数据,应用程序必须继续调用InternetReadFile函数,直到该函数返回TRUE并且lpdwNumberOfBytesRead参数等于零为止。