使用C std libs从url读/写文件的最佳方法

使用C std libs从url读/写文件的最佳方法,c,linux,stdio,read-write,C,Linux,Stdio,Read Write,我正在构建一个简单的C程序,它使用scanf()获取用户输入参数(URL),如下代码所示。我现在正在寻找将远程文件读/写到本地文件的最佳“标准”方式。。。然后我将在新的本地源文件上执行grep(搜索)操作 //代码 #include <stdio.h> int main(void){ char url[255]; //USER INPUT URL printf("ENTER URL: "); scanf("%s", &url); //GET

我正在构建一个简单的C程序,它使用
scanf()
获取用户输入参数(URL),如下代码所示。我现在正在寻找将远程文件读/写到本地文件的最佳“标准”方式。。。然后我将在新的本地源文件上执行grep(搜索)操作

//代码

#include <stdio.h>

int main(void){
   char url[255];

   //USER INPUT URL
   printf("ENTER URL: ");
   scanf("%s", &url);

   //GET FILE AT URL(REMOTE) AND COPY TO (LOCAL) 




   //RETURN
   return 0;
}
#包括
内部主(空){
字符url[255];
//用户输入URL
printf(“输入URL:”);
scanf(“%s”和&url);
//从URL(远程)获取文件并复制到(本地)
//返回
返回0;
}

您可以使用libcurl,也可以直接使用
wget
curl

char command[1024];
snprintf(command, 1024, "wget -c '%s'", url);
system(command); // add error handling

这将大大减少工作量。

您可以使用创建一个
fork()
并使用
execl
execl
执行类似于
wget
curl
的命令,
execlp
在您可以使用
fgets
读取该文件并使用
fputs
添加行之后,我认为您正在寻找某种html解析器,有可能包括curl lib:

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

#define FILE_SIZE 10000

int main(void)
{
curl_global_init(CURL_GLOBAL_ALL);

CURL * myHandle;
CURLcode setop_result;
FILE *file;

if((file = fopen("webpage.html", "wb")) == NULL)
{
    perror("Error");
    exit(EXIT_FAILURE);
}

if((myHandle = curl_easy_init()) == NULL)
{
    perror("Error");
    exit(EXIT_FAILURE);
}

if((setop_result = curl_easy_setopt(myHandle, CURLOPT_URL, "http://cboard.cprogramming.com/")) != CURLE_OK)
{
    perror("Error");
    exit(EXIT_FAILURE);
}

    if((setop_result = curl_easy_setopt(myHandle, CURLOPT_WRITEDATA, file))     != CURLE_OK)
{
    perror("Error");
    exit(EXIT_FAILURE);
}

if((setop_result = curl_easy_perform(myHandle)) != 0)
{
    perror("Error");
    exit(EXIT_FAILURE);
}
curl_easy_cleanup(myHandle);
fclose(file);
puts("Webpage downloaded successfully to webpage.html");

return 0;
}
#包括
#包括
#包括
#定义文件大小为10000
内部主(空)
{
curl\u global\u init(curl\u global\u ALL);
卷曲*我的手柄;
CULLCODE setop_结果;
文件*文件;
if((file=fopen(“webpage.html”,“wb”))==NULL)
{
佩罗(“错误”);
退出(退出失败);
}
if((myHandle=curl\u easy\u init())==NULL)
{
佩罗(“错误”);
退出(退出失败);
}
如果((setop_result=curl_easy_setopt)(myHandle,CURLOPT_URL,)http://cboard.cprogramming.com/)!=CURLE_OK)
{
佩罗(“错误”);
退出(退出失败);
}
if((setop_result=curl_easy_setopt(myHandle,CURLOPT_WRITEDATA,file))!=CURLE_OK)
{
佩罗(“错误”);
退出(退出失败);
}
如果((setop\u result=curl\u easy\u perform(myHandle))!=0)
{
佩罗(“错误”);
退出(退出失败);
}
卷曲轻松清洁(myHandle);
fclose(文件);
puts(“网页已成功下载到Webpage.html”);
返回0;
}
这是下面论坛中的第10条


上找到是的,我看了一下,很好用。。但是有一个标准的方法,不加载另一个第三方库。我不这么认为。你怎么会这么想?从Web服务器读取文件无论如何都不是一项琐碎的任务。只是人们总是这么做并不意味着这件事微不足道。高级编程语言的存在是有原因的!是的,我现在就把cmd发出去,吃午饭,等我回来测试时,我会把它标记正确的。谢谢,谢谢!!改善世界:每当您在发出的命令中使用外部输入时,请考虑安全后果:)Cheers@JordanDavis-或者,与其编写该程序,不如自己运行wget或curl。或者将其作为shell脚本来执行,以避免您必须键入
-c
部分。或者,如果这是为了学习经验,我会像sehe建议的那样使用libcurl来学习如何使用该库。或者自己使用低级套接字来学习它们,但是除非学习套接字是目标,否则这是获取远程文件的最困难的方法。相关:谢谢Hoenir,是的,基本上与上面的想法相同,我使用了fork()和curl,就像你在这里一样。是的,我对libcurl了如指掌,我只是在寻找一种很好的“标准”方法,如果有的话。我认为使用
execl
执行“curl”命令是唯一的方法。。。