Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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.**