.net C++';获取';请求或如何下载文件以在C++;?

.net C++';获取';请求或如何下载文件以在C++;?,.net,c++,visual-c++,curl,libcurl,.net,C++,Visual C++,Curl,Libcurl,好吧,我花了三天的时间来尝试这个,下面是一个场景: 我想从Google下载一个“.csv”文件,然后用该文件中的数据进行处理。它适用于Win32控制台应用程序。我已经记下了后者,我一辈子都不知道如何下载这个文件。我听说过libcurl、curlpp、ptypes,它们是我自己开发的,只是使用.NET api,而且有人告诉过我很多次: …这只是一个GET请求 好吧,这一切都很好,但我肯定错过了一些东西,因为似乎每个人生来就知道如何做到这一点。为了解决这个问题,我一直在翻阅书籍,甚至在学习了一段时间

好吧,我花了三天的时间来尝试这个,下面是一个场景:

我想从Google下载一个“.csv”文件,然后用该文件中的数据进行处理。它适用于Win32控制台应用程序。我已经记下了后者,我一辈子都不知道如何下载这个文件。我听说过libcurl、curlpp、ptypes,它们是我自己开发的,只是使用.NET api,而且有人告诉过我很多次:

…这只是一个GET请求

好吧,这一切都很好,但我肯定错过了一些东西,因为似乎每个人生来就知道如何做到这一点。为了解决这个问题,我一直在翻阅书籍,甚至在学习了一段时间“C++的艺术”之后,我在LNKERR上遇到了一个巨大的问题

尽管如此,我从中学到了很多,但现在我只想知道如何做到这一点。C++的API非常缺乏,没有找到示例代码。在线教程几乎不存在。没有一本书认为这很重要

谁能给我扔个救生筏吗?我是一个处于边缘的人

编辑


“从谷歌”我的意思是我想下载一个他们托管的.csv文件。例如,C++本身并没有API。要执行GET请求,您的程序需要打开到相关站点的TCP套接字连接,并通过套接字发送信息以符合HTTP规范,请参阅。可能有许多库可以帮助您完成这一任务,例如,您可以查看开放源代码程序wget使用了什么。如果您自己编写,那么使用数据包嗅探工具会很有帮助。您可以准确地看到浏览器发送到web服务器以获取文件的内容,并准确地发送该消息。不太难,但很难。TCP最初是一个相当大的学习曲线

顺便问一下,你所说的“来自谷歌”是什么意思?

你应该能够随心所欲

现在我已经回答了你的问题。为什么C++?没有什么不利于语言,但要为工作选择最好的语言。Perl、PHP和Python(我相信还有更多)都有关于此类操作的优秀文档和支持

在perl(我熟悉的一种)中,它只有大约3-5行代码


以下是代码片段(来自):

