2013-09-23 2 views
0

Я выполнив следующий завиток вызов для чтения данных с моего сайта:Curl Ошибка записи при попытке записи данных, считанных в файл

curl_easy_setopt(handle, CURLOPT_URL, "http://mysite.com"); 
    curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, write_data); 
    CURLcode code = curl_easy_perform(handle); 

Это мой метод обратного вызова, write_data:

size_t write_data(void *buffer, size_t len, size_t nmemb, void *userp) { 
    const char* _file = "file_path"; 
    FILE* _dataFile = fopen(_file, "a+"); 
    if (!_dataFile) { 
     logMsg("Failed to open file to write to it"); 
     exit(EXIT_FAILURE); 
    } 
    int num = fprintf(_dataFile, "%s", (char *) buffer); 
    fclose(_dataFile); 
    return num; 
} 

Я получаю данные в кусках и на gdb'ing Я понял, что в последнем вызове я получаю 12303 байта, но пишу 12310. Мне кажется, что проблема в том, как я пишу файл содержимого, путем переноса буфера на символ.

Итак, мой вопрос - это лучший способ записи данных (в файл), чтение из вызова Curl без дополнительной копии? Если я сделаю копию буфера, полученную malloc'ing массивом символов с байтами nmemb и добавив это в файл, этот метод будет успешным.

Я также хотел бы знать, есть ли какая-либо другая функция для записи форматированных данных в файл, который я могу использовать вместо fprintf.

ответ

2

Ваше использование fprintf() в этом есть причина. Буфер, который вы передали обратному вызову из libcurl, равен , но не нуль завершен, поэтому вы не можете предположить, что% s и fprintf() будут поступать правильно, даже если это может быть во многих случаях по чистой случайности.

Используйте fwrite() или аналогичный вместо этого и сообщите размер буфера для вывода!

 Смежные вопросы

  • Нет связанных вопросов^_^