Você está na página 1de 8

Archivos

Manejo de Archivos en C

conceptos

Contienen los datos que se almacenan en dispositivos de almacenamiento


masivo: disquetes, discos duros, DROM, etc.
Conjunto de datos relacionados entre si.
Organizacin de los datos:
0
0

Sin una estructura regular: texto, cdigo C.


En registros.

Los tipos de datos y funciones necesarias para el manejo de Archivos se


encuentran en la libreria de entrada/salida estndar stdio (standard
input/output).
0

Los Archivos se manejan utilizando variables de tipo FILE *


0

Apellido1 Apellido2 Nombre Edad Telf.

Registros

Gmez Gmez

Juan

35 60433423

Prez Mrquez Luca 20 95545434

#include <stdio.h>

Ejemplos:
El asterisco debe aparecer delante
FILE *archivo;
del nombre de la variable.
FILE *nominas, *ventas;
Estas variables pueden tener un valor nulo que se representa por la constante NULL.

Los pasos generales para manejar Archivos son los siguientes:


0
0

Abrir el archivo.
Realizar las operaciones de entrada/salida (lectura y/o escritura de datos en el
archivo).
Cerrar el archivo.

Campos

Apertura del archivo

Apertura del archivo

FunciOn fopen

Funcin fopen: nombre del archivo

Mediante la apertura asociamos el archivo con una variable de tipo FILE*


Una vez realizada la apertura, la variable se utiliza para acceder al archivo.

Se utiliza la siguiente funciOn:

FILE *fopen( char nombre[], char modo[] );


0

Parmetros:

nombre: Es una cadena de caracteres que contiene el nombre del archivo.


Puede contener la ruta.

modo: Es una cadena de caracteres que indica el modo de apertura del archivo.
Puede contener los siguientes valores:
0
rt El archivo se abre para leer.
0
wt El archivo se abre para escribir. Se borra y se escribe al principio.
0
at El archivo se abre para aadir. Se aaden los datos al final.

Valor devuelto:

Si el archivo no ha podido abrirse, devuelve NULL.

Si el archivo se ha abierto correctamente, devuelve un valor de tipo FILE* que


se puede utilizar para acceder al archivo.

Para especificar el nombre del


archivo con la ruta de acceso, se
utiliza la siguiente sintaxis:

E:\\clases\\FI\\ejemplo.txt
Cada elemento de la ruta (unidad, carpeta y archivo) se
separan con la doble barra invertida \\

Apertura del archivo

Apertura del archivo

Funcin fopen: modo de apertura

FunciOn fopen: ejemplo 1a

Existen tres modos de apertura:


0

Este modo se utiliza para leer datos del archivo.


Si el archivo no existe, no se puede abrir y fopen devuelve NULL.

Escritura (wt)

Abrimos el archivo prueba1.txt para escritura.


Si el archivo existe, se borra su contenido.

#include <stdio.h>

Lectura (rt)

Este modo se utiliza para escribir datos en el archivo desde el principio.


Si el archivo existe, se borra su contenido.
Si el archivo no existe, se crea un archivo nuevo vaco con el nombre indicado.
Deben existir todas las carpetas de la ruta especificada; si alguna no existe,
fopen no podr abrir el archivo.

