C++中禁用libcurl的输出打印

29

我从http://curl.haxx.se/获取了一个小程序,但每次运行它都会打印网页内容,我该如何禁用这个打印功能?

#include <iostream>
#include <curl/curl.h>
using namespace std;

int main() {
    CURL *curl;
      CURLcode res;

      curl = curl_easy_init();
      if(curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "http://google.com");
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION,1);
        res = curl_easy_perform(curl);

        /* always cleanup */
        curl_easy_cleanup(curl);
      }
      return 0;
}
4个回答

43
您需要设置 CURLOPT_WRITEFUNCTION 来使其不使用 stdout。
这里有一个解释(在 CURLOPT_WRITEFUNCTION 下方):http://curl.haxx.se/libcurl/c/curl_easy_setopt.html 以及这里(在“处理 Easy libcurl”下面):http://curl.haxx.se/libcurl/c/libcurl-tutorial.html 基本上需要添加以下函数:
size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp)
{
   return size * nmemb;
}

并调用

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);

应该这样做。


回调函数不能是非静态类成员函数。https://curl.se/libcurl/c/libcurl-tutorial.html - undefined

3
您仍然可以获取诊断信息。要停止这些信息,请更改或添加以下行:
curl_easy_setopt (curl, CURLOPT_VERBOSE, 0L); //0 disable messages

2
只是为了澄清:设置CURLOPT_VERBOSE并不会阻止curl将获取的URL内容打印到标准输出。您需要定义CURLOPT_WRITEFUNCTIONCURLOPT_WRITEDATA以防止这种情况发生。CURLOPT_VERBOSE仅有助于防止其他诊断消息被打印出来。 - jeffreyveon
1
CURLOPT_VERBOSE不会停止打印响应。 - M. Paul
CURLOPT_VERBOSE显示详细信息。默认情况下已禁用,值为0。 https://curl.se/libcurl/c/CURLOPT_VERBOSE.html - char

1

如果要将数据写入文件而不是打印出来,请使用以下文件描述符:

FILE *wfd = fopen("foo.txt", "w");
...
curl_easy_setopt(curl, CURLOPT_WRITEDATA, wfd);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL);

-1

对我有用的是在代码中使用CURLOPT_NOBODY选项,参考链接:http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTNOBODY

#include <iostream>
#include <curl/curl.h>
using namespace std;

int main() {
    CURL *curl;
    CURLcode res;

    curl = curl_easy_init();
    if(curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "http://google.com");
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION,1);

        //USING CURLOPT NOBODY
        curl_easy_setopt(curl, CURLOPT_NOBODY,1);

        res = curl_easy_perform(curl);

        /* always cleanup */
        curl_easy_cleanup(curl);
    }
    return 0;
}

2
我选择了这种方法,因为它似乎比其他解决方案更简单,但是文档明确指出:“对于HTTP(S),这将使libcurl执行一个HEAD请求。” 这通常会大大改变程序的行为。 - neo post modern

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接