Consultas, desarrollo de programas y petición de presupuestos:

jueves, 12 de julio de 2012

Manejo de ficheros (I)

En pseudocodigo seria:
ABRIR FICHERO
PROCESAR CONTENIDO (proceso de lectura)
GUARDAR CONENIDO (proceso de escritura)
CERRAR FICERO

Mientras que tu no cierre el fichero, el fichero permanece abierto, hasta:
  1. Si tu programa finaliza correctamente, todos los ficheros se cierran automaticamente.
  2. Si tu programa no finaliza correctamente, los ficheros se quedan abierto.
¿que implica esto? que ese fichero no se puede abrir por otro programa mientras que no se cierre. (esta es la peor posibilidad que se puede dar...), pero se pueden quedar bloqueado si lo haces mucho (no se pueda leer).

Nota Importante:
Hay que intentar que cuando de un error un programa, “salve los muebles” osea cierre todos los archivos de datos.

ABRIR UN FICHERO

Pseudocodigo
C
ABRIR UN FICHERO
punterofichero=fopen(const char *path, const char *modo)


const char *path: la ruta (absoluta (se indica desde la raiz del sistema de archivo “\”) o relativa (desde el directorio actual) ) y el nombre del fichero que quiero abrir.
Ejemplo:”~/records.txt” -> \home\usuario


const char *modo: indica lo que puedo hacer con el fichero.
r”: lectura, y se posiciona al principio del fichero. Si el archivo no existe la apertura falla.
w”: escritura. Si es el archivo existe trunca su contenido (pierde el contenido), y se pone al principio. Si el archivo no existe, lo crea, lo abre y se posiciona al principio.
a”: añadir, abre el archivo para añadir (y se posiciona al final del archivo, respetando lo que habia). Si el archivo no existe lo crea.


A estos modos se le puede añadir el signo “+”, que indica que se abre para lectura y escritura.
r+”: abre el archivo, se posiciona al principio del archivo y permite leer y escribir. (escribira donde estes posicionado, al abrir al inicio, hay metodos para posicionarse). Si el archivo no existe falla la apertura.
w+”: podemos escribir y leer. Si el archivo exise lo trunca (pierde el contenido) y se posiciona en el principio, Si no existe lo crea lo abre y se posiciona al principio.


a+”: abre el archivo, se posiciona al final, diferencia lectura y escritura


Punterofichero: Es la variable por la cual podemos manejar el fichero. La tenemos que declarar de esta manera: FILE *nombre_corto;
FILE *pf; //puntero de fichero, por ejemplo




Tabla resumen:



Si no existe el archivo
POSICION inicial
LECTURA
ESCRITURA
AÑADIR
contenido
r
falla
Al princicpio
x




Respeta el contenido
w
Lo crea
Al principio


x


Trunca el contenido
a
Lo crea
Al final


x
x
Respeta el contendio
r+
falla
Al principio
x
x


Respeta el contenido
w+
Lo crea
Al principo
x
x


Trunca el contenido
a+
Lo crea
Al final
x
x
x
Respeta contenido

Ademas existen: dos sufijos.
“b”: indica que el archivo contiene un contenido binario.
“t”: indica contenido texto.

Actualmente todos se maneja en binario. Por defecto asume que es “t”. Pero actualmente no hacerle usa.

Por ejemplo:
r+t:si no existe falla al abrirlo. Archivo de lectura y escritura, y contiene texto,

Por ejemplo: si hacemos cat /bin/cp
nos muestra un contendido de un archivo binario.

Apertura tipica de un fichero:

FILE *pf;

if ((pf=fopen(“~/records.txt”,”r”))==NULL) {
printf(“No se puede abrir el archivo”);
…....
}


pf: puntero de tipo FILE.
Si fopen abre correctamente el fichero dara el puntero a pf
Si fopen ha fallado al intentar abrir el fichero, dara NULL

Estas lineas sirven para comprobar que el archivo se abre correctamente, ya que lo leera correctamente. Si no lo ponemos, tendremos problemas si la aparetura falla, leyendo cosas erroneas.

Tambien se puede escribir:


FILE *pf;
pf=fopen(“~/records.txt”,”r”);
if (pf==NULL) {
printf(“No se puede abrir el archivo”);
…...
}

