Nieprawidłowe zapisywanie danych przy wykorzystaniu CURLOPT_WRITEDATA

0

Cześć wszystkim,
Potrzebuje pomocy, mam do napisania program do pobierania plików za pomocą biblioteki curl. Napisałem już program który zapisuje listę plików do pobrania do pliku txt a następnie przeszukuje plik w celu połączenia linku z nazwą pliku i pobraniu go. Jak pobieram znaki do zmiennej i przechowuje je w zmiennej temp to wyświetla je poprawnie, natomiast w fragmencie kodu fp1 = fopen(temp,"wb"); nie wie co to jest i nie tworzy pliku o nazwie którą przechowuje temp. Identycznie jest w fragmencie curl_easy_setopt(curl1, CURLOPT_URL, str2);. Program nie sypie błędami.

Czy ktoś jest w stanie mi pomóc?

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


int main(void)
{
    char str[1000] = "ftp://ftp.ps.pl/pub/Linux/CentOS/6.9/isos/x86_64/";

    char str2[1000] = "";
    char pobierz [100];
    char bufor[256];
    CURL *curl;
    CURL *curl1;
    FILE *fp;
    FILE *fp1;
    CURLcode res;
    CURLcode res2;
    char plik[] = "lista.txt";

    curl = curl_easy_init();

    if(curl) {
        fp = fopen(plik,"wb");
        curl_easy_setopt(curl, CURLOPT_URL, str);
        curl_easy_setopt(curl, CURLOPT_DIRLISTONLY, 1L);
        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);
    }


    fp=fopen(plik,"r");

    while(fgets(bufor,256,fp)){
        printf("%s", bufor);
    }
    fclose(fp);

    printf("\n\n*************************************************************\n");
    printf("ktore pliki chszesz pobrac?\n");
    printf("wszystkie? - wpisz: \".\"\n");
    printf("typu  np:.txt? - wpisz: txt\n");
    printf("jezeli pojedynczy plik, wypisz go - wpisz: plik.html\n");

    scanf("%s", &pobierz);
    printf("%s",pobierz);

    printf("\n\n***************************************\n");

    int wiersz = 1;
    int zna_wiersz = 0;

    fp=fopen(plik,"r");
    char temp[]="";

    while(fgets(temp,512,fp) != NULL){

        if((strstr(temp, pobierz)) != NULL){

           curl1 = curl_easy_init();
            strcat (str2, str);

            printf("znaleziono plik w wierszu: %d\n", wiersz);
            printf("\n%s\n", temp);

            strcat (str2, temp);
            printf("%s",str2);


              if (curl1){
                    fp1 = fopen(temp,"wb");
                    curl_easy_setopt(curl1, CURLOPT_URL, str2);
                    curl_easy_setopt(curl1, CURLOPT_WRITEFUNCTION, NULL);
                    curl_easy_setopt(curl1, CURLOPT_WRITEDATA, fp1);
                    res2 = curl_easy_perform(curl1);
                    curl_easy_cleanup(curl1);
                    fclose(fp1);
                    str2[0]=0;
                }


            zna_wiersz++;
        }

        wiersz++;
    }

    if(zna_wiersz == 0){
        printf("\n Przykro nie znalezlismy plikow\n");
    }else{
        printf("\n%d\n",zna_wiersz);
    }

    if(fp){
        fclose(fp);
    }

    return 0;

}

0

Rzuć okiem na przykłady wykorzystania CURLOPT_WRITEFUNCTION / CURLOPT_WRITEDATA, ponieważ robisz to źle.

0

