2009-10-28 4 views
49

Dev-C++을 사용하는 Windows에서 응용 프로그램을 빌드하고 파일을 다운로드하려고합니다. libcurl을 사용하여이 작업을 수행하고 있습니다. 이미 packman을 사용하여 소스 코드를 설치했습니다. 작업 예제 (http://siddhantahuja.wordpress.com/2009/04/12/how-to-download-a-file-from-a-url-and-save-onto-local-directory-in-c-using-libcurl/)를 찾았지만 다운로드가 완료된 후에 파일을 닫지 않습니다. c 또는 C++로 파일을 다운로드하는 방법에 대한 예제를 누군가에게 제공하고 싶습니다. 미리 감사드립니다!C/C++에서 libcurl을 사용하여 파일 다운로드

+6

나는 당신의 질문을 투표를하고 싶었다, 그러나 당신의 대답은 나를하지에했다. , ccHRyU1T.o WRITE_DATA에 _main (무효 * : –

답변

179

사용중인 예제가 잘못되었습니다. easy_setopt에 대한 매뉴얼 페이지를 참조하십시오. 이 예에서 write_data는 자체 FILE, * outfile을 사용하고 CURLOPT_WRITEDATA에 지정된 fp는 사용하지 않습니다. 그래서 fp를 닫으면 문제가 발생합니다. 심지어 열리지도 않습니다.

이다가 (테스트 여기가 없습니다 libcurl에) 어떻게 보일지 다소

#include <stdio.h> 
#include <curl/curl.h> 
/* For older cURL versions you will also need 
#include <curl/types.h> 
#include <curl/easy.h> 
*/ 
#include <string> 

size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) { 
    size_t written = fwrite(ptr, size, nmemb, stream); 
    return written; 
} 

int main(void) { 
    CURL *curl; 
    FILE *fp; 
    CURLcode res; 
    char *url = "http://localhost/aaa.txt"; 
    char outfilename[FILENAME_MAX] = "C:\\bbb.txt"; 
    curl = curl_easy_init(); 
    if (curl) { 
     fp = fopen(outfilename,"wb"); 
     curl_easy_setopt(curl, CURLOPT_URL, url); 
     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); 
     curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); 
     res = curl_easy_perform(curl); 
     /* always cleanup */ 
     curl_easy_cleanup(curl); 
     fclose(fp); 
    } 
    return 0; 
} 

업데이트 : @rsethc types.heasy.h에 의해 제안 현재 컬 버전에 존재하지 않는 더 이상.

+1

나는이 (OSX에서) 시도하지만 난 받고 있어요 :에서 참조 "___gxx_personality_v0": 경고 : '의 char *' 정의되지 않은 심볼 상수 문자열에서 사용되지 않는 변환 부호없는 길이, 부호없는 long, __sFILE *) in ccHRyU1T.o CIE in ccHRyU1T.o ld : 기호를 찾을 수 없습니다. collect2 : ld가 1을 반환했습니다. 종료 상태 제발 도와주세요 !! – TCB13

+0

@ TCB13 내가 쓴 프로그램은 C++가 아니라 C++이다. C로 재 컴파일하면 문제가 없어집니다. – fvu

+8

+1 왜냐하면 코드는 거의 동일하기 때문에 OP가 이것을 대답으로 선택해야한다고 생각하기 때문입니다. – alexy13

14

관심이있는 사용자는 반환 된 데이터를 추가 처리하지 않으려는 경우 마지막 매개 변수로 NULL을 전달하여 사용자 지정 함수를 작성하지 않아도됩니다.
이 경우 기본 내부 기능이 사용됩니다.

세부
http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTWRITEDATA

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

int main(void) 
{ 
    CURL *curl; 
    FILE *fp; 
    CURLcode res; 
    char *url = "http://stackoverflow.com"; 
    char outfilename[FILENAME_MAX] = "page.html"; 
    curl = curl_easy_init();                                                               
    if (curl) 
    { 
     fp = fopen(outfilename,"wb"); 
     curl_easy_setopt(curl, CURLOPT_URL, url); 
     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL); 
     curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); 
     res = curl_easy_perform(curl); 
     curl_easy_cleanup(curl); 
     fclose(fp); 
    } 
    return 0; 
} 
+0

이것은 작동하지 않습니다. Windows. Windows에서 설정해야합니다. CURLOPT_WRITEFUNCTION가 null가 아니면, 크래쉬가 발생한다 https://curl.haxx.se/libcurl/c/CURLOPT_WRITEDATA.html –

+0

@PhilRosenberg 여기 https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION부터는 불행한 일입니다.html # DESCRIPTION 명시 적으로 설명 : "콜백 대신 내부 기본 함수를 가져 오려면이 옵션을 NULL로 설정하십시오."그래서 "이 옵션을 설정하면 CURLOPT_WRITEFUNCTION을 사용해야합니다 (예 : libcurl을 win32 DLL로 사용하는 경우). 또는 당신은 충돌을 경험할 것입니다. " 다시 내부 기능이 사용되어야하므로 효과가 없어야합니다. – Petar

관련 문제