Está en la página 1de 17

Lenguaje C Entrada y Salida de Datos

Omar Andrs Zapata Mesa Grupo de Fenomenologa de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

E/S por consola


Se

refiere a las operaciones que ocurren en el teclado y la pantalla de la computadora. Para ello usamos una serie de funciones definidas en el ANSI, tales como

getchar putchar gets puts

Para

ver mas informacin funciones ver man stdio.h Veamos el siguiente ejemplo:

sobre

estas

Ejemplo
#include<stdio.h> int main(int argc,char *argv[]){ char c; do{ c=getchar(); if(islower(c))putchar(toupper(c)); else putchar(tolower(c)); }while(c!='.'); } #include<stdio.h> int main(int argc,char *argv[]){ char str[80]; gets(str); printf("La longitud es %d\n",strlen(str)); }

Entrada y Salida Con Formato


La

entrada y salida con formato es para indicar que se imprimirn o se leern no solo caracteres sino otros tipos de datos como enteros, tipos punto flotante, octal, hexadecimal, notacin cientfica etc.. Para esto se usa dos funciones bsicamente que son printf y scanf, para el cual, se usa una cadena de control que indica el formato a usar y luego los argumentos o variables a leer o imprimir. Ver Clases anteriores.

Manejo de Archivos
Existen

dos clases de tipos de archivos principalmente, los bufereados y no bufereados. Los bufereados son aquellos que se montan en ram cuando se montan, los no bufereados son los que permanecen en disco. En el estndar ANSI todos los archivos son buffereados pero en UNIX no todos lo son, por ejemplo el modo de letura texto es buffereado pero lectura en modo binario no.

Manejo de Archivos

Para abrir un archivo desde el codigo en C se usa un puntero al tipo de dato FILE, que contiene informacin o como el nombre del archivo, el modo de apertura y el indicador de posicin.
FILE *pf; pf=fopen("nombre_archivo","modo_apertura");

Los modos de apertura son r read, w write, a append, rb read binary, wb write bianry, ab append binary y combinaciones como rw lectoescritura, rwb lectoescritura binaria.

Manejo de Archivos
putc y y getc son funciones para leer y escribir caracteres en un archivo. Ahora suponga que esta leyendo un archivo y necesita saber cundo lleg al final de la informacin contenida en el, para esto se defini EOF en stdio.h, que nos idica que no hay mas datos a leer. Es necesario despus de manipular el archivo en lectura o escritura cerrar el idicador o puntero a file para liberar la informacin o flushearla en disco, para ello se usa fclose.

Manejo de Archivos
Hacerle

flush a un archivo es hacer que la informaci'on del archivo que se encuentra en ram baje inmediatamente a disco, para esto usamos la funcin fflush. Cuando estamos en el final del archivo y queremos volver al principio usamos rewind. Ahora veamos un ejemplo con todas estas funciones:

Manejo de Archivos
Para

manipular datos de archivos binarios podemos usar fwrite y para leerlos fread; estas funciones tambin estn diseadas para guardar de forma binaria tipos de datos complejos como estructuras, esto se conoce en el mundo de la programacin como la serializacin de datos. Ver ms man fread fwrite. Para manipular el apuntador de posicion del archivo en cualquier posicin se usan las funciones fseek, ftell.

Ejemplo
#include<stdio.h> FILE *ptrArchivo[2]; int main(int argc,char *argv[]){ if(argc == 3){ ptrArchivo[0]=fopen(argv[1],"r"); ptrArchivo[1]=fopen(argv[2],"w"); char ch=' '; while(!ferror(ptrArchivo[0])){ ch=getc(ptrArchivo[0]); if(ch==EOF) break; putc(ch,ptrArchivo[1]); } fclose(ptrArchivo[0]); fclose(ptrArchivo[1]); }else printf("./cp input output\n"); }

Ejemplo 2 Archivos Binarios


Los

archivos binarios son aquellos que se guardan en cdigo solo entendible para la maquina, pero uno puede ver el contenido usando por ejemplo okteta. Ej:
#include<stdio.h> FILE *ptrArchivo; int main(int argc,char *argv[]){ ptrArchivo=fopen(argv[1],"wb"); int dato=10; fwrite(&dato,sizeof(int),1,ptrArchivo); fclose(ptrArchivo); }

demos nano test.bin y okteta test.bin

Ejemplo 3 fflush
#include<stdio.h> FILE *ptrArchivo; int main(int argc,char *argv[]){ ptrArchivo=fopen("flush.txt","w"); int i=0; for(i=0;i<1000000;i++){ printf("%d\n",i); fprintf(ptrArchivo,"%d\n",i); // fflush(ptrArchivo); } fclose(ptrArchivo); }

Para este ejercicio vamos a parar el programa con crt+c y mirar lo ltimo que imprimi en pantalla y lo que guard en el archivo usando y sin usar fflush. Tambin el tiempo de ejecucin sin usar fflush y usandolo.

Ejemplo 3 rewind fseek


#include<stdio.h> FILE *ptrArchivo[2]; int main(int argc,char *argv[]){ ptrArchivo[0]=fopen("archivo_fseek.dat","w"); fprintf(ptrArchivo[0],"%s","Gnu/Linux Developers"); fclose(ptrArchivo[0]); ptrArchivo[1]=fopen("archivo_fseek.dat","r"); int i=0; fseek(ptrArchivo[1],10,ftell(ptrArchivo[1])); printf("%c\n",fgetc(ptrArchivo[1])); fseek(ptrArchivo[1],4,0); printf("%c\n",fgetc(ptrArchivo[1])); rewind(ptrArchivo[1]); printf("%c\n",fgetc(ptrArchivo[1])); fclose(ptrArchivo[1]); }

fscanf y fprintf E/S con Formato


Estas

dos funciones se crearon para leer/escribir datos fcilmente en archivos. Se usan similar a scanf y printf, solo que el primer algumento es el puntero del archivo donde se va a leer/escribir los datos.

getline y sscanf Para procesar lneas de entrada


getline()

lee una lnea entera, almacenando la direccin del buffer que contiene el texto. sscanf lee su entrada de la cadena de caracteres. Estas dos funciones se pueden usar en conjunto para procesar una lnea de datos tomada de un archivo, por lo regular se toma la lnea se hace una copia o se preprocesa, luego con sscanf se toman los datos al estilo fscanf, solo que el primer argumento no es un puntero a FILE sino una cadena de caracteres.

Ejercicios
Hacer

un programa que dado un par de caracteres por la lnea de commandos que remplaze todo el archivo, el primero por el segundo al estilo sed. Hacer un programa que dado un archivo por la lnea de comandos que retorne la columna pedida. Hacer un programa que mire qu lneas empiezan por # y borre toda la linea.

Referencias

C Manual de Referencia Herbert Schildt

También podría gustarte