Znalazłem jedynie coś takiego ze strony https://curl.haxx.se/libcurl/c/ftpget.html :


    curl_easy_setopt(curl, CURLOPT_URL,
                     "ftp://ftp.example.com/curl/curl-7.9.2.tar.gz");
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);

    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile);
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
 
    res = curl_easy_perform(curl);
 
    curl_easy_cleanup(curl);
	}```


Muszę się przyznać, że jestem dosyć zielony z programowania i trzeba mi tłumaczyć jak krowie na rowie :)
0
Patryk27 napisał(a):

Rzuć okiem na przykłady wykorzystania CURLOPT_WRITEFUNCTION / CURLOPT_WRITEDATA, ponieważ robisz to źle.

Czy możesz wyjaśnić co robię źle?

0

Czy ktokolwiek może mi pomóc to napisać?

0
char temp[]="";

while(fgets(temp,512,fp) != NULL) { ... }
...

temp powinien mieć wielkość 512 bajtów, a ma 1. To się dobrze skończyć nie może...

0

Tu raczej to nie ma znaczenia, wydaje mi się, że jest tu problem z przekazaniem wartości do curl przez funkcję, tylko nie wiem jak to zrobić

0

Jak nie ma znaczenia? To jest ewidentny błąd. Popraw go po prostu, zamiast dywagować.

0
0x666 napisał(a):

Jak nie ma znaczenia? To jest ewidentny błąd. Popraw go po prostu, zamiast dywagować.

Bez sprawdzenia nie odpisywałbym, że nie działa.
Poprawione i działa tak samo jak poprzednio

0

Ale jest o jeden błąd mniej przynajmniej. fgets() dodaje na koniec linii znak '\n', być może to jest problemem. Usuwaj z każdej przeczytanej linii ten znak.

0

Zmienne w debug wyglądają jakąś dziwnie
screenshot-20180115120358.png

0
0x666 napisał(a):

Ale jest o jeden błąd mniej przynajmniej. fgets() dodaje na koniec linii znak '\n', być może to jest problemem. Usuwaj z każdej przeczytanej linii ten znak.

Pomogło usunięcie "entera" \n. Program działa prawidłowo.
Wielkie dzięki :)

0

A oto cały kod: działający poprawnie:

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

int main(void)
{
    char str[1000] = "ftp://ftp.ps.pl/pub/Linux/CentOS/6.9/isos/x86_64/";

    char str2[1000] = "";
    char pobierz [100];
    char bufor[256];
    CURL *curl;
    CURL *curl1;
    FILE *fp;
    FILE *fp1;
    CURLcode res;
    CURLcode res2;
    char plik[] = "lista.txt";

    curl = curl_easy_init();

    if(curl) {
        fp = fopen(plik,"wb");
        curl_easy_setopt(curl, CURLOPT_URL, str);
        curl_easy_setopt(curl, CURLOPT_DIRLISTONLY, 1L);
        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);
    }

    fp=fopen(plik,"r");

    while(fgets(bufor,256,fp)){
        printf("%s", bufor);
    }
    fclose(fp);

    printf("\n\n*************************************************************\n");
    printf("ktore pliki chszesz pobrac?\n");
    printf("wszystkie? - wpisz: \".\"\n");
    printf("typu  np:.txt? - wpisz: txt\n");
    printf("jezeli pojedynczy plik, wypisz go - wpisz: plik.html\n");

    scanf("%s", &pobierz);
    printf("%s",pobierz);

    printf("\n\n***************************************\n");

    int wiersz = 1;
    int zna_wiersz = 0;

    fp=fopen(plik,"r");
    char temp[512];
char buf[100];
    while(fgets(temp,512,fp) != NULL){

        if((strstr(temp, pobierz)) != NULL){
size_t len = strlen(temp);
if (len > 0 && temp[len-1] == '\n') {
        temp[--len] = '\0';
           curl1 = curl_easy_init();
            strcat (str2, str);
            strcat (str2, temp);

              if (curl1){
                    fp1 = fopen(temp,"wb");
                    curl_easy_setopt(curl1, CURLOPT_URL, str2);
                    curl_easy_setopt(curl1, CURLOPT_WRITEFUNCTION, NULL);
                    curl_easy_setopt(curl1, CURLOPT_WRITEDATA, fp1);
                    res2 = curl_easy_perform(curl1);
                    curl_easy_cleanup(curl1);
                    fclose(fp1);
                    str2[0]=0;
                } }

            zna_wiersz++;
        }

        wiersz++;
    }

    if(zna_wiersz == 0){
        printf("\n Przykro nie znalezlismy plikow\n");
    }else{
        printf("\n%d\n",zna_wiersz);
    }

    if(fp){
        fclose(fp);
    }

    return 0;

}

1 użytkowników online, w tym zalogowanych: 0, gości: 1