Programación I
Teoría : Entrada/Salida - Archivos
http://proguno.unsl.edu.ar
[email protected]
Entrada/Salida
Interacción del programa con su
ambiente para leer (entrada) y
escribir (salida) datos.
2
Modelo de Entrada/Salida en C
Las entradas o salidas en C, sin importar de
dónde vienen o hacia dónde van, tratan con
streams (flujos) de bytes.
En las operaciones de entrada, los bytes
fluyen desde un dispositivo de entrada a la
memoria principal.
En las operaciones de salida, los bytes fluyen
desde la memoria principal a un dispositivo
de salida.
3
Entrada/Salida
Hasta ahora hemos trabajado sólo:
Entrada estándar: teclado
getchar: lee un caracter
scanf: lee entradas con formato
Salida estándar: pantalla
printf: imprime datos con formato
Existen otras formas …
4
Entrada y Salida Estándar
Entrada estándar (o por defecto):
generalmente es el teclado
Salida estándar (o por defecto):
generalmente es la pantalla
Ambos pueden ser redireccionados a
archivos.
5
Redireccionamiento de la Entrada y la
Salida Estándar
Ej: programa sumador:
#include <stdio.h>
main(){
float sum, x;
sum = 0;
while (scanf("%f", &x) == 1)
sum = sum + x;
printf("La suma de los numeros
ingresados es %.2f\n", sum);
}
6
Redireccionamiento de la Entrada y la
Salida Estándar
Al ejecutar sumador en la línea de
comandos escribiremos:
$ sumador
Nombre del
programa a ejecutar
Prompt del
sistema
Podemos redireccionar el flujo de entrada a
un archivo, desde la línea de comandos:
$ sumador <input.txt
Nombre del
archivo de
entrada
7
Redireccionamiento de Entrada y
Salida Estándar
Igualmente, podemos redireccionar la salida
a un archivo:
$ sumador >output.txt
Nombre del
archivo de
salida
o ambos:
$ sumador <input.txt >output.txt
8
Acceso a Archivos
Hasta ahora nuestros programas leen y
escriben sólo en la entrada y salida
estándar.
Queremos poder leer/escribir en archivos.
9
Apertura de Archivos
Para poder leer/escribir un archivo, este debe
encontrarse abierto:
FILE *fopen(char *name, char *mode);
Puntero a archivo.
Usado en las
subsecuentes
lecturas y/o
escrituras del
archivo.
Retorna NULL si
no pudo realizar la
operación.
Nombre
del
archivo a
abrir
Modo de
apertura
del
archivo
10
Apertura de Archivos – Modos de Apertura
11
Apertura de Archivos - Ejemplos
FILE *fp1, *fp2, *fp3;
fp1 = fopen("fechas.txt","r"); /*
fp2 = fopen("empleados.txt","a"); /*
abre archivo fechas.txt para lectura
*/
abre archivo empleados.txt para
añadir */
fp3 = fopen("master.dat","w+"); /*
crea archivo master.dat para lectura
o escritura */
12
Acceso a Archivos
Entrada, Salida y Error Estándar
Cuando un programa C es iniciado, el
sistema operativo es responsable de abrir
tres flujos y de proveer los correspondientes
punteros a FILE:
la entrada estándar (stdin)
la salida estándar (stdout)
el error estándar (stderr)
13
Algunas Funciones de Entrada/Salida
int fscanf(FILE *stream,
const char *format, ...)
Lee datos desde un flujo de entrada, los interpreta de
acuerdo a un formato dado y los almacena en
variables.
Retorna la cantidad de entradas leídas o EOF si hubo
error antes de la 1ra lectura.
(fscanf usado con stdin scanf)
14
Ejemplo lectura archivo
FILE *fp;
int i;
fp = fopen("numeros.txt","r");
if (fp==NULL)
else
printf ("error");
fscanf (fp,"%d",&i);
fclose(fp);
15
Ejemplo lectura del archivo
FILE *fp1;
Persona p; //tipo persona
if ((fp1=fopen("personas.txt","r")==NULL))
exit(1);
fscanf (fp,"%s", p.nombre);
fscanf (fp, "%d",&p.edad);
fclose(fp1);
16
Algunas Funciones de Entrada/Salida
int fprintf(FILE *stream,
const char *format, ...)
Imprime datos en un flujo de salida con el formato
dado.
Retorna el nro. de caracteres escritos o un valor
negativo si hubo error.
(fprintf usado con stdout printf )
17
Ejemplo escritura en archivo
FILE *fp;
int i;
fp = fopen("numeros.txt","w");
if (fp==NULL)
else
printf ("error");
fprintf (fp,"%d",i);
fclose(fp);
18
Ejemplo escritura en archivo
FILE *fp1;
persona p; //tipo persona
if ((fp1=fopen("personas.txt","w")==NULL))
exit(1);
fprintf (fp,"%s", p.nombre);
fprintf (fp,"%d",p.edad);
fclose(fp1);
19
Algunas Funciones de Entrada/Salida
fread(buffer, tam, n, fp)
Lee del archivo apuntado por fp, n
componentes de tamaño tam y los almacena a
partir de la dirección apuntada por buffer
Lee datos desde un flujo de entrada, sin
formato y los almacena en variables.
Retorna el nro. de caracteres leídos o un valor
negativo si hubo error.
20
Ejemplo de lectura desde archivo
FILE *fp1;
persona p[max]; //tipo persona
if ((fp1=fopen("personas.txt","r")==NULL))
exit(1);
fread(p,sizeof(persona),2,fp1);
fclose(fp1);
21
Algunas Funciones de Entrada/Salida
fwrite(buffer, tam, n, fp)
Escribe en el archivo apuntado por fp, n componentes
de tamaño tam que estan almacenados a partir de la
dirección apuntada por buffer
Escribe datos desde un flujo de entrada, sin formato
y los almacena en variables.
Retorna el nro. de caracteres escritos o un valor
negativo si hubo error.
22
Ejemplo de escritura en archivo
FILE *fp1;
persona p[max]; //tipo persona
if ((fp1=fopen("personas.txt","w")==NULL))
exit(1);
fwrite(p,sizeof(persona),2,fp1);
fclose(fp1);
23
Algunas Funciones de Entrada/Salida
void rewind(FILE *stream)
Coloca el apuntador al comienzo del archivo de un
flujo de datos.
int fclose(FILE *stream)
Cierra la conexión entre un archivo y su apuntador,
dejando libre al apuntador para ser usado, si fuera
necesario, con un nuevo archivo.
int feof(FILE *stream)
Retorna 0 si NO llego al final del archivo. Valor
distinto de 0 si llego a fin de archivo.
24
#include <stdlib.h>
int main() {
char str1[10], str2[10];
int year;
FILE * fp1, *fp2;
fp1 = fopen ("file1.txt", "w+");
fp2 = fopen ("file2.txt", "w");
fputs("Estamos en 2018", fp1);
rewind(fp1);
fscanf(fp1, "%s %s %d", str1, str2, &year);
fprintf(fp2, "String1 leido |%s|\n", str1 );
fprintf(fp2, "String2 leido |%s|\n", str2 );
fprintf(fp2, "Entero leido |%d|\n", year );
fclose(fp1);
fclose(fp2);
return(0);
}
25
Algunas Funciones de Entrada/Salida
int fgetc(FILE *stream)
int getc(FILE *stream)
Lee y retorna el próximo caracter en un flujo de
entrada avanzando el apuntador al próximo carácter
en el flujo de entrada.
(getc/fgetc usado con stdin getchar)
26
Algunas Funciones de Entrada/Salida
int fputc(int char, FILE *stream)
int putc(int char, FILE *stream)
Escribe un caracter especificado por el argumento
char en el flujo especificado y avanza la posición del
apuntador en el flujo.
Retorna el carácter escrito si no hubo error, sino EOF.
(putc/fputc usado con stdout putchar)
27
Ejemplo
}
/* filecopy: copia archivo ifp a
archivo ofp */
void filecopy(FILE *ifp, FILE *ofp){
int c;
while ((c = getc(ifp)) != EOF)
putc(c, ofp);
28
Algunas Funciones de Entrada/Salida
char *fgets(char *str, int n,
FILE *stream)
Lee una línea de un flujo y la almacena en el string
apuntado por str. Para cuando leyó (n-1) caracteres
o leyó ‘\n’ o se alcanzó el fin de archivo (lo que
ocurra primero).
Retorna la línea leída; si lee el fin del archivo u
ocurre algún error durante la lectura retorna NULL.
(fgets usado con stdin gets)
29
Algunas Funciones de Entrada/Salida
int fputs(const char *str, FILE
*stream)
Escribe un string, sin \0, en un flujo de salida.
Retorna un entero positivo, o EOF si hubo error.
(fputs usado con stdout puts)
30
int main(){
FILE *fp;
char str[60];
fp = fopen("file2.txt", "r");
if(fp == NULL) {
perror("Error al abrir file2.txt");
return(-1);
}
}
while (fgets(str, 60, fp) != NULL)
fclose(fp);
return(0);
fputs(str, stdout);
31
Parámetros de un Programa
Muchas veces, resulta necesario al invocar un programa
para su ejecución, desde la línea de comandos, pasarle
argumentos de entrada.
Ejemplo: Programa echo que reproduce sus argumentos
de la línea de comandos, en una línea aparte, separados
por blancos:
$ echo hello, world
imprime en la pantalla:
hello, world
¿Cómo lo hacemos? Por medio de los parámetros del
programa
int main(int argc, char *argv[]);
32
Parámetros de un Programa
Ejemplo
$ echo hello, world
argc
argv[0]
argv[1]
argv[2]
argv[3]
3
NULL
‘e’ ‘c’ ‘h’ ‘o’ ‘\0’
‘h’ ‘e’ ‘l’ ‘l’ ‘o’ ‘,’ ‘\0’
‘w’ ‘o’ ‘r’ ‘l’ ‘d’ ‘\0’
33
Parámetros de un Programa
Ejemplo
#include <stdio.h>
/* comando echo */
main(int argc, char *argv[]){
int i;
for (i = 1; i < argc; i++){
printf(”%s”, argv[i]);
if (i < argc-1) printf(” ”);
}
printf("\n");
return 0;
}
34
Comentarios de: Programación I Teoría : Entrada/Salida (0)
No hay comentarios