Las entradas y salidas de información de un programa pueden realizarse:
Cuando un programa está en ejecución, se convierte en un proceso que dispone de:
sdtin
stdin
stdout
stdout
va a parar a la pantallastderr
stderr
también va a parar a la pantalla
El estándar ANSI C creó un conjunto de funciones estándar para la entrada y salida a través de los ficheros estándar stdin
y stdout
stdio.h
, por lo que para utilizarlas en un programa es preciso incluir la línea: #include <stdio.h>
Las más importantes son:
printf()
para escribir datos con formatoscanf()
para leer datos con formatogetchar()
para leer caracteres del tecladoputchar()
para escribir caracteres en pantalla
La función devuelve el número de bytes escritos o EOF
en caso de error
printf("cadena_de_control", lista_de_argumentos);
»%
»\a | Alarma (pitido) | \ ' | Comilla simple |
\b | Espacio atrás | \“ | Comillas dobles |
\f | Salto de página | \\ | Barra invertida |
\n | Nueva línea | \oo | Carácter ASCII en octal |
\r | Retorno de línea | \xHH | Carácter ASCII en hexadecimal |
\t | Tabulador | \0 | Carácter nulo (Código ASCII cero) |
%[flags][anchura][.precision][prefijo-tipo] formato
flags
: Opcional:-
justifica a la izquierda+
fuerza la aparición del signo siempre0
completa con ceros a la izquierda todo el campoanchura
: Opcional: Ancho del campo en el que aparecerá el dato.precision
: Opcional:prefijo-tipo
: Opcional, para indicar a la función como debe interpretar el dato contenido en la memoria:h
interpreta un short
l
interpreta long
en los enteros o double
en los realesL
interpreta un long double
formato
: Obligatorio, para determinar el tipo de dato de la variable cuyo contenido se va a mostrar:d
Entero con signo en mostrado en decimalu
Entero sin signo mostrado en decimalo
Entero sin signo mostrado en octalx
Entero sin signo mostrado en hexadecimalf
Número real en formato [–]ddd.ddd
e
Número real en formato [–]d.dddE[±]ddd
g
Número real en el formato más cortoc
Carácters
Cadena de caracteresprintf("Número entero: %d", edad); printf("Letra:%c t Octal:%o t Hexadecimal: %x",codigo, codigo, codigo); printf("Número real: %f t %E t %G", estatura, estatura, estatura);
La función devuelve el número de datos leídos correctamente o EOF en caso de error
scanf("cadena_de_control", lista_de_argumentos);
cadena_de_control
:“ ”
t
n
%[*][anchura][prefijo-tipo] formato
[*]
: Opcional: anula la asignación al siguiente datoscanf("%d %*s”, &valor); /* Lee el dato y la cadena que se teclee a continuación del valor entero, pero no se asigna a ninguna variable */
anchura
: Opcional: Número de caracteres a leer (se ignoran los restantes)prefijo-tipo
: Opcional:formato
: Obligatorio, determina el tipo de dato (igual que en printf()
)&
»
El buffer de teclado es una zona de almacenamiento intermedio asociada a la entrada estándar stdin
scanf()
obtiene los valoresstdio.h
que borra este bufferfflush(sdtin);
Función para leer caracteres del teclado. Prototipo:
int getchar(void);
stdio.h
char a; a = getchar(void); scanf("%c", &a);
Función para mostrar caracteres en la pantalla. Prototipo:
int putchar(int variable);
stdio.h
char a; putchar((int)a); printf("%c", a);
En lenguaje C no existe un tipo de dato de cadena de caracteres, los arrays de caracteres o cadenas de caracteres son vectores:
cadena[indice]
0
char nombrevariable[NUMERO_DE_ELEMENTOS];
gets(char *cadena);
stdio.h
#define NUM_ELEM 100 char cadena[NUM_ELEM]; /* Declaración */ gets(cadena); /* Lee una cadena */ scanf("%s", cadena); /* Lee una cadena */
NUM_ELEM
)puts(cadena);
stdio.h
puts(cadena) /* Muestra una cadena */ printf("%s", cadena); /* Muestra una cadena */
printf()
puede utilizarse para mostrar en pantalla la cadena que va entre comillas como argumentoEl lenguaje C proporciona mecanismos para la entrada y salida por ficheros:
En modo texto el final de la línea se representa:
n
» (En ASCII CR: Retorno de carro, código 10)CR+LR
(Retorno de carro + Salto de línea, códigos 10 y 13)CR+LF
, la convierten a «n
»Ctrl+D
(Ctrl+Z
en Windows) lo interpretan como EOF
(End Of File\, fin de fichero). En un lugar de la mancha,
de cuyo nombre no quiero acordarme.
En un lugar de la mancha, r\nde cuyo nombre no quiero acordarme.EOF
En un lugar de la mancha, nde cuyo nombre no quiero acordarme.EOF
Al ejecutar un programa en modo consola, automáticamente el sistema operativo abre tres secuencias estándar:
stdin
stdout
stderr
stdin
, stdout
y stderr
Para acceder a los ficheros se precisa un descriptor del fichero (puntero de tipo FILE
)
FILE *puntero;
FILE
es una constante definida en stdio.h
Antes de cualquier operación sobre un fichero es preciso abrir el fichero, utilizando la función fopen()
FILE * fopen(char *nombrearchivo, char *modo);
FILE
que apunta al fichero abiertoNULL
) en caso de errorModos de apertura de ficheros | |||
Modo | Texto | Binario | Observaciones |
Abrir para leer | "r" | "rb" | Si no existe, se produce error |
Crear para escribir | "w" | "wb" | Si existe, se pierde el contenido |
Abrir o crear para añadir | "a" | "ab" | Si no existe, se crea |
Abrir para leer y/o escribir | "r+" | "rb+" | Debe existir |
Crear para leer y/o escribir | "w+" | "wb+" | Si existe, se pierde el contenido |
Abrir o crear para añadir y/o leer | "a+" | "ab+" | Si no existe, se crea |
Mientras el fichero esté abierto, el descriptor correspondiente apunta a una estructura que contiene toda la información necesaria sobre el fichero:
Al finalizar un programa que utiliza ficheros:
En previsión de finalizaciones anómalas, tras las operaciones de lectura y/o escritura, es preciso cerrar los ficheros, utilizando la función fclose()
:
int fclose(FILE *descriptor);
FILE *pf; /* descriptor a fichero */ if ((pf=fopen("misdatos/prueba.x","w+")) == NULL) { puts("nNo es posible crear el fichero"); exit(0); } else printf("nEl fichero se ha abierto"); /* Tras realizar todas las operaciones necesarias, es preciso cerrar el fichero antes de finalizar el programa */ fclose(pf); /* El fichero ha quedado cerrado */
El carácter de fin de fichero está representado por la constante simbólica EOF
, definida en stdio.h
fgetc()
) puede leerse el EOF y no distinguirse como último carácter, especialmente cuando se trata de secuencias binariasfeof()
, declarada en stdio.h
devuelve un valor distinto de cero (verdadero/true) cuando se lee el byte de fin de fichero (EOF
)while (!feof(puntfile)) { /* Operaciones sobre el fichero abierto */ }
Las funciones de lectura y escritura de caracteres en ficheros están definidas en stdio.h
int fgetc( FILE *pf);
EOF
en caso de errorint fputc( int car, FILE *pf);
EOF
en caso de errorcar
: El carácter a escribirpf
: El descriptor al ficheroFILE *pf1, *pf2; char letra; pf1 = fopen("leer.txt", "r"); letra = fgetc(pf1); /* Lee un carácter */ pf2 = fopen ("escribir.txt", "w"); fputc(letra, pf2); /* Escribe un carácter */ fclose(pf1); fclose(pf2);
Las funciones de lectura y escritura de cadenas de texto en ficheros están definidas en stdio.h
char * fgets(char *cad, int numcar, FILE *pf);
cad
: Un puntero a la zona de memoria donde se almacenará la cadenanumcar-1
: Es el número de caracteres a leer. Será añadido el carácter nulopf
: El puntero al ficheron
), éste será el último carácter leídoint fputs(char *puntcad, FILE *pf);
EOF
en caso de errorpuntcad
: Un puntero a cadena que se quiere escribirpf
: El puntero al ficheroFILE *pf1, *pf2; char lect[50]; char escr[]="Mensaje a guardar en el fichero"; int num=50-1; pf1 = fopen("leer.txt", "r"); fgets(lect, num, pf1); /* Lee una cadena de 49 caracteres de leer.txt */ pf2 = fopen ("escribir.txt", "w"); fputs(escr, pf2); /* Escribe la cadena "Mensaje a guardar en el fichero escribir.txt */ fclose(pf1); fclose(pf2);
Para la lectura de un conjunto de datos:
unsigned fread(void *buf, unsigned numbytes, unsigned numdat, FILE *pf);
Para la escritura de un conjunto de datos:
unsigned fwrite(void *buf, unsigned numbytes, unsigned numdat, FILE *pf);
buf
: Un puntero a los datos que son leídos o escritosnumbytes
: representa el número de bytes de que consta cada uno de los datos a a leer o escribir (se obtiene con sizeof()
)numdat
: representa el número total de datos, items o elementos a leer o escribirpf
: es el descriptor al fichero sobre el que van a leer o escribirfread
y fwrite
pertenecen al ANSI C y están definidas en stdio.h
FILE *pf; float valor1=3.5, valor2; pf=fopen ("archivo.dat", "ab+"); /* "a+" en Unix */ fwrite(&valor1, sizeof(valor), 1, pf); /* Escribe */ fread(&valor2, sizeof(float), 1, pf); /* Lee */
fprintf()
y fscanf()
son idénticas a printf()
y scanf()
respectivamente, pero operan sobre un descriptor. También están declaradas en stdio.h
int fprintf(FILE *pf, const char* cad_control, lista_argumentos); int fscanf(FILE *pf, const char* cad_control, lista_argumentos);
pf
: Representa un puntero al fichero sobre el que opera la funcióncad_control
: Es la cadena en la que s e incluyen los especificadores de formato y sus modificadoreslista_argumentos
: Representa la lista de argumentos que se corresponden con los especificadores de formato de la cadena de control (lista de variables cuyos contenidos quieren escribirse o leerse sobre el fichero)fprintf()
devuelve en un entero el número de bytes escritosfscanf()
devuelve en un entero el número de campos correctamente escaneados y almacenados o EOF en caso de error.fprintf(stdout, "Número: %d", num);
printf("Número: %d", num);
fprintf(pf, …)
el contenido del fichero es similar al mostrado en pantalla con la función fprintf(stdout, …)
FILE *pf; int i = 100; char c = 'C'; float f = 1.234; pf = fopen("prueba.dat", "w+"); fprintf(pf, "%d %c %f", i, c, f); /* Escribe en el fichero */ fscanf(pf, "%d %c %f", &i, &c, &f); /* Lee los mismos datos en el fichero */ fclose(pf);
El acceso a los ficheros puede hacerse:
Los punteros de tipo FILE
apuntan a una estructura creada por el sistema operativo que controla las operaciones sobre ese fichero.
La función fseek()
, definida en stdio.h
, permite el movimiento aleatorio por el fichero abierto estableciendo una nueva posición para el apuntador de lectura-escritura:
int fseek(FILE *pf, long nbytes, int origen);
pf
: Descriptor con el que se operanbytes
: Número de bytes que queremos desplazar el apuntador de lectura-escritura del fichero con relación al punto de partidaorigen
: Representa el punto que se toma como origen o referencia. Se utilizan constantes simbólicas definidas en stdio.h
:SEEK_SET
corresponde al principio del ficheroSEEK_CUR
corresponde a la posición actualSEEK_END
corresponde al final del fichero#define N 5 /* Será la fila 5 */ int matriz[20][4], *punt; /* 20 filas y 4 columnas*/ FILE *pf; punt = matriz; /* Apertura del fichero sin errores */ fwrite(punt, sizeof(int), 20*4, pf); /* Escribe la matriz en un fichero */ fseek(pf, sizeof(int)*4*N, SEEK_SET); /* Apunta a los datos de la fila N, al ser 4*sizeof(int) el tamaño de una fila */ fread(&matriz[N][0], sizeof(int), 4, pf); /* Lee los datos de la fila N */
ftell()
long ftell(FILE *pf);
stdio.h
rewind()
void rewind(FILE *pf);
stdio.h
remove()
int remove(char *nombre_archivo);
-1
si se produce algún errorerrno
, definida en errno.h
indicará el tipo de errorstdio.h
fflush()
int fflush(FILE *pf);
pf
stdio.h
tmpfile()
FILE * tmpfile(void));
“w+”
stdio.h