Skip to content

Latest commit

 

History

History
188 lines (129 loc) · 9.8 KB

README-ptbr.md

File metadata and controls

188 lines (129 loc) · 9.8 KB

get_next_line - @42sp

ℹ️ Uma função em C que lê qualquer arquivo válido linha por linha até o final

104/100

Índice

O que é get-next-line?

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.

Requisitos

⚠️ O projeto deve estar de acordo com a Norma

A Norma é um padrão de programação que define um conjunto de regras a seguir ao escrever um código na 42. A norma aplica-se a todos os projetos C dentro do currículo interno por padrão, e para qualquer projeto onde é especificado. Aqui algumas das regras:
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.

Como funciona?

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.

Como eu uso 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);

Como eu testo?

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:

68747470733a2f2f692e696d6775722e636f6d2f75344c6936414d2e706e67

42 Cursus

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

Autor

Augusto Becker | acesar-l | 🇧🇷👨‍🚀

👋 Fale comigo: