Solucionado (ver solução)
Solucionado
(ver solução)
12
respostas

NÃO BAIXOU A URL DA CNN

Alura Team, podem me ajudar, por favor? Compilei o programa que baixa uma url utilizando a libcurl : #include <stdio.h> #include <curl/curl.h>

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

curl = curl_easy_init();
if(curl){
    curl_easy_setopt(curl, CURLOPT_URL, "http://www.cnn.com/");
    res = curl_easy_perform(curl);
    /* always cleanup */
    curl_easy_cleanup(curl);
}

return 0;

}

Utilizando o seguinte makefile: CC=gcc CFLAGS=-I/usr/include/curl LDFLAGS=-lcurl

program: main.o $(CC) -o program main.o $(LDFLAGS)

main.o: main.c $(CC) -c -o main.o main.c $(CFLAGS)

clean: rm -f program main.o

A compilação gerou o executável program.

![Rodei o programa na VM Ubuntu Destop com interface gráfica, conforme a imagem abaixo:

Mas, a URL da CNN não foi baixada ,

12 respostas

Porém, não foi baixada a URL da CNN:

Mas, não foi baixada a URL da CNN

Olá, Alberto!

Analisando o código que você compartilhou, parece que o programa está configurado para fazer uma requisição para a URL da CNN, mas não há nenhuma função implementada para salvar o conteúdo baixado. A função curl_easy_perform realiza a requisição, mas o conteúdo obtido é exibido no stdout (saída padrão), que é o terminal, por padrão.

Para salvar o conteúdo em um arquivo, você precisa definir uma função de callback para escrever os dados recebidos. Vou deixar uma sugestão de como você pode tentar modificar o seu código para salvar o conteúdo em um arquivo chamado "output.txt":

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

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;
    CURLcode res;
    FILE *fp;

    curl = curl_easy_init();
    if(curl) {
        fp = fopen("output.txt", "wb");
        if(fp == NULL) {
            perror("Não foi possível criar o arquivo");
            return 1;
        }

        curl_easy_setopt(curl, CURLOPT_URL, "http://www.cnn.com/");
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
        
        res = curl_easy_perform(curl);
        
        /* Check for errors */
        if(res != CURLE_OK) {
            fprintf(stderr, "curl_easy_perform() falhou: %s\n", curl_easy_strerror(res));
        }

        /* always cleanup */
        curl_easy_cleanup(curl);
        fclose(fp);
    }
    
    return 0;
}

Neste exemplo, a função write_data é usada como função de callback para escrever os dados no arquivo "output.txt". Você precisa passar essa função para o curl_easy_setopt com a opção CURLOPT_WRITEFUNCTION, e o ponteiro para o arquivo com a opção CURLOPT_WRITEDATA.

Compile novamente o programa com o seu makefile e execute o executável program. Se tudo estiver correto, o conteúdo da URL especificada será salvo no arquivo "output.txt".

Espero ter ajudado e bons estudos!

Boa tarde Renan, obrigadíssimo pela passagem de conhecimento. Utilizei a CURLOPT_WRITEFUNCTION informando a função de call back write_data, e na CURLOPT_WRITEDATA informei o handle do arquivo output.txt.

Porém, o arquivo output.txt foi gravado,  com 0 bytes.

Mas, o arquivo output.txt foi salvo com 0 bytes.

digitando a url www.cnn.com no firefox da VM Ubuntu Desktop

www.cnn.com no Firefox da VM Ubuntu Desktop com interface gráfica

[Mas,o arquivo output.txt foi salvo com 0 bytes**] https://cdn1.gnarususercontent.com.br/1/362808/75f17188-9202-4f99-8e4b-cb18b5e4770d.png)

Mas,o arquivo output.txt foi salvo com zero bytes,conforme a imagem abaixo

Substituí a url de: http://www.cnn.com/ para: https://linuxhint.com/exec_linux_system_call_c/ e foi "correr pro abraço". Seu conteúdo foi baixado no output.txt com 92.739 bytes. Seguem as imagens: LINUXHINT.COM_EXEC_LINUX_SYSTEM_CALL_C

Executando program

output.txt gerado

arquivo main.c utilizado :

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

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; CURLcode res; FILE *fp;

curl = curl_easy_init();
if(curl) {
    fp = fopen("output.txt", "wb");
    if(fp == NULL) {
        perror("Não foi possível criar o arquivo");
        return 1;
    }

    curl_easy_setopt(curl, CURLOPT_URL, "https://linuxhint.com/exec_linux_system_call_c/");
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
    
    res = curl_easy_perform(curl);
    
    /* Check for errors */
    if(res != CURLE_OK) {
        fprintf(stderr, "curl_easy_perform() falhou: %s\n", curl_easy_strerror(res));
    }

    /* always cleanup */
    curl_easy_cleanup(curl);
    fclose(fp);
}

return 0;

}

solução!

imagem de uma parte do arquivo output.txt com a url sobre Exec-System-Call-in-C:

**Valeu Renan.**