- Sim,
read(fd, buf, BUFSIZ)
leráBUFSIZ
bytes defd
(a menos que você tenha alcançado o último bloco, Nesse caso, ele lerá todos os bytes restantes, o número do qual será retornado emn
e será ≤BUFSIZ
). Se você quiser ler todos os dados de uma só vez, você pode fazerwc /proc/pid/maps
para ver quanto tempo é (e, portanto, quão grande é fazerBUFSIZ
). Mas isso seria contraproducente. Ler um arquivo inteiro na memória raramente é necessário ou até mesmo útil, e você não pode mudar os parâmetros em seus programas toda vez que você executá-los em um arquivo de entrada diferente. Se você quiser aprender a escrever programas que leiam arquivos, você ficará muito melhor aprendendo como lidar com eles um bloco de cada vez. - A segunda parte da sua pergunta não faz muito sentido. %código%? Você está escrevendo um Cprogram ou um shell script (ou ambos)?
- E lendo os dados que você quer, jogando fora,
e voltar e ler de novo é um péssimo hábito de entrar.
É ridículo ler o endereço inicial até o
grep
, e depois-
para trás e leia novamente - especialmente se você está falando lendo o arquivo inteiro na memória. Se você tiver o arquivo inteiro na memória, por que no mundo você iria querer ler parte disso de novo? - Eu recomendaria usar
lseek
. Mas, se você realmente preferir usarfgets
, vá em frente e faça. Você precisará procurar por caracteres de nova linha (read
) e assim identificar as linhas (\n
faria isso por você) e depois extrair a informação desejada das linhas. - Você pode certamente analisar as linhas, caractere por caractere, se quiser.
Mas eu recomendo
fgets
. Certifique-se de verificar o valor de retorno.