c++ linux download file via libcurl
1.Install libcurl
sudo apt install curl
curl -o cpplibrary.pdf http://www.cesarkallas.net/arquivos/livros/informatica/cpp/The%20C%2B%2B%20Standard%20Library.pdf
2.
#include <chrono> #include <ctime> #include <curl/curl.h> #include <curl/easy.h> #include <iostream> #include <iomanip> #include <stdio.h> std::string get_time_now(bool is_exact = false) { std::chrono::time_point<std::chrono::high_resolution_clock> now = std::chrono::high_resolution_clock::now(); time_t raw_time = std::chrono::high_resolution_clock::to_time_t(now); struct tm tm_info = *localtime(&raw_time); std::stringstream ss; ss << std::put_time(&tm_info, "%Y%m%d%H%M%S"); if (is_exact) { std::chrono::seconds seconds = std::chrono::duration_cast<std::chrono::seconds>(now.time_since_epoch()); std::chrono::milliseconds mills = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()); std::chrono::microseconds micros = std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch()); std::chrono::nanoseconds nanos = std::chrono::duration_cast<std::chrono::nanoseconds>(now.time_since_epoch()); std::uint64_t mills_count = mills.count() - seconds.count() * 1000; std::uint64_t micros_count = micros.count() - mills.count() * 1000; std::uint64_t nanos_count = nanos.count() - micros.count() * 1000; ss << "-" << std::setw(3) << std::setfill('0') << std::to_string(mills_count) << std::setw(3) << std::setfill('0') << std::to_string(micros_count) << std::setw(3) << std::setfill('0') << std::to_string(nanos_count); } return ss.str(); } size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) { size_t written = fwrite(ptr, size, nmemb, stream); return written; } void download_file() { std::cout<<get_time_now(true)<<",start in "<<__FUNCTION__<<std::endl; CURL *curl; FILE *fp; CURLcode res; char *url = "https://www.mica.edu.vn/perso/Vu-Hai/EE3490/Ref/The%20C++Standard%20Library%20-%202nd%20Edition.pdf"; char outfilename[FILENAME_MAX] = "/home/fred/C/aaaaa.pdf"; curl = curl_easy_init(); if (curl) { fp = fopen(outfilename, "wb"); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); res = curl_easy_perform(curl); /* always cleanup */ curl_easy_cleanup(curl); fclose(fp); } std::cout<<get_time_now(true)<<",finish in "<<__FUNCTION__<<std::endl; } int main(void) { download_file(); return 0; }
3.
g++ -std=c++2a -I. *.cpp -o h1 -luuid -lpthread -lcurl
4.
./h1
#include <chrono> #include <ctime> #include <curl/curl.h> #include <curl/easy.h> #include <iostream> #include <iomanip> #include <stdio.h> #include <string> std::string get_time_now(bool is_exact = false) { std::chrono::time_point<std::chrono::high_resolution_clock> now = std::chrono::high_resolution_clock::now(); time_t raw_time = std::chrono::high_resolution_clock::to_time_t(now); struct tm tm_info = *localtime(&raw_time); std::stringstream ss; ss << std::put_time(&tm_info, "%Y%m%d%H%M%S"); if (is_exact) { std::chrono::seconds seconds = std::chrono::duration_cast<std::chrono::seconds>(now.time_since_epoch()); std::chrono::milliseconds mills = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()); std::chrono::microseconds micros = std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch()); std::chrono::nanoseconds nanos = std::chrono::duration_cast<std::chrono::nanoseconds>(now.time_since_epoch()); std::uint64_t mills_count = mills.count() - seconds.count() * 1000; std::uint64_t micros_count = micros.count() - mills.count() * 1000; std::uint64_t nanos_count = nanos.count() - micros.count() * 1000; ss << "-" << std::setw(3) << std::setfill('0') << std::to_string(mills_count) << std::setw(3) << std::setfill('0') << std::to_string(micros_count) << std::setw(3) << std::setfill('0') << std::to_string(nanos_count); } return ss.str(); } size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) { size_t written = fwrite(ptr, size, nmemb, stream); return written; } void download_file(char *url,char* save_file_name) { std::cout<<get_time_now(true)<<",start in "<<__FUNCTION__<<std::endl; CURL *curl; FILE *fp; CURLcode res; curl = curl_easy_init(); if (curl) { fp = fopen(save_file_name, "wb"); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); res = curl_easy_perform(curl); /* always cleanup */ curl_easy_cleanup(curl); fclose(fp); } std::cout<<get_time_now(true)<<",finish in "<<__FUNCTION__<<std::endl; } int main(int args,char **argv) { download_file(argv[1],argv[2]); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现