<aside> 📃 O que precisei aprender pra construir o projeto get_next_line. Dicas, explicações, diagramas e código, compartilhando com o desejo de ajudar outres cadetes a entrarem mais rápido no projeto! Fique à vontade para comentar e contribuir!

</aside>

palavras-chave: variável estática, file descriptor (fd), leitura de arquivos

<aside> ⚠️ Sabemos que não é todo mundo que tem o privilégio de poder dedicar 100% do seu tempo integralmente para a 42. Estes guias surgiram com o objetivo de agilizar o processo de descobrir quais os conhecimentos necessários para conseguir resolver o problema proposto pelo projeto, economizando tempo valioso pra codar. Evitei ao máximo dar soluções prontas — porque desenhar, implementar, testar e construir a solução também faz parte do seu aprendizado na 42. Mesmo assim, esta página pode conter alguns spoilers de implementação, por isso, prossiga com precaução!

</aside>

Para entender antes de começar

Antes de mais nada, tenta fuçar no google como ler um arquivo em C. Quais funções eu uso? Como um arquivo é entendido dentro de um programa em C? O que representa o arquivo, é uma variável, um ponteiro, um número, um objeto (struct)? O que eu posso fazer com um arquivo usando a linguagem C? Dá uma brincada, tenta abrir um arquivo na main, depois muda o arquivo de endereço (cria uma pasta e coloca ele dentro), vê como o programa se comporta...

Estou descobrindo que para ler um arquivo, preciso antes abri-lo, e para abrir um arquivo tem duas funções (open() ou fopen()); para ler o arquivo tem duas funções (read() ou fgetc()), com argumentos diferentes e tal. Tenta encontrar exemplos de códigos que abrem e lêem um arquivo (independente das funções) e tenta entender o que está acontecendo primeiro. Depois começa a direcionar sua busca mais em direção à função read() em si, que é a função que o pdf permite usar. Daí em diante, segue a lista de assuntos que podem te ajudar a entender melhor o problema:

Função read()

Além de ler o manual, pega a função e tenta ler alguma coisa, um arquivo, input do terminal, dá uma brincada boa pra saber como ela funciona. O que acontece quando a função chega no final do arquivo? E se o buffer for muito maior do que a qtd de chars do arquivo? e se o buffer for 1? e se o arquivo estiver vazio? e se o arquivo não existir (fd aleatório)?

Faça diversos testes com a função read lendo um mesmo arquivo, alterando o buffer size, e observando o retorno da função, e o string q ela leu.

File descriptor

É um número que identifica um arquivo na hora de executar um programa. Qual o valor máximo de um file descriptor? Isso é o mesmo que a qtd máxima de arquivos que dá pra abrir de uma vez só em um programa?

O que é um macro e como defini-lo na compilação

Macros são fragmentos de código que recebem um nome, e a partir daí podem ser replicados (expandidos) em outras parte de um arquivo de código fonte (*.c), para conveniência de quem escreve o código. Expandir um macro é o mesmo que fazer um ctrl+C, ctrl+V de um trecho de código de um lugar para o outro, mas quem faz esse trabalho é o pré-processador, ao compilar o código que vc escreveu.

Pode parecer um conceito novo e estranho, mas você tem usado esse conceito há um tempão! O #include <algumalib.h> que usamos desde o basecamp é tipo um macro, aliás, um ótimo exemplo de “copiar código de algum lugar em outro”: a biblioteca que você quer importar com o include (por exemplo #include <stdio.h>) está salva em algum lugar no seu computador, provavelmente foi escrita por outra pessoa (ou vc mesme, no caso de #include "libft.h"), e o que essa linha de código faz é copiar pra dentro do seu arquivo de código-fonte (por ex. main.c) o conteúdo do header (stdio.h, que via de regra contém protótipos, às vezes funções inteiras).

Formalmente falando, tanto a inclusão de headers por meio do #include quanto a definição de macros por meio do #define são diretivas de pré-processamento, que é o passo intermediário que acontece entre você escrever seu código fonte e o código ser compilado e se transformar em um binário ou biblioteca estática. Esse artigo explica mais sobre o assunto:

Um macro pode definir várias linhas de código, como pode definir apenas um valor fixo. A Norma fala sobre macros e para esse projeto é importante que vc saiba o que pode e o que não pode fazer usando macros.

Como macros são diretivas de pré-processamento (que acontece antes da compilação), você pode criar macros quando escreve seu código (usando as

https://www.rapidtables.com/code/linux/gcc/gcc-d.html (utilizar essa flag para definir o BUFFER_SIZE)