为什么在获取网站的源代码时会出现特殊字符? C ++

时间:2019-05-11 14:00:48

标签: c++ web-scraping special-characters

我正试图获取Barack Obama的Wikipedia页面的源代码并将其保存到文件中。

一切正常,直到我打开文件并看到其中一些奇怪的字符:

image

如您所见,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,而是得到了EOT21EOT1016和其他看似随机的字符。

1 个答案:

答案 0 :(得分:5)

您实际上是将整数bytes_read写入文件:

file  << bytes_read << buf;

有您的“ 1024”(在读取1024个字节的情况下)。

不要那样做。

此外,您似乎假设buf为空终止。而是流式传输bytes_read中的第一个buf;这就是为什么你有那个整数。

所以:

file.write(&buf[0], bytes_read);

咨询the documentation

  

普通读取为每次InternetReadFile的调用检索指定的dwNumberOfBytesToRead,直到到达文件末尾。为了确保检索到所有数据,应用程序必须继续调用InternetReadFile函数,直到该函数返回TRUE并且lpdwNumberOfBytesRead参数等于零为止。