No domínio da programação C, gerenciar entrada, saída e memória de maneira eficaz é fundamental. Para ajudá-lo a compreender esses conceitos críticos, get_next_line é um projeto onde você escreverá uma função que lê um arquivo linha por linha usando um descritor de arquivo. Cada invocação da função lê a próxima linha do arquivo, permitindo processar todo o conteúdo do arquivo, uma linha por vez.
Um descritor de arquivo é um número inteiro não negativo que identifica exclusivamente um arquivo aberto em um sistema. Quando um programa abre um arquivo, o sistema operacional retorna um descritor de arquivo que pode ser usado para fazer referência a esse arquivo em operações subsequentes, como leitura, gravação ou fechamento do arquivo. Descritores de arquivos são uma abstração usada pelo sistema operacional para gerenciar vários recursos de E/S, incluindo arquivos, soquetes e pipes.
0, 1 e 2 (entrada padrão, saída padrão e erro padrão) no Processo A são independentes e separados dos descritores de arquivo no Processo B. Esse isolamento garante que as operações de arquivo em um processo não interfiram com aquelas em outro.
Cada descritor de arquivo está associado a uma entrada na tabela do descritor de arquivo que contém informações essenciais sobre o arquivo. Isso inclui o caminho do arquivo, as permissões de acesso e o deslocamento atual, que rastreia a posição dentro do arquivo para operações de leitura/gravação. Essa estrutura permite que o sistema operacional gerencie vários arquivos abertos de forma eficiente e garanta o acesso correto e a manipulação dos dados.
Observe que os descritores de arquivo 0, 1 e 2 são reservados pelo sistema operacional para fluxos padrão. O descritor de arquivo 0 é usado para entrada padrão (stdin), que normalmente representa a entrada do teclado. O descritor de arquivo 1 é usado para saída padrão (stdout), que representa a saída para a tela ou terminal. O descritor de arquivo 2 é usado para erro padrão (stderr), que também representa a saída para a tela ou terminal, mas é especificamente destinado a mensagens de erro. Esses descritores de arquivos reservados garantem que as operações básicas de entrada e saída possam ser gerenciadas de forma consistente em diferentes programas e ambientes. Qualquer descritor de arquivo retornado pela função open será 3 ou superior, garantindo que não entre em conflito com esses fluxos padrão.
'#include
'
'#include' int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Error opening file");
return 1;
}
Um descritor de arquivo, representado como um número inteiro, é obtido usando a função open, que recebe dois parâmetros: o nome (ou caminho) do arquivo e sinalizadores que determinam as permissões de acesso do arquivo. Por exemplo, para ler o conteúdo de um arquivo, usamos o sinalizador O_RDONLY (somente leitura). Para ler e escrever, usamos o sinalizador O_RDWR. Embora existam muitos sinalizadores disponíveis, usaremos apenas O_RDONLY para este projeto. A função open retorna um número inteiro não negativo, que é o descritor do arquivo se a operação for bem-sucedida; caso contrário, retornará -1 para indicar um erro (você não tem permissão para acessar exemplo.txt). Observe que a função open está na biblioteca unistd.h e os sinalizadores de permissão são definidos em fcntl.h.
'#include
'
'#include'
'#include'
'#define BUFFER_SIZE 4'int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Error opening file");
return 1;
}
char buffer[BUFFER_SIZE];
read(fd, buffer, sizeof(buffer)-1);
printf("1st call : %s\n", buffer);
// prints the first 3 bytes
read(fd, buffer, sizeof(buffer)-1);
printf("2nd call : %s\n", buffer);
read(fd, buffer, sizeof(buffer)-1);
printf("3rd call : %s\n", buffer);
read(fd, buffer, sizeof(buffer)-1);
printf("4th call : %s\n", buffer);
read(fd, buffer, sizeof(buffer)-1);
printf("5th call : %s\n", buffer);
resultado do código
1ª chamada: HEL
2ª chamada: LO
3ª chamada: WOR
4ª chamada: LD
5ª chamada: (nulo)
A função read, fornecida pela biblioteca unistd.h, é usada para ler dados de um descritor de arquivo. São necessários três parâmetros: o descritor do arquivo, um buffer para armazenar os dados lidos e o número de bytes para ler do arquivo. A função de leitura retorna o número de bytes lidos do arquivo.
Na tabela de descritores de arquivos, existe um atributo chamado offset. O deslocamento acompanha a posição atual no arquivo. Cada vez que a função read é chamada, ela lê os dados começando no deslocamento atual e então avança o deslocamento pelo número de bytes lidos. Isso garante que as leituras subsequentes continuem de onde a última leitura parou.
No nosso exemplo:
A segunda chamada para read lê os próximos 3 bytes começando no deslocamento atualizado (3) e, em seguida, atualiza o deslocamento para 6.
etc...
A 5ª chamada para o buffer de leitura será nula e a leitura retornará 0 indicando o fim do arquivo.
Este processo continua até que todos os dados do arquivo tenham sido lidos ou até que ocorra um erro. O buffer é terminado em nulo após cada leitura para garantir que possa ser impresso como uma string.
char *get_next_line(int fd) toma como parâmetro um descritor de arquivo de um arquivo e retorna uma linha para cada chamada. Se chegar ao final do arquivo, ele retornará NULL.
https://github.com/Its-JoeTheKing/get_next_line
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3