ℹ️ Uma função em C que lê qualquer arquivo válido linha por linha até o final
104/100 ✅
- O que é get-next-line?
- Requisitos
- Como funciona?
- Como eu uso a Função?
- Como eu testo?
- 42 Cursus
- Autor
O segunda projeto na 42. É uma função em C que retorna uma linha lida de um file descriptor. Em resumo, pode ler qualquer arquivo válido e faz isso linha por linha para otimizar memória, uma vez que o tamanho do arquivo é desconhecido. É uma função extremamente útil e pode ser usada em projetos futuros dentro da 42.
Cada função dever ter no máximo 25 linhas, não contando suas próprias chaves '{}'.
Cada linha deve ter no máximo 80 colunas de largura, comentários incluídos.
Uma função pode ter no máximo 4 parâmetros definidos.
Não podem ser declaradas mais que 5 variáveis por função.
Não é permitido o uso de: for , do...while , switch , case , goto ,
operadores ternários como `?' e VLAs - Matrizes de comprimento variável.
A norminette (como chamamos a norma na 42) é feita em python e é open source.
O repositório está disponível em https://github.com/42School/norminette
Além da norma padrão, o projeto tem alguns requisitos próprios
É proibido declarar variáveis globais.
Sua leitura deve usar o BUFFER_SIZE definido durante a compilação para ler de um
arquivo ou do stdin. Esse valor será modificado durante a avaliação para fins de
teste.
O programa será compilado dessa forma:
gcc -Wall -Wextra -Werror -D BUFFER_SIZE=42 <arquivos>.c.
A libft não é autorizada para este projeto. você deve adicionar um arquivo
get_next_line_utils.c que vai conter as funções que você precisa para a sua
get_next_line funcionar.
✨ Para este projeto fomos apresentados ao conceito de variáveis estáticas ✨
ℹ️ Uma variável estática é alocada "estaticamente", o que significa que seu tempo de vida é toda a execução do programa.
A linha é por definição uma string encerrada em "\n" (quebra de linha) ou "EOF" (para o fim do arquivo) e que, segundo o subject, deve ser lida em um buffer de tamanho definido na compilação. A get_next_line roda a função read e guarda o que foi lido durante a chamada só então procura por um "\n" - quando encontra sabemos que chegamos ao fim da linha, caso não encontre o "\n" mas o read retorne 0 sabemos que não tem nada à frente para ser lido (EOF), nos outros casos, simplesmente não chegamos ao final da linha, o que foi lido é armazenado na linha que vai ser retornada e seguimos na leitura do arquivo. Na maioria das vezes o buffer não condiz com o tamanho exato da linha, e também não é possível reler o mesmo trecho da linha, o que gera um dos maiores problemas no desenvolvimento da get_next_line: O que aconteceria nesses casos em que, por exemplo, o BUFFER_SIZE é de 10 caracteres e a linha acaba no 6º caracter? Os 4 caracteres restantes após a quebra de linha seriam perdidos e a leitura continuaria no próximo buffer de 10 caracteres. Para resolver isso, usamos a variável estática como um backup, para guardar esses caracteres que sobram. E quando a função é chamada novamente, uma das primeiras coisas feitas é checar se há algo no backup e se houver, começar a nova linha a partir dali. No geral é assim que ela funciona, outros detalhes de funcionamento são mais técnicos e achei melhor deixá-los de fora dessa explicação, mas você pode conferir checando a função.
O objetivo é criar uma bilioteca chamada libgetnextline.a feita com os arquivos fonte.Para criar a biblioteca, clone o projeto:
git clone https://github.com/augustobecker/get_next_line get_next_line
Entre no repositório:
cd get_next_line
Rode esse comandos para transformar os arquivos em objetos:
clang -Wall -Werror -Wextra -c get_next_line.c -o get_next_line.o
clang -Wall -Werror -Wextra -c get_next_line_utils.c -o get_next_line_utils.o
E esse outro para criar a biblioteca
ar -rcs libgetnextline.a get_next_line.o get_next_line_utils.o
Você deve ver um arquivo libgetnextline.a e alguns arquivos objeto (.o).
Você pode remover os arquivos .o
rm -f get_next_line.o get_next_line_utils.o
Agora, só precisa adicionar esse cabeçalho nos seus arquivos .c e usar as funções da libgetnextline:
#include "get_next_line.h"
Se tentar compilar seus arquivos com clang usando "clang exemplo.c" vai receber um erro de undefined symbol para as funções da biblioteca.
Você deve mostrar qual é a biblioteca:
clang exemplo.c libgetnextline.a
É isso, agora basta executar com ./a.out
Agora, se estiver buscando uma forma de utilizar essa função, aqui vai uma demonstração prática:
char *full_file;
char *line_temp;
int file_fd
file_fd = open(argv, O_RDONLY);
if (file_fd == -1)
ft_error_msg("The Map couldn't be opened. Invalid fd");
full_file = ft_strdup("");
while (true)
{
full_file = get_next_line(file_fd);
if (line_temp == 0)
break ;
full_file(full_file, line_temp);
free(line_temp);
}
close(file_fd);
return (full_file);
Para testar o código vamos usar um Tester para a get_next_line feito pelo @jgambard. Há vários outros bons testers mas hoje vou cobrir apenas esse.
Para testar o código desse repositório: Clone o repositório e entre nele:
git clone https://github.com/augustobecker/get_next_line get_next_line
cd get_next_line/
Agora, clone o gnlTester do @jgambard
git clone https://github.com/Tripouille/gnlTester Tester_get_next_line
Entre na pasta do Tester e rode o teste mandatório:
cd Tester_get_next_line
make m
Se você fez tudo corretamente, deve ver algo como isso:
A 42 é uma iniciativa educacional global que propõe uma nova forma de aprender tecnologia: sem professores, sem salas de aula, estudantes aprendendo com seus colegas estudantes (Aprendizado peer to peer), com uma metodologia que desenvolve habilidades de computação e da vida. Sem mencionar que é completamente gratuita e aberta para todos, sem pré-requisitos.
As admissões na 42 são diferentes de outras escolas. Usamos um processo de admissão baseado em mérito. O passo final no processo é a Piscina - parte parte do processo seletivo que requer 4 semanas de código intenso e imersivo. Não é necessário experiência anterior em programação.
Você pode conferir mais sobre o processo de admissão no site da 42sp: https://www.42sp.org.br
ou no meu repositório do github: 42 Piscine
Para ver outros projetos da 42 desenvolvidos por mim, clique aqui: 42 Cursus