void main() {
FILE *fa, *fb;
fa = fopen( c:\\dir1\\prueba1.txt, wt );
if (fa == NULL) {
printf( Error\n );
Comprobamos si el archivo se ha
return;
podido abrir.
}
El valor devuelto por fopen se guarda en fa. Ahora podemos
utilizar fa para acceder al archivo prueba1.txt.

Aadir (at)

Este modo se utiliza para escribir datos al final del archivo.


Si el archivo existe, se mantiene su contenido.
Si el archivo no existe, se crea un archivo nuevo vaco con el nombre indicado.
Deben existir todas las carpetas de la ruta especificada; si alguna no existe,
fopen no podr abrir el archivo.

fb = fopen( c:\\dir1\\prueba2.txt, wt );
if (fb == NULL) {
printf( Error\n );
Podemos abrir ms de un archivo
return;
}
...

Resto de sentencias del programa

Apertura del archivo

Escritura de datos en el archivo

FunciOn fopen: ejemplo 1b

FunciOn fprintf

El programa anterior se puede escribir de la siguiente manera:

La funciOn fprintf se utiliza igual que printf.


Diferencias entre fprintf y printf:
0

#include <stdio.h>
void main() {
FILE *fa, *fb;
fa = fopen( c:\\dir1\\prueba1.txt, wt );
if (fa == NULL) {
printf( Error\n );
}else {
fb = fopen( c:\\dir1\\prueba2.txt, wt );
if (fb == NULL) {
printf( Error\n );
}else {
...
}
}
}

La funciOn fprintf tiene un primer parmetro de tipo FILE*


La funciOn fprintf escribe en el archivo indicado por su primer parmetro (en vez
de hacerlo por pantalla).

int fprintf( FILE *f, char texto_de_formato[], ... );

Contiene informaciOn
sobre el archivo en el que
se va a escribir.

Contiene el texto que se va a


escribir (junto con los cOdigos de
formato: %d, %f, etc).

Valores que se van


a imprimir dentro
del texto.

Resto de sentencias del programa

La funcin fprintf devuelve el n de bytes o caracteres escritos en el archivo.


En caso de error, devuelve un valor negativo.

Escritura de datos en el archivo

Escritura de datos en el archivo

FunciOn fprintf: ejemplo 1a

FunciOn fprintf: ejemplo 1b

#include <stdio.h>
void main() {
Se crea o se
FILE *fa, *fb;
borra el archivo
int i;
fa = fopen( c:\\dir1\\prueba1.txt, wt );
if (fa == NULL) {
printf( Error\n );
return;
}
fb = fopen( c:\\dir1\\prueba2.txt, wt );
if (fb == NULL) {
printf( Error\n );
return;
Se crea o se
}
borra el archivo

prueba1.txt

fprintf( fa, Este es el archivo fa\n );


fprintf( fb, Este es el archivo fb\n );
for (i=1; i<4; i++) {
fprintf( fa, linea %d\n, i );
fprintf( fb, A+%d = %c; , i, A+i );
}

prueba1.txt
Este es el archivo fa
lnea 1
lnea 2
lnea 3

prueba2.txt
Este es el archivo fb
A+1 = B; A+2 = C; A+3 = D;

prueba2.txt

...

Contina...

Cierre del archivo

Cierre del archivo

FunciOn fclose

FunciOn fclose: ejemplo

Cuando un programa termina de utilizar un archivo, debe cerrarlo.


La variable de tipo FILE* asociada al archivo queda libre y puede ser utilizada
para acceder a otro archivo.
Se utiliza la siguiente funciOn:
int fclose( FILE *fich );
0

Parmetros:

fich: Valor de tipo FILE* asociado al archivo que queremos cerrar.


Valor devuelto:

Cero si se ha cerrado sin problemas.

El valor EOF si el archivo no se ha podido cerrar (EOF es una constante definida


en la librera stdio).

#include <stdio.h>
void main() {
FILE *fa, *fb;
int i;
fa = fopen( c:\\dir1\\prueba1.txt, wt );
if (fa == NULL) {
printf( Error\n );
return;
}
fb = fopen( c:\\dir1\\prueba2.txt, wt );
if (fb == NULL) {
printf( Error\n );
return;
}
fprintf( fa, Este es el archivo fa\n );
fprintf( fb, Este es el archivo fb\n );
for (i=1; i<4; i++) {
fprintf( fa, linea %d\n, i );
fprintf( fb, A+%d = %c; , i, A+i );
}

Apertura de
Archivos

Operaciones de
entrada/salida

Contina...

Cierre del archivo

Funciones de escritura de Archivos

Funcin fclose: ejemplo

Funcin fputs

fclose(fa);
fclose(fb);

fb = fopen( c:\\tmp\\prueba3.txt, rt );
...
}

int fputs( char cad[], FILE *fich );

Cierre de los Archivos: el programa no va a seguir


escribiendo en los Archivos.
0

Escribe el contenido de la cadena de caracteres cad en el archivo asociado a fich.

Devuelve un valor >= 0 si la escritura se ha realizado sin problemas. En caso de error,


devuelve el valor EOF.

Ejemplo:
FILE *f = fopen( c:\\tmp\\prueba.txt, wt );
char texto[] = una prueba;
prueba.txt
fputs( Esto es , f );
Esto es una prueba
fputs( texto, f );

Las variables fa y fb ya no estn


asociadas a ningn archivo.

Podemos volver a utilizar fb para abrir un nuevo


archivo y realizar operaciones de entrada/salida
sobre l.

Funciones de escritura de Archivos

Lectura de datos del archivo

Funcin fputc

Posicin de lectura

int fputc( int caracter, FILE *fich );


0

Escribe en el archivo asociado a fich el carcter contenido en el parmetro caracter.

Devuelve el carcter escrito si la escritura se ha realizado sin problemas. En caso de


error, devuelve el valor EOF.

Ejemplo:
FILE *f = fopen( c:\\tmp\\prueba.txt, wt );
fputc( A, f );
prueba.txt
fputc( 66, f );

66 es el cdigo
ASCII del carcter B

Posicin de lectura: llamaremos posicin de lectura al punto, dentro del archivo,


donde se comenzar a leer los datos.
Cuando se abre un archivo para leer (modo rt), la posicin de lectura se sita
al principio del archivo.
Cada vez que se leen datos del archivo, la posicin de lectura avanza para que
la siguiente lectura comience en el lugar donde terminO la anterior.
Ejemplo:

AB
Inicialmente,
la posicin de
lectura est al
principio.

Esto es una prueba

Si leemos 4
caracteres, la
posicin de
lectura avanza.

Si leemos 6 caracteres, la
posicin de lectura vuelve a
avanzar.

Lectura de datos del archivo

Lectura de datos del archivo

Funcin fscanf

Funcin fscanf: cdigos de formato

La funcin fscanf se utiliza igual que scanf.


Diferencias entre fscanf y scanf:
0
0

Se considera un separador a los siguientes caracteres:


0

La funcin fscanf tiene un primer parmetro de tipo FILE*


La funcin fscanf lee los datos del archivo indicado por su primer parmetro (en vez
de leerlos del teclado).

0
0

Lectura de valores numricos: %d, %u, %f, %lf, etc


0

Se salta todos los separadores hasta encontrar el principio de un nmero:


un digito, +, - o .(para los tipos float y double)

Si antes de encontrar un nmero, encuentra un carcter distinto de los


anteriores, la lectura termina y no se lee ningn valor numrico del archivo.

int fscanf( FILE *f, char formato[], ... );

Contiene informacin
sobre el archivo en el que
va a leer.

Contiene los cdigos de formato de


los valores que se van a leer (%d,
%f, etc).

Variables en las que


se van a guardar los se
datos ledos.

Lectura de cadena de caracteres: %s


0
0

La funcin fscanf devuelve el n de valores que han sido ledos del archivo y
almacenados en las variables. Si no ha podido leer ms valores porque ha
llegado al final del archivo, devuelve EOF.

Funciones de lectura de Archivos

FunciOn fscanf: ejemplo

FunciOn fgets

Apertura

void main() {
3.45
float v1;
5.2
int v2;
char c1, c2, c3;
FILE *f = fopen( c:\\dir1\\ejemplo.txt, rt );
3.45
if (f != NULL) {
5.2
fscanf( f, %f, &v1 );
fscanf( f, %d, &v2 );
fscanf( f, %d, &v2 );
fscanf( f, %c%c, &c1, &c2 );
En la posicin de lectura hay un .

Procesado

fscanf no se salta ningn carcter, lee el primer carcter que encuentre.

Lectura de datos del archivo


Posicin de lectura

Cierre

Se salta todos los separadores hasta encontrar un carcter distinto


Lee una cadena de caracteres delimitada por separadores

Lectura de caracteres: %c
0

char *fgets( char cadena[], int max, FILE *fich );

#include <stdio.h>

Carcter espacio:
Salto de lnea: \n
Tabulador: \t

fclose(f);

2
.

3.45
5.2

NOTA: el simbolo () representa un salto de linea

No se puede leer un nmero entero.


La variable v2 conserva su valor (5).

0
0

Lee una secuencia de caracteres del archivo asociado al parmetro fich y los almacena
en el parmetro cadena.
La lectura termina cuando se hayan leido max-1 caracteres, se encuentre un salto de
linea o se acabe el archivo.
Si se encuentra un salto de lnea, este se incluir en la cadena.
Ejemplo:
FILE *f = fopen( c:\\tmp\\prueba.txt, rt );
char cad[80];
fgets( cad, 80, f );
prueba.txt

fgets( cad, 6, f );

Esto es
una prueba

Funciones de lectura de Archivos

DetecciOn del fin del archivo

FunciOn fgetc

FunciOn feof

int fgetc( FILE *fich );


0
0
0

Lee un carcter del archivo asociado al parmetro fich.


Devuelve el carcter leido. Si no se puede leer ningn carcter, devuelve el valor EOF.
Ejemplo:
FILE *f = fopen( c:\\tmp\\prueba.txt, rt );
char c1, c2;
prueba.txt
c1 = fgetc( f );
Esto es
c2 = fgetc( f );
una prueba

Cuando la posicin de lectura del archivo se encuentra al final del archivo, no se


puede seguir leyendo.
Durante la lectura de datos de un archivo, el programa debe comprobar si se ha
llegado al final del archivo.
La siguiente funcin nos permite detectar si se ha llegado al final del archivo:
int feof( FILE *fich );
0

Valor devuelto:

VERDADERO (distinto de cero): Si en la ltima operacin de lectura se ha


intentado leer fuera del archivo; es decir, si se ha intentado leer despus de
llegar al final del archivo.

FALSO (cero): En caso contrario

Archivos

Archivos

Tratamiento secuencial

Tratamiento secuencial: ejemplo 1a

La secuencia de pasos que seguiremos para el tratamiento secuencial de


Archivos es la siguiente:

Abrir archivo
Leer un registro
MIENTRAS no sea fin de archivo HACER
Procesar el registro ledo
Leer un registro
FIN MIENTRAS
Cerrar archivo

Realizar un programa que lea los registros de un archivo de temperaturas que contiene un
entero por cada lnea (cada lnea corresponde a un registro). El programa debe imprimir por
pantalla los valores ledos.
#include <stdio.h>
void main() {
int valor;
FILE *f = fopen( c:\\ejemplo.txt, rt );
if (f == NULL) {
printf( ERROR\n );
return;
}
fscanf( f, %d, &valor );
while (!feof(f)) {
printf( %d\n, valor );
fscanf( f, %d, &valor );
}
fclose(f);
}

Abrimos el archivo

Leemos un registro
Procesamos el registro

Archivos

Archivos

Tratamiento secuencial: ejemplo 1b

Tratamiento secuencial: ejemplo 2a

Si el ltimo registro no termina con un salto de lnea, el valor de dicho registro no aparece en
pantalla (no es procesado).
#include <stdio.h>
void main() {
int valor;
FILE *f = fopen( c:\\ejemplo.txt, rt );
if (f == NULL) {
Supongamos que la posicin de lectura se
printf( ERROR\n );
encuentra en la marca ( ) y que se va a
return;
ejecutar la siguiente lnea
}
fscanf( f, %d, &valor );
45
while (!feof(f)) {
printf( %d\n, valor );
5
fscanf( f, %d, &valor );
10
}
fclose(f);
Se saltan los separadores
hasta encontrar el
archivo. carcter 1.

Se lee el
carcter
0.

Tenemos un archivo temp.txt con las temperaturas en C de tres sensores (llamados A, B


y C). El siguiente programa copia las temperaturas del sensor A en un archivo llamado
temp_a.txt.
Cada lnea del archivo corresponde a un registro que contiene el nombre del sensor
(un carcter) y la temperatura (un entero) separados por un espacio.
Por ejemplo, para el siguiente archivo temp.txt, debe generarse el archivo temp_a.txt que
se muestra:
temp.txt

Temp_a.txt

A
B
A
C

45
55

45
60
55
32

Se intenta leer
fuera del

Archivos

Archivos

Tratamiento secuencial: ejemplo 2b

Tratamiento secuencial: ejemplo 2c

#include <stdio.h>
void main() {
FILE *ftemp, *fsal;
char sensor, aux;
int temp;
Abrimos el archivo
ftemp = fopen( c:\\dir\\temp.txt, rt );
en modo lectura
if (ftemp == NULL) {
printf( ERROR\n );
return;
}
Abrimos el archivo
fsal = fopen( c:\\dir\\temp_a.txt, wt );
en modo escritura
if (fsal == NULL) {
printf( ERROR\n );
Antes de terminar, debemos
fclose( ftemp );
cerrar el archivo temp.txt
return;
}

Contina...

fscanf( ftemp, %c, &sensor );


fscanf( ftemp, %d, &temp );
fscanf( ftemp, %c, &aux );
while (!feof(ftemp)) {
if (sensor == a) {
fprintf( fsal, %d\n, temp );
}
fscanf( ftemp, %c, &sensor );
fscanf( ftemp, %d, &temp );
fscanf( ftemp, %c, &aux );
}
fclose( ftemp );
fclose( fsal );
}

Leemos un registro del archivo


temp.txt
Procesamos el registro leido y
escribimos un registro en el archivo
temp_a.txt
Leemos un registro del archivo
temp.txt

Cerramos todos los Archivos

Archivos
Tratamiento secuencial: ejemplo 2d
Lectura de un registro del archivo temp.txt:
fscanf( ftemp, %c, &sensor );
fscanf( ftemp, %d, &temp );
fscanf( ftemp, %c, &aux );

La variable aux se utiliza para leer


el salto de lnea del registro y
conseguir que la posicin de lectura
se site al principio del siguiente
registro

A
B
A
C

45
60
55
32

Você também pode gostar