Si no consigues abrir el archivo tiene que hacer tu programa algo, por ejemplo:
exit(1)
exit aborta el programa y devuelve un 1 (en vez de return 0, que indica que el programa ha salido correctamente)

Otra forma de resolver el problema es crear el archivo con “w”, y luego lo vuelvo a abrir de lectura.


Nota:
Leer y escribir simultaneamente en un archivo, te tienes que posicionar en cada sitio, que quieras hacer, es complicado.

La forma habitual de usar es :
Abrir archivo.
Leer el archivo,
asignarlo a las variables/tabla y cerrarlo.
Y ya trabajar con las variables en memoria.



PROCESAR CONTENIDO: leer
C
CASO DE LA LECTURA
Abrir fichero
Leer fichero






Mientras !fin.fichero
….....
leer fichero
Fin mientras
Cerrar Fichero
Comprobar que es el final de fichero, es la función de stdio.h:
feof(FILE *punteroFichero)


Forma de usarla:
eof(pf);


while(!feof(pf)){
…....
}






Para leer como para escribir existen muchas funciones.
1) int fgetc(FILE *punteroFichero), lee caracteres.
2) int getc(FILE *punteroFichero), lee caracteres (hace los mismo).
3) char *fgets(char *cadena,int cantidad,FILE *punteroFicero), lee cadena de caracteres..
char *cadena=char TABLA[]
cantidad: es la cantidad de bytes a leer, y realmente lee cantidad-1 (no lee el finalizador de cadena \0).
*punterofichero= fichero a leer.
Excepciones:
1)Siempre lee esa cantidad excepto que haya menos caracteres, que te da los que haya. (pido 40, y solo hay 18, me da los 18)
2) no de los caracteres que haya leido sea “\n” (salto de linea y vaciado de buffer ¡¡cuidado!!. Si digo que lea 80, el archivo tiene 300, pero entre los 80, en el nº 38, hay un “\n” solo me da 38. Termina de leer cuando encuentre “\n”.
Tengo que volver a ejecutar fget.




Mas forma de leer: (la mejor)
Definicion: (no hace falta ponerla ya que esta definido stdio.h)
int fscanf(FILE *punteroFicero,const char *formato,....)


Uso:
fscanf(pf,”%30s%7d”, nombre, &puntos)
%7d: lee 7 digitos.
%30s: lee 30 caracteres
nombre=tabla, por el hecho de que sea una tabla implica el &.







PROCESAR CONTENIDO: Escribir fichero
C
CASO DE LA escritura
Abrir fichero
Escribir fichero


Cerrar Fichero
Escribe un carácter:
Int fputc(int carácter, FILE *punteroFichero)
Int putc(int carácter,FILE *punteroFichero)
int fputs(char *cadena,FILE *punteroFichero)


int fprintf(FILE *punteroFichero, const char *formato,....)


%7d: Cadena de formatos
lista de variables



PSEUDOCODIGO
C
CERRAR FICHERO
fclose(FILE *punteroFichero)
Ejemplo de uso:
fclose(pf);




Fclose implica la ejecución de un fflush(pf), que hace un volcado del buffer al disco. Por lo tanto si no se hace el fclose, lo que hallamos guardado puede que aun este en el buffer, y no se halla grabado realmente.


Hasta aquí no hemos explicado como usar el modo “+”

Problemas con scanf:
%s: no considera valido el espacio en blanco. (no lo tiene en cuenta y finaliza al encontrar el espacio, dejando para el resto para el buffer, que lo recogera el proximo scanf)

%c: da problemas cuando lee un carácter y pulsamos ENTER. (el buffer no se vacia)
El ENTER lo recogera otro scanf.
Existe una forma para quitar ese error:

%[], dentro de los corchete indicamos la gama de caracteres válidos.

Por ejemplo:
%[a-z]: solo recogiria letras de la a a la z

Mas ejemplos:
%[^\n]: ^ indica las que no son validas, enter no es valido, dejara de meter datos en la variable cuando le de a ENTER

%[snSN]: admite s,S,n,N.

Lo mejor es que siempre el usuario meta caracteres, y luego se convierta en lo que nos interesa, osea:
scanf(“%[^\n]”, cadena); que admite cualquier cadena de caracteres menos el ENTER.


Tareas para mañana:
Cuando creas un archivo, ¿que permisos tiene?...

No hay comentarios:

Publicar un comentario en la entrada