You are on page 1of 21

Introducción al Lenguaje de

Programación C

 Generalidades de C

 Estructuras de Programación

 Tipos de Datos y Variables

 Entrada / Salida
 Operaciones de Primer Nivel
 Operaciones de Segundo Nivel

 Anexos
142
Entrada / Salida : Operaciones de
Primer Nivel
 Los ficheros son un conjunto continuo de bytes

 El programador podrá ordenar la lectura o escritura de un número


cualquiera de bytes desde cualquier posición del fichero

 Los canales lógicos de acceso a ficheros se representan con un


número entero resultado de la ejecución de la función open

 Al abrir el fichero, se deben especificar las características de las


operaciones que se van a realizar, tipo de acceso o tipo de canal

143
Entrada / Salida : Operaciones de
Primer Nivel
 Abrir, leer, escribir y cerrar ficheros

 int open(const char *path, int access [, unsigned mode]);


La función open abre el fichero especificado en path
El path debe especificar un nombre de fichero o dispositivo

Devuelve un valor entero que es el canal a través del cual se realizarán las
operaciones de entrada/salida sobre el fichero

Si se produce un error devuelve -1

 Canales abiertos por el S. O.


0 entrada estándar
1 salida estándar
2 salida de error 144
Entrada / Salida : Operaciones de
Primer Nivel
 Los valores posibles del parámetro access están definidos en
<fcntl.h>; son expresiones lógicas formadas por un elemento de la
lista 1 y elementos de la lista 2

 Lista 1:
O_RDONLY ( = 1) /* Apertura sólo para lectura */
O_WRONLY ( = 2) /* Apertura sólo para escritura */
O_RDWR( = 4) /* Apertura para lectura y escritura */

 Lista 2:
O_APPEND /* Abrir el fichero colocando el puntero de escritura al final.*/
O_CREAT /* Crear y abrir el fichero. Si el fichero existe, no tiene efecto */
O_TRUNC /* Abrir y truncar: si el fichero existe, se trunca, dejando sus
atributos invariables */ 145
Entrada / Salida : Operaciones de
Primer Nivel
 Los valores posibles para el parámetro mode están definidos en
<stat.h>, son expresiones lógicas formadas por los valores:
S_IREAD /* Permiso para leer */
S_IWRITE /* Permiso para escribir */

Se especificarán estas opciones si el argumento access toma el flag


O_CREAT

 int dup(int handle);


La función dup devuelve un entero que es el primer canal disponible,
duplicando el canal handle

Si no hay éxito, devuelve -1


146
Entrada / Salida : Operaciones de
Primer Nivel
 int read(int handle, void *buf, unsigned len);
La función read intenta leer un número len de bytes del fichero o
dispositivo asociado al canal handle en el buffer apuntado por buf

En caso de éxito devuelve el número de caracteres colocados en el buffer

Si detecta el fin de fichero, devuelve 0

Si se produce un error devuelve -1

 Nota: En ficheros de disco, la lectura comienza en la posición del


puntero de acceso al fichero. Una vez concluida la lectura, el
puntero se incrementa en el número de bytes leídos

147
Entrada / Salida : Operaciones de
Primer Nivel
 int write(int handle, void *buf, unsigned len);
La función write intenta escribir un número len de bytes del buffer
apuntado por buf en el fichero o dispositivo asociado al canal handle

En caso de éxito devuelve el número de caracteres escritos en el fichero, sin


contar los retornos de carro generados

Si se produce un error, devuelve -1

 Nota: Para ficheros de disco la escritura comienza en la posición


del puntero de acceso al fichero. Para dispositivos, los caracteres
son enviados directamente a ellos

148
Entrada / Salida : Operaciones de
Primer Nivel
 long lseek(int handle, long offset, int fromwhere);
La función lseek coloca el puntero de acceso al fichero asociado al canal
handle en una posición que está offset bytes detrás de la posición dada por
fromwhere, que debe tener uno de los valores de las constantes simbólicas
definidas en <unistd.h>

SEEK_SET ( = 0) /* Principio del fichero */


SEEK_CUR ( = 1) /* Posición actual del fichero */
SEEK_END ( = 2) /* Fin del fichero */

 int close(int handle);


La función close cierra el canal de acceso a un fichero indicado en handle

Devuelve 0 en caso de éxito y -1 en otro caso


149
Ejemplo 8.1 (I)
#include <sys\stat.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>

int main(void)
{
int handle;
char msg[] = ”Esto es una prueba";
char ch;

handle = open("TEST.$$$", O_CREAT | O_RDWR, S_IREAD | S_IWRITE);


write(handle, msg, strlen(msg)); /* escribir dato en el fichero */
lseek(handle, 0L, SEEK_SET); /* nos situamos al inicio del fichero */
Ejemplo 8.1 (II)
/* leer carácter del fichero hasta el final */
while (read(handle, &ch, 1) == 1)
{
printf("%c", ch);
}

close(handle);
return 0;
}

151
Introducción al Lenguaje de
Programación C

 Generalidades de C

 Estructuras de Programación

 Tipos de Datos y Variables

 Entrada / Salida
 Operaciones de Primer Nivel
 Operaciones de Segundo Nivel

 Anexos
152
Entrada / Salida : Operaciones de
Segundo Nivel
 Los ficheros son conjuntos de agrupaciones lógicas de datos con la
