-^Blue Hacking^-

El mejor hacking al alcance de todos
 
ÍndiceFAQRegistrarseConectarse

Comparte | 
 

 Curso programación en C

Ver el tema anterior Ver el tema siguiente Ir abajo 
Ir a la página : Precedente  1, 2, 3
AutorMensaje
duirk
Co-Administrador
Co-Administrador


Mensajes : 88
Fecha de inscripción : 28/09/2008

MensajeTema: Re: Curso programación en C   Dom Nov 02, 2008 1:42 am

CURSO DE C. TEMA 11.3 (de 4).

Antes de seguir, vamos a ver las letras que pueden aparecer en el modo de apertura del fichero:


Tipo Significado

r Abrir sólo para lectura.
w Crear para escribir. Sobreescribe si existiera ya.
a Añade al final si existe, o crea si no existe.
+ Permite modificar. Por ejemplo: r+
t Abrir en modo de texto.
b Abrir en modo binario.

Si queremos leer o escribir sólo una letra, tenemos las órdenes "fgetc" y "fputc", que se usan:

letra = fgetc( fichero );
fputc (letra, fichero);


Podemos querer crear un "fichero con tipo", en el que todos los componentes vayan a ser del mismo tipo. Por ejemplo, podría ser para un agenda, en la que guardemos los datos de cada persona con un "struct".

En casos como éste, la solución más cómoda puede ser usar "fprintf" y "fscanf", análogos a "printf" y "scanf", que se emplearían así:

fprintf( fichero, "%40s%5d\n", persona.nombre, persona.numero);
fscanf( fichero, "%40s%5d\n", &persona.nombre, &persona.numero);
Volver arriba Ir abajo
Ver perfil de usuario
duirk
Co-Administrador
Co-Administrador


Mensajes : 88
Fecha de inscripción : 28/09/2008

MensajeTema: Re: Curso programación en C   Dom Nov 02, 2008 1:43 am

CURSO DE C. TEMA 11.4 (de 4).

Finalmente, podemos crear ficheros "sin tipo", es decir, que la información que contengan no necesariamente sea sólo texto ni tampoco datos siempre iguales.

En este caso, utilizamos "fread" y "fwrite" (análogos a BlockRead y BlockWrite, para quien venga de Pascal). Los datos que se leen se van guardando en un buffer (una zona intermedia de memoria). En el momento en que se lean menos bytes de los que hemos pedido, quiere decir que hemos llegado al final del fichero.

Vamos a ver un ejemplo, que comentaré después:

/*-------------------------*/
/* Ejemplo en C nº 44: */
/* EJ44.C */
/* */
/* Ficheros sin tipo: */
/* Copiador elemental */
/* */
/* Comprobado con: */
/* - Turbo C++ 1.01 */
/* - Djgpp 2.01 */

/* - Symantec C++ 6.0 */
/* - GCC 2.6.3 */
/*-------------------------*/

#include <stdio.h>

FILE *fichOrg, *fichDest; /* Los dos ficheros */
char buffer[2048]; /* El buffer para guardar lo que leo */
char nombreOrg[80], /* Los nombres de los ficheros */
nombreDest[80];
int cantidad; /* El número de bytes leídos */


main()
{

/* Accedo al fichero de origen */
printf("Introduzca el nombre del fichero Origen: ");
scanf("%s",nombreOrg);
if ((fichOrg = fopen(nombreOrg, "rb")) == NULL)
{
printf("No existe el fichero origen!\n");
exit(1);
}

/* Y ahora al de destino */
printf("Introduzca el nombre del fichero Destino: ");

scanf("%s",nombreDest);
if ((fichDest = fopen(nombreDest, "wb")) == NULL)
{
printf("No se ha podido crear el fichero destino!\n");
exit(1);
}

/* Mientras quede algo que leer */
while (! feof(fichOrg) )
{
/* Leo datos: cada uno de 1 byte, todos los que me caben */
cantidad = fread( buffer, 1, sizeof(buffer), fichOrg);
/* Escribo tantos como haya leído */
fwrite(buffer, 1, cantidad, fichDest);
}
/* Cierro los ficheros */
fclose(fichOrg);
fclose(fichDest);
}

/*-------------------------*/

Las novedades en este programa son:
· Defino un buffer de 2048 bytes (2 K), en el que iré guardando lo que lea.

· En la misma línea intento abrir el fichero y compruebo si todo ha sido correcto. Es menos legible, pero más compacto, y, sobre todo, muy frecuente encontrarlo en "fuentes ajenos" de esos que circulan por ahí, de modo que he considerado adecuado incluirlo.
· A "fread" le digo que quiero leer 2048 datos de 1 byte cada uno, y él me devuelve la cantidad de bytes que ha leído realmente. Cuando sea menos de 2048 bytes, es que el fichero se ha acabado.
· A "fwrite" le indico el número de bytes que quiero que escriba.


Cuando trabajamos con un fichero, es posible que necesitemos acceder directamente a una cierta posición del mismo. Para ello usamos "fseek", que tiene el formato:

int fseek(FILE *fichero, long posic, int desde);

Como siempre, comentemos qué es cada cosa:

· Es de tipo "int", lo que quiere decir que nos va a devolver un valor, para que comprobemos si realmente se ha podido saltar a la dirección que nosotros le hemos pedido: si el valor es 0, todo ha ido bien; si es otro, indicará un error (normalmente, que no hemos abiertos el fichero).

· "fichero" indica el fichero dentro de el que queremos saltar. Este fichero debe estar abierto previamente (con fopen).
· "posic" nos permite decir a qué posición queremos saltar (por ejemplo, a la 5010).
· "desde" es para poder afinar más: la dirección que hemos indicado con posic puede estar referida al comienzo del fichero, a la posición en la que nos encontramos actualmente, o al final del fichero (entonces posic deberá ser negativo). Para no tener que recordar que un 0 quiere decir que nos referimos al principio, un 1 a la posición actual y un 2 a la final, tenemos definidas las constantes:

SEEK_SET (0): Principio
SEEK_CUR (1): Actual

SEEK_END (2): Final

Finalmente, si queremos saber en qué posición de un fichero nos encontramos, podemos usar "ftell(fichero)".

Pues esto es el manejo de ficheros en C. Ahora sólo queda elegir un proyecto en el que aplicarlos, y ponerse con ello.
Volver arriba Ir abajo
Ver perfil de usuario
 
Curso programación en C
Ver el tema anterior Ver el tema siguiente Volver arriba 
Página 3 de 3.Ir a la página : Precedente  1, 2, 3
 Temas similares
-
» Como poner iconos de resyelto, en curso, etc.
» Resuelto, En curso, etc.
» imagen que siga el curso y que diga registrarse
» Manual Android
» Abuso en curso porque no quieren recibir correos... ¿como lo elimino?

Permisos de este foro:No puedes responder a temas en este foro.
-^Blue Hacking^- :: Hacktivismo :: Programación En General-
Cambiar a: