可以用fopen打开URL

foo*_*o_l 6 c linux file-io fopen

fopen("tftp://1.1.1.1/file.txt","rb");有效的声明吗?可以使用fopenC编程打开网址吗?

Dav*_*eri 6

不,但你可以使用libcurl,一个例子:

#include <stdio.h>
#include <curl/curl.h>

/*
 * This is an example showing how to get a single file from an FTP server.
 * It delays the actual destination file creation until the first write
 * callback so that it won't create an empty file in case the remote file
 * doesn't exist or something else fails.
 */ 

struct FtpFile {
  const char *filename;
  FILE *stream;
};

static size_t my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream)
{
  struct FtpFile *out=(struct FtpFile *)stream;
  if(out && !out->stream) {
    /* open file for writing */ 
    out->stream=fopen(out->filename, "wb");
    if(!out->stream)
      return -1; /* failure, can't open file to write */ 
  }
  return fwrite(buffer, size, nmemb, out->stream);
}


int main(void)
{
  CURL *curl;
  CURLcode res;
  struct FtpFile ftpfile={
    "curl.tar.gz", /* name to store the file as if succesful */ 
    NULL
  };

  curl_global_init(CURL_GLOBAL_DEFAULT);

  curl = curl_easy_init();
  if(curl) {
    /*
     * You better replace the URL with one that works!
     */ 
    curl_easy_setopt(curl, CURLOPT_URL,
                     "ftp://ftp.example.com/pub/www/utilities/curl/curl-7.9.2.tar.gz");
    /* Define our callback to get called when there's data to be written */ 
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
    /* Set a pointer to our struct to pass to the callback */ 
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile);

    /* Switch on full protocol/debug output */ 
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

    res = curl_easy_perform(curl);

    /* always cleanup */ 
    curl_easy_cleanup(curl);

    if(CURLE_OK != res) {
      /* we failed */ 
      fprintf(stderr, "curl told us %d\n", res);
    }
  }

  if(ftpfile.stream)
    fclose(ftpfile.stream); /* close the local file */ 

  curl_global_cleanup();

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

或(由@保罗为指出的),你可以管一个过程(如:wget url)有popen:

#include <stdio.h>

FILE *popen(const char *command, const char *mode);
int pclose(FILE *stream);

int main(void)
{
    /* wget -q = silent mode */
    FILE *cmd = popen("wget -q -O - ftp://debian.org/debian-security/README.security", "r");
    char result[1024];

    while (fgets(result, sizeof(result), cmd) != NULL)
        printf("%s", result);
    pclose(cmd);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


Pau*_*aul 5

fopen<stdio.h>没有做到这一点。

然而,没有什么能阻止某人编写一个被调用的函数fopen()来做其他事情。

FILE *popen(const char *command, const char *mode)可用于生成运行适当命令行工具(例如tftp或 )的进程wget,从而将远程资源下载到可从 C 代码访问的文件描述符中。popen() 调用的语法与您所展示的非常相似。但是,它缺少下载实用程序的程序名称。裸 url 或 ftp 地址不适用于popen().

看:

另请注意:

PHP 语言版本fopen() 确实打开了裸 URL。但是 PHP != C