- Abrir un fichero en c
- Leer un fichero en c
- Main de ejemplo
- Pruebas antes de entrar en batalla
- Empezando por la cabeza
- Mas preambulos
fd = open("test.txt", O_RDONLY);
nos devuelve un Numero >2 si todo ha ido bien
ya que el 0 es el standar input
y el 1 es el standar output
y el 2 el standar error
read(fd, buf,5)
- Este trozo de codigo lee del fd previamente abierto 5 caracteres y los guarda en el buffer
- read es inteligente y cada llamada a read va a continuar donde lo dejamos
- read nos devuelve el tamaño de lo leido
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{
int fd;
char buf[255];
int char_read;
fd = open("test.txt", O_RDONLY);
while(char_read = read(fd, buf,5))
{
buf[char_read] = '\0';
printf("buffer-> %s \n", buf);
}
return (0);
}
-
Este pequño main valida que read nos devuelva un tamaño > 0 y seguira iterando hasta no tengamos nada que leer
-
Nuestras librerias que no deben faltar -
stdlib.h
que contienemalloc
free
NULL
size_t
unistd.h
que contienewrite
read
close
-
Tambien Definimos el tamaño de nuestro buffer
# ifndef BUFFER_SIZE
# define BUFFER_SIZE 42
# endif
-
Con esta macro le decimos al programa el tamaño que vamos a leer de los fd en cada pasada, siempre va a ser 42.
-
En la cabecera también declaro funciones hechas en libft y que van a estar dentro del archivo
get_next_line_utils.c
, comoft_strchr
para buscar el EOL o en español, salto de línea o\n
,ft_strlen
para medir la longitud de los strings,ft_strlcpy
que copia caracteres de la cadenasrc
endst
, oft_strdup
que aloca memoria dinámicamente a una cadena, oft_strjoin
que concatena dos cadenas y asigna memoria dinámicamente.
y tambien incluyo la funcion madre de get_next_line
que se encuentra en el archivo get_next_line.c
- Mejor ver algo grafico que mil lineas explicativas antes
#include <stdio.h>
void prueba(void)
{
int cafes0 = 100;
static int cafes1 = 100;
printf("QUEDAN cafes0 = %d, cafes1 = %d\n", cafes0, cafes1);
cafes0--;
cafes1--;
}
int main(void)
{
prueba();
prueba();
prueba();
}
nakama@DESKTOP-FIDJ5EI:~/github/gnl$ ./a.out
QUEDAN cafes0 = 100, cafes1 = 100
QUEDAN cafes0 = 100, cafes1 = 99
QUEDAN cafes0 = 100, cafes1 = 98
- Como se puede ver mientras que la variable cafes0 se queda siempre en 100 en cada llamada a la funcion
- cafes1 mantiene su valor entre llamadas a la funcion o memoria durante toda la ejecucion del programa
Esto va a ser nuestro buffer una variable de tipo static
- Madre get_next_line
char *get_next_line(int fd)
{
static char buf[BUFFER_SIZE + 1];
char *line;
char *newline;
if (fd < 0 || BUFFER_SIZE <= 0)
return (NULL);
line = read_line(fd, buf);
if (!line || ft_strlen(line) == 0)
return (free(line), NULL);
newline = ft_strchr(line, '\n');
prepare_buffer(buf, line, newline);
return (line);
}
-
Nuestro buffer vemos que tenemos un tamaño
Buffer_size + 1
esto es por que aunque leamos siempre el tamaño del buffer tenemos que guardar uno para añadir el caracter\0
-
Pequeña comprobacion para que nuestra funcion no pete por si nos pasan un fd no valido o un buffersize menor a 0
-
guardamos en line lo que nos devuelve la funcion
read_line
-
*read_line
- Lee una linea de el fd y alloca memoria para el string
- fd el archivo de donde se lee la linea.
- buf la variable donde se guarda lo leido.
- retorna un puntero a la linea leida, O NULL si hay un error o se ha encontrado con el final del fichero.
-
Comprobaciones de si no hay linea o si el tamaño de la linea es 0
-
newline guarda un puntero a la posicion de el salto de linea para preparar el buffer para la siguiente llamada a la funcion -subir
La unica diferencia en el apartado bonus es que nuestro buffer pasara a ser bidimensional y en la cabecera incluimos una macro para la cantidad de fd maximos que podemos usar,tambien validaremos la cantidad de fd que se le pasan a la funcion sean consecuentes con ese maximo.
# ifndef OPEN_MAX
# define OPEN_MAX 512
# endif