迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C++ >

用 C++ 下载文件

作者:迹忆客 最近更新:2023/08/26 浏览次数:

本文介绍如何使用 C++ 下载文件。


用 C++ 下载文件

使用 C++ 下载文件是一项简单的操作,可以使用 win32 API URLDownloadToFile 来完成。 该 API 可以从给定的链接下载我们计算机中的文件。

我们可以根据需要将下载的项目保存为文件或字符串。 这两者都可以使用不同的操作来完成。

让我们从下载文件开始。

C++ 下载为文件

如上所述,我们可以使用win32 API URLDownloadToFile,我们可以从给定的链接下载任何文件。 该文件将保存在同一工作目录中。

让我们尝试一个例子。

#include <windows.h>
#include <cstdio>
#include<string>
#pragma comment(lib, "Urlmon.lib")

using namespace std;

int main() {

    // the URL from where the file will be downloaded
    string SourceURL = "https://picsum.photos/200/300.jpg";

    // destination file
    string DestinationFile = "DemoFile.jpg";

    // URLDownloadToFile returns S_OK on success
    if (S_OK == URLDownloadToFile(NULL, SourceURL.c_str(), DestinationFile.c_str(), 0, NULL)) {

        printf("The file is successfully downloaded.");

        return 0;

    }

    else  {
        printf("Download Failed");
        return -1;
    }
}

在编译上述代码之前,需要注意的是,上述代码仅适用于使用 Visual Studio Express、Visual C++ 或任何其他相关编译器的 NSVC 编译器。 它无法与 MinGW 编译器一起使用,因为它不包含 URLDownloadToFile API。

一旦我们运行上面的代码,它将从链接下载文件。

查看输出:

The file is successfully downloaded.

C++ Download File

C++ 下载为字节串

此方法使用 win32 API URLOpenBlockingStream 将文件下载为字节字符串,也可以将其保存在文件中。 这是一个棘手的逐步过程; 请按照以下步骤操作。

  1. 首先,使用 URLOpenBlockingStream 获取 URL 的 IStream 接口。
  2. 然后插入 HTTP 和 HTTPS 协议都可以使用的 URL。
  3. 一旦 IStream 可用,请使用读取函数下载字节。 这里我们可能需要使用循环。
  4. 一旦字节被收集到字符串中,我们就可以将它们保存到文件中或下载字符串。

让我们尝试一个基于上述步骤的示例,并尝试以字节为单位获取 Google 主页。

#pragma comment(lib, "urlmon.lib")
#include <urlmon.h>
#include <cstdio>
#include <iostream>
#include <string>
#define getURL URLOpenBlockingStreamA

using namespace std;


int main() {


    IStream* DemoStream;
    const char* SourceURL = "http://google.com";


    if (getURL(0, SourceURL, &DemoStream, 0, 0)) {
        cout << "An Error has occured.";
        cout << "Please Check the internet";
        cout << "Please Check the source URL.";
        return -1;
    }

    // this char array will be filled with bytes from the URL
    char DemoBuff[100];
    // keep appending the bytes to this string
    string DemoStr;
    unsigned long Bytes_Read;

    while(true) {
        DemoStream->Read(DemoBuff, 100, &Bytes_Read);
        if(0U == Bytes_Read) {

            break;
        }
        // appending and collecting to the string
        DemoStr.append(DemoBuff, Bytes_Read);
    };

    DemoStream->Release();
    cout << DemoStr << endl;
    return 0;

}

上面的代码将以字节字符串形式获取 Google 主页; 虽然以字节串的形式下载东西效率不高,但我们也可以将字节保存在文件中供以后使用。 上述代码的输出将是一长串字节。

确保使用与第一个代码相同的编译器运行上述代码,因为 URLOpenBlockingStream 也不适用于 MinGW C++ 编译器。

上一篇:C++ 函数末尾的常量

下一篇:没有了

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

C++ 函数末尾的常量

发布时间:2023/08/27 浏览次数:197 分类:C++

本文介绍在 C++ 函数末尾使用 const 关键字。C++ 函数末尾的 const 关键字 const 成员函数是一旦声明就不再更改或修改的函数。

C++ 模板多种类型

发布时间:2023/08/27 浏览次数:72 分类:C++

本文介绍了 C++ 中多类型模板的使用。C++ 模板多种类型 C++ 中的模板可以定义为创建通用函数和类的公式蓝图。

C++ 类中的辅助函数

发布时间:2023/08/27 浏览次数:73 分类:C++

本文介绍如何在 C++ 类中实现辅助函数。类中的 C++ 辅助函数 辅助函数是一种不由最终用户实例化的函数,但提供在另一个类内部使用的有用功能。

C++ 中的结构体继承

发布时间:2023/08/27 浏览次数:84 分类:C++

结构体和类很相似,但不同之处在于它们对面向对象编程中其他类或函数的可访问性。默认情况下,结构被指定为公共的,而类是私有的。 并且在继承中,我们不能继承私有指定的类; 我们必

C++ 中 Struct 和 Typedef Struct 的区别

发布时间:2023/08/27 浏览次数:94 分类:C++

This is a brief article about the difference between struct and typedef struct in C++.这篇小文章将讨论 C++ 中的关键字 typedef。 我们还将讨论 C++ 中简单结构和 typedef 结构之间的区别。C/C++ 中的 typedef 关键字 type

C++ 结构体默认值初始化

发布时间:2023/08/26 浏览次数:200 分类:C++

本文将介绍如何在 C++ 中初始化结构体中的默认值。在 C++ 中初始化结构中的默认值 初始化默认值主要有两种方法; 第一个是使用构造函数,第二个是不使用构造函数。

C++ 匿名结构体

发布时间:2023/08/26 浏览次数:159 分类:C++

本文介绍了 C++ 中匿名结构的使用。C++ 中的匿名结构体 C++ 不支持匿名结构体,因为 C 语言也不支持匿名结构,但与 C 不同,C++ 确实支持匿名联合。

在 C++ 中实现具有多个条件的 if 语句

发布时间:2023/08/26 浏览次数:185 分类:C++

C++ 逻辑运算符 && 或 || 可在 if 语句中使用以同时检查多个条件。本文将详细讨论如何在 C++ 中使用具有多个条件的 if 语句,并结合相关示例。

C++ 中的运算符优先级和结合性

发布时间:2023/08/26 浏览次数:178 分类:C++

本文将讨论 C++ 中的运算符以及它们在表达式中使用时如何求值。 它们的操作有特定的规则,因此我们将研究它们以了解使用 C++ 运算符的表达式求值。C++ 中的运算符

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便