GNL - get_next_line 42
Descrição
O get_next_line é um programa que retornar uma linha do arquivo lido.
O que sei até agora:
- File Descriptor (FD)
O file descriptor segundo o wikipedia é um indicador abstrato para indicar um arquivo.
No GNL iremos usar a função read()
da biblioteca <unistd.h>
.
read()
protótipo:
1 | ssize_t read(int fd, void *buf, size_t count); |
Anotações gerais.
[22/08/21]
O valor de fd
é recebido na main.c
através do função open()
, seria algo do tipo:
fd = open("arquivo", O_RDONLY)
e o valor recebido de fd
seria passado para o get_next_line
minhas principais dúvidas são:
- Como saber que é a próxima linha? [check: 24/08]
- a variável estática é usada para pegar a próxima linha? [check: 24/08]
[24/08/21]
Descobri que a func read()
volta a ler de onde o carrinho de leitura parou, essa era uma das preocupações que eu tive, de como eu controlaria para saber qual é a próxima linha.
Criei a função que lê a primeira parte e salva no buffer.
*Não funcionou como deveria
[27/08/21]
Como tinha alguns trabalhos que precisavam ser entregues na faculdade, não consegui retornar antes para o GNL.
Mostrar código
1 | while (!ft_strchr(save, '\n')) |
O protótipo funcionou, a ideia que eu tive é ir guardando o buffer até achar o '\n'
assim que ele acha o '\n'
na string static que eu guardo tudo que o buffer recebe, o while termina e eu retorno até o '\n'
e em seguida guardo o restante na própria string static.
[06/09/21]
Aparentemente tudo funcionando, exceto pelo TIME OUT
dado nos testes em que se tem um arquivo sem linha e muito grandes, mas vou tentar resolver assim que der.
Linha geral:
A função read_file
é autodescritiva, vou receber como parâmetro o fd do arquivo e a variavel estática. Nela eu crio um buffer com o tamnaho do BUFFER_SIZE
e uso a função read()
pra ler o arquivo até encontrar o final dele - que seria retornado 0 - ou até encontrar uma linha (\n
) , caso ocorra algum erro, o laço de repetição é parado, libero a variavel buffer que tinha mallocado e retorno NULL, caso contrário, uso a função ft_strjoin()
para juntar o conteúdo de backup com o buffer.
Mostrar código
1 | static char *read_file(int fd, char *backup) |
A função get_line()
faz o que o nome já diz, ela pega a linha. Como parâmetro ainda vamos usar o backup, faço uma verificação se a backup não está com o primeiro caracter como null byte ('\0'
), percorro ela inteira até achar uma ('\n'
) ou o final dela, crio com o malloc uma string com o tamanho que li + 2 espaços, pra caso haja um \n
, eu coloque ele e logo em seguida o (\0
) e retorno essa linha.
Mostrar código
1 | static char *get_line(char *backup) |
A última função é a remove_read_line()
que remove a linha lida. Ela recebe como parâmetro a static
, nela eu procuro até a quebra de linha \n
ou até chegar no final, se chega no final, dou um free na variável e retorno NULL
, senão, eu malloco uma nova variavel com o (tamanho total de backup, menos o tamanho da linha), copio o restante de backup pra uma nova variável e dou free nela.
Mostrar código
1 | static char *remove_read_line(char *backup) |