<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>
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:
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.
É 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?
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)