Documentos de Académico
Documentos de Profesional
Documentos de Cultura
linux
tenemos
dos
grupos
de
funciones
para
lectura
escritura
de
ficheros.
Las
funciones open(), write(), read() y close() son de algo ms bajo nivel y especficas de linux. Dichas
funciones sern tratadas en este artculo y dejar ejemplos de cmo abrir y escribir archivos binarios. Los
que desean utilizar funciones que son estndar de C, les recomiendo que lean este artculo
Comencemos por crear un fichero. Existen dos maneras de abrir un fichero, open() y creat().
Antiguamente open() slo poda abrir ficheros que ya estaban creados por lo que era necesario
hacer una llamada a creat() para llamar a open() posteriormente. A da de hoy open() es capaz de
crear ficheros, ya que se ha aadido un nuevo parmetro en su prototipo:
int creat( const char *pathname, mode_t mode )
int open( const char *pathname, int flags )
int open( const char *pathname, int flags, mode_t mode )
Por ello, para emplear estas syscalls se suelen incluir los ficheros de cabecera:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
El funcionamiento de open() es el siguiente: al ser llamada intenta abrir el fichero indicado en la cadena
pathname con el acceso que indica el parmetro flags. Estos flags indican si queremos abrir el
fichero para lectura, para escritura, etc. La siguiente tabla especifica los valores que puede tomar este
parmetro:
Indicador
Valor
Descripcin
O_RDONLY
0000
O_WRONLY
0001
O_RDWR
0002
O_RANDOM
0010
0020
0040
0100
O_SEQUENTIA
L
O_TEMPORAR
Y
O_CREAT
O_EXCL
0200
O_NOCTTY
0400
O_TRUNC
1000
O_APPEND
2000
O_NONBLOCK 4000
O_SYNC
10000
O_ASYNC
O_DIRECT
O_LARGEFILE
O_DIRECTORY
O_NOFOLLOW
10000
0
20000
0
40000 Fuerza a no seguir los enlaces simblicos. til en entornos crticos en cuanto a
0
seguridad.
El argumento mode se encarga de definir los permisos dentro del Sistema de Ficheros (de la
manera de la que lo hacamos con el comando chmod). La lista completa de sus posibles
valores es esta:
Indicador Valor
Descripcin
S_IROTH 0000
S_IWOTH 0001
S_IXOTH 0002
S_IRGRP 0010
S_IRGRP 0020
S_IRGRP 0040
S_IRUSR 0100
S_IWUSR 0200
S_IXUSR 0400
S_ISVTX 1000
S_ISGID 2000
S_ISUID 4000
S_IRWXU
S_IRWXG
S_IRWXO
S_IRUSR + S_IWUSR +
S_IXUSR
S_IRGRP + S_IWGRP + Activar el bit de lectura, escritura y ejecucin para todo los usuarios
S_IXGRP
pertenecientes al grupo.
S_IROTH + S_IWOTH + Activar el bit de lectura, escritura y ejecucin para todo los
S_IXOTH
usuarios.
Bien, ya sabemos abrir ficheros y crearlos si no existieran, pero no podemos ir dejando ficheros abiertos
sin cerrarlos convenientemente. Ya sabis que C se caracteriza por tratar a sus programadores como
personas responsables y no presupone ninguna niera del estilo del recolector de basuras, o similares.
Para cerrar un fichero basta con pasarle a la syscall close() el descriptor de fichero como argumento:
int close(int fd)
El siguiente paso lgico es poder leer y escribir en los ficheros que manejemos. Para ello emplearemos
dos syscalls muy similares: read() y write(). Aqu tenemos sus prototipos:
//Llamada a libreras
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//Funcin principal
main(int argc, char **argv[])
{
//Declaramos variables
int fd;
char c;
//ABRIR ARCHIVO
//O_RDONLY abre el archivo salida.txt en modo lectura
fd = open("salida.txt",O_RDONLY);
//CONTROLAR SI EXISTE ARCHIVO
if(fd!=-1)
{
//LEER EL ARCHIVO
//El archivo se lee caracter por caracter
while(read(fd,&c,sizeof(c)!=0)){
printf("%c",c);
}
//CERRAR ARCHIVO
close(fd);
}
else{
printf("\nEl archivo no existe");
}
}
//Llamada a libreras
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//Funcin principal
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//Llamada a libreras
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//Funcin principal
main(int argc, char **argv[])
{
//Declaramos variables
int fd,fd2;
char c;
//ABRIR ARCHIVO U ORIGEN
fd = open("salida.txt",O_RDONLY);
//CREAR ARCHIVO DE DESTINO
fd2 = open("destino.txt",O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR);
//CONTROLAR SI EXISTE ARCHIVO
if(fd!=-1)
{
//LEER EL ARCHIVO
//El archivo se lee caracter por caracter
while(read(fd,&c,sizeof(c)!=0)){
//GUARDAR ARCHIVO NUEVO
write(fd2,&c,sizeof(c));
}
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//CERRAR ARCHIVO
close(fd);
close(fd2);
fd2 = open("destino.txt",O_RDONLY);
//LEER EL ARCHIVO DESTINO PARA COMPROBAR SI TODO SALIO BIEN
//El archivo se lee caracter por caracter
while(read(fd2,&c,sizeof(c)!=0)){
printf("%c",c);
}
close(fd2);
}
else{
printf("\nEl archivo no existe");
}
}
Otra funcin que puede ser de gran ayuda es lseek(). Muchas veces no queremos posicionarnos al
principio de un fichero para leer o para escribir, sino que lo que nos interesa es posicionarnos en un
desplazamiento concreto relativo al comienzo del fichero, o al final del fichero, etc. La funcin lseek() nos
proporciona esa posibilidad, y tiene el siguiente prototipo:
off_t lseek(int fildes, off_t offset, int whence);
Los parmetros que recibe son bien conocidos, fildes es el descriptor de fichero, offset es el
desplazamiento en el que queremos posicionarnos, relativo a lo que indique whence, que puede tomar
los siguientes valores:
Indicador
Valor Descripcin
SEEK_SET
SEEK_CUR 1
SEEK_END
//Llamada a libreras
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include<fcntl.h>
#define SIZE 512
//Funcin principal
main( int argc, char **argv[] )
{
int fd, fd2, readbytes;
//En este ejemplo utilizamos un buffer de 512 bytes
char buffer[SIZE];
//ABRIR ARCHIVO U ORIGEN
fd = open("salida.txt",O_RDONLY);
//CREAR ARCHIVO DE DESTINO
fd2 = open("destino2.txt",O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR|S_IXUSR);
//SALTEAR LOS PRIMEROS 8 bytes.
lseek(fd,8,SEEK_SET);
while( (readbytes = read( fd, buffer, SIZE )) != 0 )
{
/* write( STDOUT, buffer, SIZE ); */
write( fd2, buffer, readbytes );
}
//CERRAR ARCHIVOS
close( fd );
close( fd2 );
}