0

我正在尝试在 Qt 4.8 中使用 C++ 和 libcurl 获取网站源代码。我是 Qt 和 C++ 的新手。但是,我收到一条错误消息

错误信息 -

启动 C:*****.exe...
程序意外结束。
C:*****.exe 退出,代码为 -1073741819
#include <curl/include/curl/curl.h>
#include <fstream>
#include <sstream>
#include <iostream>


static size_t data_write(void* buf, size_t size, size_t nmemb, void* userp)
{
    if(userp)
    {
        std::ostream& os = *static_cast<std::ostream*>(userp);
        std::streamsize len = size * nmemb;
        if(os.write(static_cast<char*>(buf), len))
            return len;
    }

    return 0;
}

CURLcode curl_read(const std::string& url, std::ostream& os, long timeout = 30)
{
    CURLcode code(CURLE_FAILED_INIT);
    CURL* curl = curl_easy_init();

    if(curl)
    {
        if(CURLE_OK == (code = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &data_write))
        && CURLE_OK == (code = curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L))
        && CURLE_OK == (code = curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L))
        && CURLE_OK == (code = curl_easy_setopt(curl, CURLOPT_FILE, &os))
        && CURLE_OK == (code = curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout))
        && CURLE_OK == (code = curl_easy_setopt(curl, CURLOPT_URL, url.c_str())))
        {
            code = curl_easy_perform(curl);
        }
        curl_easy_cleanup(curl);
    }
    return code;
}

int main()
{
    curl_global_init(CURL_GLOBAL_ALL);


    if(CURLE_OK == curl_read("http://google.com", std::cout))
    {
    // Web page successfully written to standard output (console?)
    }

    curl_global_cleanup();
    return 0;
}

上面的代码有什么问题?

PS - 上面的代码不是我的。

4

1 回答 1

0

不要费心使用外部库,使用 Qt 所拥有的。它有很多!

这是一个关于如何获取网页源的简单示例!

void MainWindow::on_pushButton_clicked()
{
    QNetworkAccessManager * mgr = new QNetworkAccessManager(this);
    connect(mgr,SIGNAL(finished(QNetworkReply*)),this,SLOT(onfinish(QNetworkReply*)));
    connect(mgr,SIGNAL(finished(QNetworkReply*)),mgr,SLOT(deleteLater()));

    mgr->get(QNetworkRequest(QUrl("http://www.google.com")));

}

void MainWindow::onfinish(QNetworkReply *rep)
{
    QByteArray bts = rep->readAll();
    QString str(bts);
    QMessageBox::information(this,"sal",str,"ok");

}

如果你想创建一个阻塞函数,请查看这里的教程

希望能帮助到你!

于 2012-11-22T13:13:50.737 回答