/*
| ESTE ARCHICO CONTIENE TODOS LOS ARCHIVOS EJEMPLOS DESARROLLADOS EN EL CURSO
*/
###################################[reescritura_en_fichero_binario.c]##################################################
/* Tengo un archivo llamado "NUMEROS.DAT" compuesto por registros con
tres campos:
n entero
m entero
c real
queremos cambiar el contenido de estos registros de esta forma, cuando
n sea menor que m haremos que el campo c valga cero, y en caso contrario
(n>=m) haremos que el campo c sea el número combinatorio de n sobre m.
ALGORITMO Reescritura
TIPOS
reg_datos = REGISTRO
n,m: ENTERO;
c: REAL;
FIN-REGISTRO;
ENTORNO
reg: reg_datos;
fich: FICHERO DE reg_datos;
INICIO
ASIGNAR "NUMEROS.DAT" A fich;
ABRIR fich PARA L/E;
MIENTRAS NO EOF(fich) HACER
LEER reg DE fich;
SI reg.n < reg.m
ENTONCES reg.c <-- 0;
SINO reg.c <-- Fac(reg.n)/(Fac(reg.m)*Fac(reg.n-reg.m));
FINSI;
Reescribe(fich,reg); //Construimos este procedimiento
FIN-MIENTRAS;
CERRAR fich;
FIN
PROC Reescribe(fich: FICHERO DE reg_datos, reg: reg_datos)
INICIO
POSICIONA(fich,NUM_REG(fich)-1); //retrasamos una posición
ESCRIBE reg EN fich;
FIN
*/
# include <stdio.h>
struct reg_datos { int n,m;
float c;
};
long int Fac(int n);
void Reescribe(FILE *fich, struct reg_datos *reg);
int main() { struct reg_datos reg;
FILE *fich;
/* abrimos fich para lectura/escritura */
if ((fich=fopen("NUMEROS.DAT","rb+"))==NULL) { printf("Error al abrir el fichero.\n"); exit(1);
}
/* proceso */
while (fread(®,sizeof(struct reg_datos),1,fich)) { if (reg.n < reg.m)
reg.c = 0;
else
reg.c = (float) Fac(reg.n)/(Fac(reg.m)*Fac(reg.n-reg.m));
Reescribe(fich,®);
}
fclose(fich);
return 0;
}
long int Fac(int n) { long int f=1;
int i;
for (i=n;i>1;i--)
f *= i;
return f;
}
void Reescribe(FILE *fich, struct reg_datos *reg) { long int byte_actual = ftell(fich);
/* lo primero que tenemos que hacer es posicionar el puntero un registro atrás */
fseek(fich, byte_actual-sizeof(struct reg_datos), SEEK_SET);
/* ahora "reescribimos" nuestro registro en la posición correcta */
fwrite(reg,sizeof(struct reg_datos),1,fich);
fflush(fich);
}
###################################[lee_de_fichero_texto.c]##################################################
/* Lectura de un fichero texto.
Este programa lee números del fichero "NUMEROS.TXT" y los escribe por
la pantalla.
*/
# include <stdio.h>
int main() { FILE *fich; /* puntero del fichero */
int n; /* número a leer */
printf("Lectura del archivo NUMEROS.TXT: \n"); /* abrimos el archivo para lectura */
fich = fopen("NUMEROS.TXT","rt"); fscanf(fich,"%d",&n); /* leo del fichero */
while (!feof(fich)) { printf("%d\n",n); fscanf(fich,"%d",&n); /* leo del fichero */
}
fclose(fich);
return 0;
}
###################################[lee_de_fichero_texto_2.c]##################################################
/* Lectura de un fichero texto.
Este programa lee las frases que hay en un fichero de texto introducido
como argumento al llamar al programa y lo escribe por la pantalla
*/
# include <stdio.h>
# include <string.h>
# define MAX_LONGITUD 256 /* supondremos que la máxima longitud de una línea es 255 */
int main(int argc, char *argv[]) { FILE *texto;
char linea[MAX_LONGITUD];
/* si no hay por lo menos un argumento acabamos */
if (argc<2) { printf("No ha introducido nombre de fichero.\n"); exit(1);
}
/* abrimos el archivo para lectura */
if ((texto=fopen(argv[1],"rt"))==NULL) { printf("No es posible abrir para lectura el fichero %s\n",argv[1]); exit(1);
}
/* proceso */
while (fgets(linea,MAX_LONGITUD,texto))
printf("%s",linea); fclose(texto);
return 0;
}
###################################[lee_de_fichero_binario.c]##################################################
/*
Lectura de un fichero binario.
*****************************
Este programa lee números del fichero "NUMEROS.DAT" y los escribe por
la pantalla.
*/
# include <stdio.h>
void main(void) { FILE *fich; /* puntero del fichero */
int n; /* número a leer */
printf("Lectura del archivo NUMEROS.DAT: \n"); fich = fopen("NUMEROS.DAT","rb"); /* abrimos el archivo para lectura */ fread(&n,sizeof(int),1,fich); /* leo del fichero */
while (!feof(fich)) { printf("%d\n",n); fread(&n,sizeof(int),1,fich); /* leo del fichero */
}
fclose(fich);
}
###################################[lee_de_fichero_binario_2.c]##################################################
/*
Lectura de un archivo binario.
*****************************
Este programa lee números del fichero "NUMEROS.DAT" y los escribe
por la pantalla. Igual que el ejercicio anterior pero mejorado.
*/
# include <stdio.h>
void main(void) { FILE *fich; /* puntero del fichero */
int n; /* número a leer */
printf("Lectura del archivo NUMEROS.DAT: \n"); if ((fich=fopen("NUMEROS.DAT","rb"))==NULL) { printf("Error al abrir el fichero.\n"); exit(1);
}
while (fread(&n,sizeof(int),1,fich)) /* fread>0 si ha leído registros */
printf("%d\n",n); fclose(fich);
}
###################################[informe_pantalla.c]##################################################
/*
Informe por pantalla de un archivo binario.
Este programa lee registros de tres números (dos enteros y un real)
del fichero "NUMEROS.DAT" y los muestra por pantalla de forma paginada.
*/
# include <stdio.h>
# define NUM_LIN 15
int main() { FILE *fich; /* puntero del fichero */
struct reg_num { int n,m;
float c;
} numeros;
int i,fila=1,pag=1; /* necesarias para el informe por pantalla */
if ((fich = fopen("NUMEROS.DAT","rb"))==NULL) { printf("Error al abrir el archivo.\n"); exit(1); }
while (fread(&numeros,sizeof(struct reg_num),1,fich)) { if (fila==1) { /* Cabecera (1ª línea) */ system("clear"); printf("INFORME POR PANTALLA. Pantalla %d\n\n",pag); printf(" n m c\n"); printf("----- ----- ---------\n"); fila=4;
}
/* cuerpo */
printf("%5d %5d %9.2f\n",numeros.n,numeros.m,numeros.c); fila++;
if (fila>=NUM_LIN-2) { /* Pie */ printf("\n\nPulse una tecla para continuar..."); getchar(); pag++;
fila = 1;
}
}
fclose(fich);
return 0;
}
###################################[escribe_en_fichero_texto.c]##################################################
/* Ejemplo escritura en un fichero texto.
Este programa lee números del teclado y los introduce en un archivo
llamado "NUMEROS.TXT" (Será texto). Terminamos cuando introduzcamos
un cero.
*/
# include <stdio.h>
int main() { FILE *fich; /* puntero del fichero */
int n; /* número a escribir */
/* abrimos el archivo para escritura */
fich = fopen("NUMEROS.TXT","wt"); printf("Introduzca los números del archivo: \n"); scanf("%d",&n); while (n) { fprintf(fich,"%d\n",n); /* escribo en el fichero */
scanf("%d",&n); }
fclose(fich);
return 0;
}
###################################[escribe_en_fichero_texto_2.c]##################################################
/* Ejemplo escritura en un fichero texto.
Este programa lee frases del teclado y los añade en el archivo que se
indique como argumento al llamar al programa (Será texto).
Terminamos cuando introduzcamos una cadena vacía.
Observar como cuando el fichero existe la información se pone al final
de la que ya había.*/
# include <stdio.h>
# include <string.h>
int main(int argc, char *argv[]) { FILE *texto;
char frase[256]; /* frase a leer */
/* si no hay por lo menos un argumento acabamos */
if (argc<2) { printf("No ha introducido nombre de fichero.\n"); exit(1);
}
/* abrimos el archivo para añadir */
texto=fopen(argv[1],"at");
/* proceso */
gets(frase);
while (strlen(frase)) { fputs(frase,texto); /* escribo en el fichero */
fputs("\n",texto); gets(frase);
}
fclose(texto);
return 0;
}
###################################[escribe_en_fichero_binario.c]##################################################
/* Ejemplo escritura en un fichero binario.
Este programa lee números del teclado y los introduce en un archivo
llamado "NUMEROS.DAT" (Será binario). Terminamos cuando introduzcamos
un cero.
*/
# include <stdio.h>
int main() { FILE *fich; /* puntero del fichero */
int n; /* número a escribir */
printf("Introduzca los números del archivo: \n"); fich = fopen("NUMEROS.DAT","wb"); /* abrimos el archivo para escritura */ scanf("%d",&n); while (n) { fwrite(&n,sizeof(int),1,fich); /* escribo en el fichero */
scanf("%d",&n); }
fclose(fich);
return 0;
}
###################################[escribe_en_fichero_binario_2.c]##################################################
/* Ejemplo escritura en un fichero binario.
Este programa lee números del teclado de tres en tres (dos enteros
y un real) y los introduce como registros en un archivo llamado
"NUMEROS.DAT" (Será binario).
Terminamos cuando los tres sean cero.
*/
# include <stdio.h>
struct reg_num { int n,m;
float c;
};
void LeerNum(struct reg_num *);
int main() { FILE *fich; /* puntero del fichero */
struct reg_num numeros; /* números a escribir */
fich = fopen("NUMEROS.DAT","wb"); /* abrimos el archivo para escritura */ LeerNum(&numeros);
while (numeros.n!=0 || numeros.m!=0 || numeros.c!=0) { fwrite(&numeros,sizeof(struct reg_num),1,fich); /* escribo en el fichero */
LeerNum(&numeros);
}
fclose(fich);
return 0;
}
void LeerNum(struct reg_num *reg) { static int n=0;
system("clear"); printf("Datos del registro %d:\n\n",++n); printf("n: "); scanf("%d",®->n); printf("m: "); scanf("%d",®->m); printf("c: "); scanf("%f",®->c);}
###################################[busca_texto.c]##################################################
/* Este programa pide un número al usuario y lo busca dentro del
fichero NUMEROS.TXT.
Escribe por pantalla si está o no, y en caso de que esté‚ la línea
en la que está. */
#include <stdio.h>
#define LONGITUD 11 /* longitud de la cadena + '\0' */
int main() { char a_buscar[LONGITUD]; /* cadena a buscar en el fichero */
char cadena[LONGITUD]; /* cadena le¡da del fichero */
int n=1; /* n£mero de l¡nea del archivo */
FILE *fichero;
if ((fichero=fopen("NUMEROS.TXT","rt"))==NULL) { printf("Error al abrir el fichero NUMEROS.TXT\n"); exit(1);
}
printf("Cadena a buscar: "); gets(a_buscar);
fscanf(fichero,"%s",cadena);
while (!feof(fichero) && strcmp(a_buscar,cadena)!=0) { /* comprobamos si hemos le¡do el final del archivo o si lo que
hemos le¡do es el valor que estamos buscando. */
n++ ; /* una l¡nea m s, si estamos aqu¡ es porque el £ltimo
registro le¡do no es el que buscamos */
fscanf(fichero,"%s",cadena);
}
/* ahora comprobamos si hemos salido del bucle porque hemos encontrado
lo que buscábamos o porque se ha terminado el fichero */
if (feof(fichero))
printf("Valor no encontrado.\n"); else
printf("El valor buscado está en la línea %d.\n",n); fclose(fichero);
return 0;
}
###################################[busca_texto_2.c]##################################################
/* Este programa pide un n£mero al usuario y los busca dentro del fichero
NUMEROS.TXT.
Escribe por pantalla si est o no, y en caso de que est‚ la l¡nea en
la que est .
*/
#include <stdio.h>
#define LONGITUD 11 /* longitud de la cadena + '\0' */
void lee_cadena_fichero(char *cadena,int max_longitud,FILE *fichero);
void main(void) { char a_buscar[LONGITUD]; /* cadena a buscar en el fichero */
char cadena[LONGITUD]; /* cadena le¡da del fichero */
int n=1; /* n£mero de l¡nea del archivo */
FILE *fichero;
/* comprobamos si existe el fichero */
if ((fichero=fopen("NUMEROS.TXT","rt"))==NULL) { printf("Error al abrir el fichero NUMEROS.TXT\n"); exit(1);
}
/* pedimos al usuario la cadena a buscar en el fichero */
printf("Cadena a buscar: "); gets(a_buscar);
/* buscamos en el fichero */
lee_cadena_fichero(cadena,LONGITUD,fichero); /* sustituimos por fgets */
while (!feof(fichero) && strcmp(a_buscar,cadena)!=0) { /* comprobamos si hemos le¡do el final del archivo o si lo que
hemos le¡do es el valor que estamos buscando. */
n++ ; /* una l¡nea m s, si estamos aqu¡ es porque el £ltimo
registro le¡do no es el que buscamos */
lee_cadena_fichero(cadena,LONGITUD,fichero);
}
/* ahora comprobamos si hemos salido del bucle porque hemos encontrado
lo que busc bamos o porque se ha terminado el fichero */
if (feof(fichero))
printf("Valor no encontrado.\n"); else
printf("El valor buscado est en la l¡nea %d.\n",n); fclose(fichero);
return;
}
/* la siguiente funci¢n opera de forma parecida a fgets, pero a diferencia
de fgets que mete el car cter \n al final de la cadena, esta funci¢n no
lo hace (como lo har¡a fscanf). */
void lee_cadena_fichero(char *cadena,int max_longitud,FILE *fichero) { int longitud_cadena;
fgets(cadena,max_longitud,fichero);
/* quitamos el '\n' del final de la cadena */
longitud_cadena = strlen(cadena);
cadena[longitud_cadena - 1] = '\0'; /* finalizador de cadena */
}
###################################[borra_de_fichero.c]##################################################
/* Borrado de un registro en fichero binario (se hace igual en uno de texto).
Este programa borra un registro del fichero "NUMEROS.DAT" (el que corresponda al número
que se le pase como argumento) de la siguiente forma:
1. Creando un fichero temporal que tenga todos los registros del fichero anterior
menos el que hay que borrar.
2. Borrando el primer fichero (NUMEROS.DAT).
3. Renombrando el fichero temporal. */
# include <stdio.h>
void main(int argc, char *argv[]) { int n,borrame; /* registro de transferencia y número a borrar */
FILE *fich,*temporal;
/* primero comprobamos que el número de argumentos es correcto */
if (argc<2) { /* no hay argumento, terminamos. */ printf("No ha introducido el número a borrar.\n"); exit(1);
}
/* abrimos el fichero */
if ((fich = fopen("NUMEROS.DAT","rb"))==NULL) { /* abrimos el archivo para lectura */ printf("No existe el fichero.\n"); exit(1);
}
temporal = fopen("temporal","wb"); /* creamos fichero temporal */ borrame=atoi(argv[1]);
while (fread(&n,sizeof(int),1,fich)) /* copiamos registros en temporal */
if (n!=borrame) /* sólo si no es el que hay que borrar */
fwrite(&n,sizeof(int),1,temporal);
fclose(fich); /* cerramos ficheros */
fclose(temporal);
remove("NUMEROS.DAT"); /* borramos y renombramos */ rename("temporal","NUMEROS.DAT"); return 0;
}
###################################[Archivos_Concat_All.c]##################################################
/*
| ESTE ARCHICO CONTIENE TODOS LOS ARCHIVOS EJEMPLOS DESARROLLADOS EN EL CURSO
*/
###################################[reescritura_en_fichero_binario.c]##################################################
/* Tengo un archivo llamado "NUMEROS.DAT" compuesto por registros con
tres campos:
n entero
m entero
c real
queremos cambiar el contenido de estos registros de esta forma, cuando
n sea menor que m haremos que el campo c valga cero, y en caso contrario
(n>=m) haremos que el campo c sea el número combinatorio de n sobre m.
ALGORITMO Reescritura
TIPOS
reg_datos = REGISTRO
n,m: ENTERO;
c: REAL;
FIN-REGISTRO;
ENTORNO
reg: reg_datos;
fich: FICHERO DE reg_datos;
INICIO
ASIGNAR "NUMEROS.DAT" A fich;
ABRIR fich PARA L/E;
MIENTRAS NO EOF(fich) HACER
LEER reg DE fich;
SI reg.n < reg.m
ENTONCES reg.c <-- 0;
SINO reg.c <-- Fac(reg.n)/(Fac(reg.m)*Fac(reg.n-reg.m));
FINSI;
Reescribe(fich,reg); //Construimos este procedimiento
FIN-MIENTRAS;
CERRAR fich;
FIN
PROC Reescribe(fich: FICHERO DE reg_datos, reg: reg_datos)
INICIO
POSICIONA(fich,NUM_REG(fich)-1); //retrasamos una posición
ESCRIBE reg EN fich;
FIN
*/
# include <stdio.h>
struct reg_datos { int n,m;
float c;
};
long int Fac(int n);
void Reescribe(FILE *fich, struct reg_datos *reg);
int main() { struct reg_datos reg;
FILE *fich;
/* abrimos fich para lectura/escritura */
if ((fich=fopen("NUMEROS.DAT","rb+"))==NULL) { printf("Error al abrir el fichero.\n"); exit(1);
}
/* proceso */
while (fread(®,sizeof(struct reg_datos),1,fich)) { if (reg.n < reg.m)
reg.c = 0;
else
reg.c = (float) Fac(reg.n)/(Fac(reg.m)*Fac(reg.n-reg.m));
Reescribe(fich,®);
}
fclose(fich);
return 0;
}
long int Fac(int n) { long int f=1;
int i;
for (i=n;i>1;i--)
f *= i;
return f;
}
void Reescribe(FILE *fich, struct reg_datos *reg) { long int byte_actual = ftell(fich);
/* lo primero que tenemos que hacer es posicionar el puntero un registro atrás */
fseek(fich, byte_actual-sizeof(struct reg_datos), SEEK_SET);
/* ahora "reescribimos" nuestro registro en la posición correcta */
fwrite(reg,sizeof(struct reg_datos),1,fich);
fflush(fich);
}
###################################[lee_de_fichero_texto.c]##################################################
/* Lectura de un fichero texto.
Este programa lee números del fichero "NUMEROS.TXT" y los escribe por
la pantalla.
*/
# include <stdio.h>
int main() { FILE *fich; /* puntero del fichero */
int n; /* número a leer */
printf("Lectura del archivo NUMEROS.TXT: \n"); /* abrimos el archivo para lectura */
fich = fopen("NUMEROS.TXT","rt"); fscanf(fich,"%d",&n); /* leo del fichero */
while (!feof(fich)) { printf("%d\n",n); fscanf(fich,"%d",&n); /* leo del fichero */
}
fclose(fich);
return 0;
}
###################################[lee_de_fichero_texto_2.c]##################################################
/* Lectura de un fichero texto.
Este programa lee las frases que hay en un fichero de texto introducido
como argumento al llamar al programa y lo escribe por la pantalla
*/
# include <stdio.h>
# include <string.h>
# define MAX_LONGITUD 256 /* supondremos que la máxima longitud de una línea es 255 */
int main(int argc, char *argv[]) { FILE *texto;
char linea[MAX_LONGITUD];
/* si no hay por lo menos un argumento acabamos */
if (argc<2) { printf("No ha introducido nombre de fichero.\n"); exit(1);
}
/* abrimos el archivo para lectura */
if ((texto=fopen(argv[1],"rt"))==NULL) { printf("No es posible abrir para lectura el fichero %s\n",argv[1]); exit(1);
}
/* proceso */
while (fgets(linea,MAX_LONGITUD,texto))
printf("%s",linea); fclose(texto);
return 0;
}
###################################[lee_de_fichero_binario.c]##################################################
/*
Lectura de un fichero binario.
*****************************
Este programa lee números del fichero "NUMEROS.DAT" y los escribe por
la pantalla.
*/
# include <stdio.h>
void main(void) { FILE *fich; /* puntero del fichero */
int n; /* número a leer */
printf("Lectura del archivo NUMEROS.DAT: \n"); fich = fopen("NUMEROS.DAT","rb"); /* abrimos el archivo para lectura */ fread(&n,sizeof(int),1,fich); /* leo del fichero */
while (!feof(fich)) { printf("%d\n",n); fread(&n,sizeof(int),1,fich); /* leo del fichero */
}
fclose(fich);
}
###################################[lee_de_fichero_binario_2.c]##################################################
/*
Lectura de un archivo binario.
*****************************
Este programa lee números del fichero "NUMEROS.DAT" y los escribe
por la pantalla. Igual que el ejercicio anterior pero mejorado.
*/
# include <stdio.h>
void main(void) { FILE *fich; /* puntero del fichero */
int n; /* número a leer */
printf("Lectura del archivo NUMEROS.DAT: \n"); if ((fich=fopen("NUMEROS.DAT","rb"))==NULL) { printf("Error al abrir el fichero.\n"); exit(1);
}
while (fread(&n,sizeof(int),1,fich)) /* fread>0 si ha leído registros */
printf("%d\n",n); fclose(fich);
}
###################################[informe_pantalla.c]##################################################
/*
Informe por pantalla de un archivo binario.
Este programa lee registros de tres números (dos enteros y un real)
del fichero "NUMEROS.DAT" y los muestra por pantalla de forma paginada.
*/
# include <stdio.h>
# define NUM_LIN 15
int main() { FILE *fich; /* puntero del fichero */
struct reg_num { int n,m;
float c;
} numeros;
int i,fila=1,pag=1; /* necesarias para el informe por pantalla */
if ((fich = fopen("NUMEROS.DAT","rb"))==NULL) { printf("Error al abrir el archivo.\n"); exit(1); }
while (fread(&numeros,sizeof(struct reg_num),1,fich)) { if (fila==1) { /* Cabecera (1ª línea) */ system("clear"); printf("INFORME POR PANTALLA. Pantalla %d\n\n",pag); printf(" n m c\n"); printf("----- ----- ---------\n"); fila=4;
}
/* cuerpo */
printf("%5d %5d %9.2f\n",numeros.n,numeros.m,numeros.c); fila++;
if (fila>=NUM_LIN-2) { /* Pie */ printf("\n\nPulse una tecla para continuar..."); getchar(); pag++;
fila = 1;
}
}
fclose(fich);
return 0;
}
###################################[escribe_en_fichero_texto.c]##################################################
/* Ejemplo escritura en un fichero texto.
Este programa lee números del teclado y los introduce en un archivo
llamado "NUMEROS.TXT" (Será texto). Terminamos cuando introduzcamos
un cero.
*/
# include <stdio.h>
int main() { FILE *fich; /* puntero del fichero */
int n; /* número a escribir */
/* abrimos el archivo para escritura */
fich = fopen("NUMEROS.TXT","wt"); printf("Introduzca los números del archivo: \n"); scanf("%d",&n); while (n) { fprintf(fich,"%d\n",n); /* escribo en el fichero */
scanf("%d",&n); }
fclose(fich);
return 0;
}
###################################[escribe_en_fichero_texto_2.c]##################################################
/* Ejemplo escritura en un fichero texto.
Este programa lee frases del teclado y los añade en el archivo que se
indique como argumento al llamar al programa (Será texto).
Terminamos cuando introduzcamos una cadena vacía.
Observar como cuando el fichero existe la información se pone al final
de la que ya había.*/
# include <stdio.h>
# include <string.h>
int main(int argc, char *argv[]) { FILE *texto;
char frase[256]; /* frase a leer */
/* si no hay por lo menos un argumento acabamos */
if (argc<2) { printf("No ha introducido nombre de fichero.\n"); exit(1);
}
/* abrimos el archivo para añadir */
texto=fopen(argv[1],"at");
/* proceso */
gets(frase);
while (strlen(frase)) { fputs(frase,texto); /* escribo en el fichero */
fputs("\n",texto); gets(frase);
}
fclose(texto);
return 0;
}
###################################[escribe_en_fichero_binario.c]##################################################
/* Ejemplo escritura en un fichero binario.
Este programa lee números del teclado y los introduce en un archivo
llamado "NUMEROS.DAT" (Será binario). Terminamos cuando introduzcamos
un cero.
*/
# include <stdio.h>
int main() { FILE *fich; /* puntero del fichero */
int n; /* número a escribir */
printf("Introduzca los números del archivo: \n"); fich = fopen("NUMEROS.DAT","wb"); /* abrimos el archivo para escritura */ scanf("%d",&n); while (n) { fwrite(&n,sizeof(int),1,fich); /* escribo en el fichero */
scanf("%d",&n); }
fclose(fich);
return 0;
}
###################################[escribe_en_fichero_binario_2.c]##################################################
/* Ejemplo escritura en un fichero binario.
Este programa lee números del teclado de tres en tres (dos enteros
y un real) y los introduce como registros en un archivo llamado
"NUMEROS.DAT" (Será binario).
Terminamos cuando los tres sean cero.
*/
# include <stdio.h>
struct reg_num { int n,m;
float c;
};
void LeerNum(struct reg_num *);
int main() { FILE *fich; /* puntero del fichero */
struct reg_num numeros; /* números a escribir */
fich = fopen("NUMEROS.DAT","wb"); /* abrimos el archivo para escritura */ LeerNum(&numeros);
while (numeros.n!=0 || numeros.m!=0 || numeros.c!=0) { fwrite(&numeros,sizeof(struct reg_num),1,fich); /* escribo en el fichero */
LeerNum(&numeros);
}
fclose(fich);
return 0;
}
void LeerNum(struct reg_num *reg) { static int n=0;
system("clear"); printf("Datos del registro %d:\n\n",++n); printf("n: "); scanf("%d",®->n); printf("m: "); scanf("%d",®->m); printf("c: "); scanf("%f",®->c);}
###################################[busca_texto.c]##################################################
/* Este programa pide un número al usuario y lo busca dentro del
fichero NUMEROS.TXT.
Escribe por pantalla si está o no, y en caso de que esté‚ la línea
en la que está. */
#include <stdio.h>
#define LONGITUD 11 /* longitud de la cadena + '\0' */
int main() { char a_buscar[LONGITUD]; /* cadena a buscar en el fichero */
char cadena[LONGITUD]; /* cadena le¡da del fichero */
int n=1; /* n£mero de l¡nea del archivo */
FILE *fichero;
if ((fichero=fopen("NUMEROS.TXT","rt"))==NULL) { printf("Error al abrir el fichero NUMEROS.TXT\n"); exit(1);
}
printf("Cadena a buscar: "); gets(a_buscar);
fscanf(fichero,"%s",cadena);
while (!feof(fichero) && strcmp(a_buscar,cadena)!=0) { /* comprobamos si hemos le¡do el final del archivo o si lo que
hemos le¡do es el valor que estamos buscando. */
n++ ; /* una l¡nea m s, si estamos aqu¡ es porque el £ltimo
registro le¡do no es el que buscamos */
fscanf(fichero,"%s",cadena);
}
/* ahora comprobamos si hemos salido del bucle porque hemos encontrado
lo que buscábamos o porque se ha terminado el fichero */
if (feof(fichero))
printf("Valor no encontrado.\n"); else
printf("El valor buscado está en la línea %d.\n",n); fclose(fichero);
return 0;
}
###################################[busca_texto_2.c]##################################################
/* Este programa pide un n£mero al usuario y los busca dentro del fichero
NUMEROS.TXT.
Escribe por pantalla si est o no, y en caso de que est‚ la l¡nea en
la que est .
*/
#include <stdio.h>
#define LONGITUD 11 /* longitud de la cadena + '\0' */
void lee_cadena_fichero(char *cadena,int max_longitud,FILE *fichero);
void main(void) { char a_buscar[LONGITUD]; /* cadena a buscar en el fichero */
char cadena[LONGITUD]; /* cadena le¡da del fichero */
int n=1; /* n£mero de l¡nea del archivo */
FILE *fichero;
/* comprobamos si existe el fichero */
if ((fichero=fopen("NUMEROS.TXT","rt"))==NULL) { printf("Error al abrir el fichero NUMEROS.TXT\n"); exit(1);
}
/* pedimos al usuario la cadena a buscar en el fichero */
printf("Cadena a buscar: "); gets(a_buscar);
/* buscamos en el fichero */
lee_cadena_fichero(cadena,LONGITUD,fichero); /* sustituimos por fgets */
while (!feof(fichero) && strcmp(a_buscar,cadena)!=0) { /* comprobamos si hemos le¡do el final del archivo o si lo que
hemos le¡do es el valor que estamos buscando. */
n++ ; /* una l¡nea m s, si estamos aqu¡ es porque el £ltimo
registro le¡do no es el que buscamos */
lee_cadena_fichero(cadena,LONGITUD,fichero);
}
/* ahora comprobamos si hemos salido del bucle porque hemos encontrado
lo que busc bamos o porque se ha terminado el fichero */
if (feof(fichero))
printf("Valor no encontrado.\n"); else
printf("El valor buscado est en la l¡nea %d.\n",n); fclose(fichero);
return;
}
/* la siguiente funci¢n opera de forma parecida a fgets, pero a diferencia
de fgets que mete el car cter \n al final de la cadena, esta funci¢n no
lo hace (como lo har¡a fscanf). */
void lee_cadena_fichero(char *cadena,int max_longitud,FILE *fichero) { int longitud_cadena;
fgets(cadena,max_longitud,fichero);
/* quitamos el '\n' del final de la cadena */
longitud_cadena = strlen(cadena);
cadena[longitud_cadena - 1] = '\0'; /* finalizador de cadena */
}
###################################[borra_de_fichero.c]##################################################
/* Borrado de un registro en fichero binario (se hace igual en uno de texto).
Este programa borra un registro del fichero "NUMEROS.DAT" (el que corresponda al número
que se le pase como argumento) de la siguiente forma:
1. Creando un fichero temporal que tenga todos los registros del fichero anterior
menos el que hay que borrar.
2. Borrando el primer fichero (NUMEROS.DAT).
3. Renombrando el fichero temporal. */
# include <stdio.h>
void main(int argc, char *argv[]) { int n,borrame; /* registro de transferencia y número a borrar */
FILE *fich,*temporal;
/* primero comprobamos que el número de argumentos es correcto */
if (argc<2) { /* no hay argumento, terminamos. */ printf("No ha introducido el número a borrar.\n"); exit(1);
}
/* abrimos el fichero */
if ((fich = fopen("NUMEROS.DAT","rb"))==NULL) { /* abrimos el archivo para lectura */ printf("No existe el fichero.\n"); exit(1);
}
temporal = fopen("temporal","wb"); /* creamos fichero temporal */ borrame=atoi(argv[1]);
while (fread(&n,sizeof(int),1,fich)) /* copiamos registros en temporal */
if (n!=borrame) /* sólo si no es el que hay que borrar */
fwrite(&n,sizeof(int),1,temporal);
fclose(fich); /* cerramos ficheros */
fclose(temporal);
remove("NUMEROS.DAT"); /* borramos y renombramos */ rename("temporal","NUMEROS.DAT"); return 0;
}
###################################[Archivos_Concat_All.c]##################################################