misma estructura, llamadas registros

 Cada operación de entrada o salida, leerá o escribirá un registro


del fichero

 Los canales lógicos de acceso a ficheros se representan como un


puntero a una estructura FILE, que se obtiene como resultado de la
ejecución de la función fopen

 Definición del tipo de dato fichero

FILE *fp;
153
Entrada / Salida : Operaciones de
Segundo Nivel
 Algunos nombres de punteros a estructuras FILE están ya
definidos en stdio.h y asociados a dispositivos estándar de E/S

 Son los siguientes:


stdin ( canal lógico 0) dispos.estándar de entrada

stdout ( canal lógico 1) dispos. estándar de salida

stderr ( canal lógico 2) dispos. estándar de errores

stdprn impresora estándar

154
Entrada / Salida : Operaciones de
Segundo Nivel
 Abrir, leer, escribir y cerrar ficheros
 FILE *fopen(const char *filename, const char *mode);
La función fopen devuelve un puntero a una estructura FILE. Tendrá
asociado un canal lógico a través del cual se realizarán las operaciones de
E/S sobre el fichero
Si se produce un error, devuelve NULL
Abre el fichero que se especifica en filename para lectura o escritura, como
lo determine mode

 int fclose(FILE *fp);


La función fclose cierra el canal al que apunta fp vaciando los búferes
asociados
Devuelve 0 si hay éxito y EOF en caso de error
155
Entrada / Salida : Operaciones de
Segundo Nivel
 La cadena mode puede tener los siguientes valores

Modo Significado
"r" Abre un archivo existente para lectura
"w" Abre un nuevo archivo para escritura. Si existe el
archivo se borra su contenido. Si no existe se crea
"a" Abre un archivo existente para añadir datos al
final. Si no existe se crea
"r+" Abre un archivo existente para lectura y escritura
"w+" Abre un archivo nuevo para escritura y lectura. Si
existe lo borra. Si no existe lo crea
"a+" Abre un archivo para leer y añadir

156
Entrada / Salida : Operaciones de
Segundo Nivel
 size_t fread(void *ptr, size_t size, size_t n, FILE *fp);
La función fread realiza una lectura de datos no formateada

Lee n datos cada uno de longitud size bytes del canal al que apunta fp, y los
pone en el bloque al que apunta ptr

En caso de éxito devuelve el número de datos leídos

 int fscanf(FILE *fp, const char *format[, address, ...]);


La función fscanf realiza una lectura de datos formateada

Lee datos del canal al que apunta fp, de acuerdo con el formato
especificado en format, depositándolos en las direcciones de memoria a la
que apuntan las address
157
Entrada / Salida : Operaciones de
Segundo Nivel
 size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp);
La función fwrite realiza una escritura de datos no formateada

Escribe n datos cada uno de longitud size bytes en el canal al que apunta fp,
del bloque al que apunta ptr

En caso de éxito devuelve el número de datos escritos

 int fprintf(FILE *fp, const char *format[, argument, ...]);


La función fprintf realiza un escritura de datos formateada

Escribe los datos especificados en los argumentos, en el canal al que apunta


fp, de acuerdo con el formato especificado en format

Devuelve el número de bytes escritos


158
Ejemplo 9.1
#include <string.h>
#include <stdio.h>

int main( )
{
FILE *fp;
char buf[11] = "0123456789";

fp = fopen("DUMMY.FIL", "w"); /* crear y abrir un fichero */

fwrite(&buf, strlen(buf), 1, fp);


/* escribir el valor de buf en el fichero */

fclose(fp); /* cerrar el fichero */


return (0); 159
}
Entrada / Salida : Operaciones de
Segundo Nivel
 int fflush(FILE *fp);
La función fflush hace que el contenido del buffer que tiene asociado se
escriba en el canal fp si es de salida, y borra el contenido del buffer si el
canal es de entrada

Devuelve 0 si hay éxito y EOF en caso de error

 int fseek(FILE *fp, long offset, int whence);


La función fseek coloca el puntero de acceso al fichero asociado al canal al
que apunta fp en una nueva posición que está a una distancia de offset bytes
de la posición dada por whence

Valores de whence definidos en <stdio.h>


SEEK_SET 0 /* principio de fichero */
SEEK_CUR 1 /* posición actual del fichero */
160
SEEK_END 2 /* fin del fichero */
Entrada / Salida : Operaciones de
Segundo Nivel
 int feof(FILE *fp);
La función feof comprueba si se llega al final del fichero en el canal al que
apunta fp

Devuelve  0 si se detectó el indicador de fin de fichero en la última


operación de entrada sobre el canal y 0 en caso contrario

Las sucesivas operaciones de entrada actualizan el indicador de fin de


fichero

 Salidas impresas

 int fprintf(stdprn, const char *format[, argument, ...]);


La función fprintf, utilizando como canal lógico de acceso el nombre
stdprn, permite acceder a la impresora estándar del sistema 161
Entrada / Salida : Operaciones de
Segundo Nivel
 Lectura y escritura de caracteres y cadenas de caracteres

En <stdio.h>

Función Significado
getc Lee un carácter de un fichero
fgetc Lee un carácter de un fichero
putc Escribe un carácter en un fichero
fputc Escribe un carácter en un fichero
fgets Lee una cadena de caracteres de un fichero
fputs Escribe una cadena de caracteres en un fichero
162