Función Open
Uso de fopen()
FILE*fich;
fich=fopen("ejemplo.txt", "r");
if (fich==NULL)
printf("Error en la apertura del fichero\n");
else
{
...
}
Lectura y escritura de un fichero en modo texto
Igual que la lectura/escritura por teclado/pantalla pero haciéndolo sobre un fichero.
Se usan las funciones fprintf y fscanf en vez de printf y scanf.
- Tienen un parámetro más (el primero) que indica en qué fichero escribir o leer. Por lo demás, funcionan exactamente igual que las otras dos.
fprintf(fich, "%i", numero);
fscanf(fich, "%i", &numero);
Lectura y escritura de un fichero en modo binario
Los datos se vuelcan tal y como se encuentran en memoria.
Adecuado para datos complejos (structs y matrices).
Un fichero binario no es editable (Veremos símbolos raros).
Dos nuevas funciones:
- fwrite(ptdato, N, k, fichero)
-fread(ptdato, N, k, fichero)
en ambos casos:
* ptdato: puntero a donde se encuentran los datos.
* n: tamaño del elemento.
* k: número de elementos.
* fichero: puntero de tipo FILE.
Ambas funciones devuelevb el número de elementos leídos/escritos correctamente. Si el número es menor del esperado algo ha pasado:
- Error.
- Se ha llegado al final del fichero (en el caso de lectura).
fread() y fwrite()
Aquí es donde es realmente útil la función sieof() que ya hemos empleado alguna vez.
Ejemplo:
FILE*fich;
struct medida
{
int hora;
int minuto;
float valor;
}*dato;
...
fread(dato, sizeof(struct medida), 1, fich);
...
fwrite(dato, sizeof(struct medida), 1, fich);
...
Cierre de un fichero
Operación muy importante que supone el fin del tratamiento del fichero.
En caso de escritura, asegura que se han escrito todos los datos en el disco.
fclose(fich);
feof()
Control de lectura: para saber cuándo se llega al final del fichero existente la función feof().
Devuelve
- cierto cuando ya hemoos leído todos los datos del fichero.
- Falso cuando aún quedan por leer.
Esquema: Importantisimo mantener el esquema!!
leer(fich, dato);
mientras que (!feof(fich))
procesar_dato();
leer(fich, dato);
fin_mientras;
Es decir, el fin de fichero es como si fuera un carácter que se lee, y es entonces cuando comprobamos a ver si ya hemos llegado al final.
Ejercicio
Tenemos un fichero de texto que contienen muchos enteros (eso sí, esa cantidad es múltiplo de 10). Se trata de ir leyendo datos de ese fichero de texto e ir calculando y mostrando por pantalla las medias ide los números de 10 en 10. Es decir, primero la media de los 10 sogiguientes, y así hasta que el fichero se termine.
Solución
#include <stdio.h>
main()
{
FILE*f;
int dato, suma, i;
f=fopen("fichero.txt","r");
if (f==NULL)
printf("Error en la apretura\n");
else
{
fscanf(f,"%i",&dato);
while (!feof(f))
{
suma=0;
for (i=0;i<10;i++)
{
suma+=dato;
fscanf(f,"%i", &dato);
}
printf("La media es %d\n", suma/10);
}
fclose(f);
}
}
Ejercicio
Tenemos un fichero de registros "fichero.dat" cuyas componentes están definidas según la declaración siguiente:
typedef struct registro 1
{
char partido[60];
char localidad[60];
int candidatos;
} ANTES;
Se quiere sustituir la estructura del registro por l siguiente:
typedef struct registro 1
{
char partido[60];
char localidad[60];
int candidatos, elegidos;
} DESPUES;
Escribe un programa que modifique la estructura y trasvase toda la información del fichero primitivo al nuevo "nuevo.dat", inicializando a 0 el nuevo campo creado.
Solución
...
ANTES antes;
DESPUES despues;
FILE*old, *new;
old=fopen("fichero, dat","r");
new=fopen("nuevo.dat","w");
fread(&antes, sizeof(antes), 1, old);
while (!feof(old))
{
strcpy(despues, partido, antes, partido);
strcpy(despues, localidad, antes, localidad);
despues.candidatos=antes.candidatos;
despues.elegidos=0;
fwrite(&despues, sizeof(despues), 1, new);
fread(&antes, sizeof(antes), 1, old);
}
fclose(old);
fclose(new);
...
Tema 5c
by Unknown
Related Posts:
ProgramaciónSolución: traspuesta de una matriz procedimiento trasponer (E/S m: matriz, E n: entero) {Traspone la matriz m de dimensión nxn} variables … Read More
Lenguaje C Caracteres C hace normalmente un tratamiento muy sucio de los datos que almacena, mezclando representación interna y externa. Una variable de tipo … Read More
validación de una fecha int fecha_correcta (int día, int mes, int agno) return (día_correcta(día, mes, agno) && mes_correc… Read More
Registros Continuación tema 6 Ejemplo: números complejos Aqui voy a ser mala y cuando Inazio lo suba al blog lo copio y pego, porque muero de dolor d… Read More
ProgramaciónHe llegado al punto de creer entender los bucles for y while. De aprender a posicionar y llamar funciones, pero necesito más, mucho más. Ya no basta c… Read More
0 comentarios:
Publicar un comentario