/*
*这是如何从内部使用libcurl的一个非常简单的示例
* C++程序。基本思想是,您希望检索
*以字符串形式显示网页的内容。显然,你可以替换
*缓冲区对象包含您想要的任何内容,并在其他位置进行调整
*因此。
* 
*希望你觉得有用。。
* 
*托德·帕帕亚诺
*/
#包括
#包括
#包括“curl/curl.h”
使用名称空间std;
//在这里写下任何错误
静态字符错误缓冲区[CURL_ERROR_SIZE];
//在此处写入所有预期数据
静态字符串缓冲区;
//这是curl使用的writer回调函数
静态int writer(字符*数据、大小、大小),
std::字符串*缓冲区)
{
//我们将返回什么
int结果=0;
//缓冲区里有东西吗?
if(缓冲区!=NULL)
{
//将数据附加到缓冲区
缓冲区->附加(数据,大小*nmemb);
//我们写了多少?
结果=大小*nmemb;
}
返回结果;
}
//你知道这是干什么的。。
无效用法()
{

cout<<“curltest:\n”由于您是在Win32平台上,因此有一个内置库可用于以相对简单的方式实现GET请求:WinInet,它是Win32 SDK的一部分。可以在MSDN上找到

请注意,如果您不熟悉Win32 API,前面将有一些粗略的修改。这里有一个非常有用的示例代码块


如果未能将适当的库引用添加到项目中,您将收到链接器错误。听起来您已经从中吸取了一些教训,因此我将保留它,但请确保您将在Win32文档中找到所需的库引用和头文件引用(您只需了解页面上的位置即可找到它)。

为什么不使用已经存在的内容


标准库不能这样做。因为它是win32,所以可以按照Paul Keister的建议进行操作

但是请看一下,既然你在C++中,我建议它也是非常有用的。它们是非常方便的工具!

< P>另一个选项是,它也附带Windows。< /P> < P> >没有找到代码< /P>

几十个样品已经贴了15年了。。 参见api ngnews://comp.os.ms-windows.programmer.win32 (C中的样本)


(com,Int等)

我也一直在寻找一个好的C++ HTTP库,但是没有找到“完美”的LIB。对于一个简单的HTTP库来说,它是很棒但很低的级别(虽然是一个好的开始)。(CPP NETLIB)看起来像是在轨道上,在ASIO的顶部构建一个更高级的API,但是不是很成熟。 除非我能找到更好的选择,否则我要么围绕asio编写我自己的包装器,要么扩展(并贡献)cpp netlib


(BTW LILCURL不是我的更好选择。它比我想要的API大得多,对于HTTP客户端,尤其是C++,非常笨拙。不要误会,它是一个很棒的库,但不适合简单的HTTP客户端。)。涉及另一个进程似乎很愚蠢,尤其是在需要快速下载的情况下。Jesse--用libcurl命令行多花五分钟下载文件,而不是花三天多的时间根本不获取文件,这似乎并不愚蠢。我尝试过这个方法,遇到了很多问题,但从未真正下载过文件。Also请注意,如果您获得“LPSCTWR”conver,请稍后查看此内容的任何人

/*
 * This is a very simple example of how to use libcurl from within 
 * a C++  program. The basic idea is that you want to retrieve the 
 * contents of a web page as a string. Obviously, you can replace 
 * the buffer object with anything you want and adjust elsewhere 
 * accordingly.
 * 
 * Hope you find it useful..
 * 
 * Todd Papaioannou
 */

#include <string>
#include <iostream>
#include "curl/curl.h"

using namespace std;

// Write any errors in here
static char errorBuffer[CURL_ERROR_SIZE];

// Write all expected data in here
static string buffer;

// This is the writer call back function used by curl
static int writer(char *data, size_t size, size_t nmemb,
                  std::string *buffer)
{
  // What we will return
  int result = 0;

  // Is there anything in the buffer?
  if (buffer != NULL)
  {
    // Append the data to the buffer
    buffer->append(data, size * nmemb);

    // How much did we write?
    result = size * nmemb;
  }

  return result;
}

// You know what this does..
void usage()
{
  cout < < "curltest: \n" << endl;
  cout << "  Usage:  curltest url\n" << endl;
} 

/*
 * The old favorite
 */
int main(int argc, char* argv[])
{
  if (argc > 1) 
  {
    string url(argv[1]);

    cout < < "Retrieving " << url << endl;

    // Our curl objects
    CURL *curl;
    CURLcode result;

    // Create our curl handle
    curl = curl_easy_init();

    if (curl)
    {
      // Now set up all of the curl options
      curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);
      curl_easy_setopt(curl, CURLOPT_URL, argv[1]);
      curl_easy_setopt(curl, CURLOPT_HEADER, 0);
      curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
      curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
      curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);

      // Attempt to retrieve the remote page
      result = curl_easy_perform(curl);

      // Always cleanup
      curl_easy_cleanup(curl);

      // Did we succeed?
      if (result == CURLE_OK)
      {
        cout << buffer << "\n";
        exit(0);
      }
      else
      {
        cout << "Error: [" << result << "] - " << errorBuffer;
        exit(-1);
      }
    }
  }
}