2011-05-01 442 views
1

我試圖使用捲曲庫與此代碼我的服務器下載測試文件:段錯誤使用捲曲

#define CURL_STATICLIB 

#include <stdio.h> 
#include <curl/curl.h> 
#include <curl/types.h> 
#include <curl/easy.h> 
#include <string.h> 

size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) 
{ 
    size_t written; 

    written = fwrite(ptr, size, nmemb, stream); 
    return written; 
} 

int main(void) 
{ 
    CURL *curl; 
    FILE *fp; 
    CURLcode res; 

    char *url = "http://pixhost.tk/test.txt"; 
    char outfilename[FILENAME_MAX] = "/Users/Nathan/Desktop"; 
    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); 

     curl_easy_cleanup(curl); 
     fclose(fp); 
    } 

    return 0; 
} 

並且編譯,就像這樣:

$ gcc main.c -lcurl -o curltest 

但是,當我執行它我得到一個Segmentation Fault錯誤。我該怎麼做才能糾正這個問題?

回答

3

我不熟悉的捲曲,但兩件事情,如果我說廢話,可能會幫助你,所以請原諒我:

  1. char *url = "http://pixhost.tk/test.txt";是一個只讀字符串,因此將其更改爲const char *url = "http://pixhost.tk/test.txt";這可能揭示編譯期間的問題。
  2. 你不檢查fopen的結果,可能它失敗了,這說明了段錯誤,並且從你嘗試打開應該是目錄AFAIK的「/ Users/Nathan/Desktop」似乎對我來說很可能。
+0

我把我的賭注放在了2. – a3nm 2011-05-01 02:14:31

+0

我也是a3_nm。看起來他正試圖打開一個目錄進行寫入。 – 2011-05-01 03:07:01

0

這已經有一段時間,因爲我有捲曲的工作,我不知道這會導致一個段錯誤,我想你應該調用FWRITE這樣的:

fwrite(ptr, 1, nmemb * size, stream); 

因爲fwrite的返回數的元素寫入,而size不是(我不認爲)保證是一個。而且,因爲你返回的是fwrite返回的內容,所以我相信你的字節數比實際寫的少,因爲該函數應該返回它寫入的字節數。