用 C++ 下载文件
本文介绍如何使用 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++ 下载为字节串
此方法使用 win32 API URLOpenBlockingStream 将文件下载为字节字符串,也可以将其保存在文件中。 这是一个棘手的逐步过程; 请按照以下步骤操作。
- 首先,使用 URLOpenBlockingStream 获取 URL 的 IStream 接口。
- 然后插入 HTTP 和 HTTPS 协议都可以使用的 URL。
- 一旦 IStream 可用,请使用读取函数下载字节。 这里我们可能需要使用循环。
- 一旦字节被收集到字符串中,我们就可以将它们保存到文件中或下载字符串。
让我们尝试一个基于上述步骤的示例,并尝试以字节为单位获取 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++ 函数末尾的常量
发布时间: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++ 中实现具有多个条件的 if 语句
发布时间:2023/08/26 浏览次数:185 分类:C++
-
C++ 逻辑运算符 && 或 || 可在 if 语句中使用以同时检查多个条件。本文将详细讨论如何在 C++ 中使用具有多个条件的 if 语句,并结合相关示例。
C++ 中的运算符优先级和结合性
发布时间:2023/08/26 浏览次数:178 分类:C++
-
本文将讨论 C++ 中的运算符以及它们在表达式中使用时如何求值。 它们的操作有特定的规则,因此我们将研究它们以了解使用 C++ 运算符的表达式求值。C++ 中的运算符