Escolar Documentos
Profissional Documentos
Cultura Documentos
MatasZabaljuregui(matiasz@info.unlp.edu.ar) http://linux.linti.unlp.edu.ar
0. Introduccin Seintentardescribirentrminossencilloslaformadetratarlosdatosingresadosporel usuarioatravsdelaentradaestndardeunprocesoexplicandobrevementeel funcionamientodelosbuffersdelosstreamestndardeentrada/salida. Partedelainformacinseobtienedelmanualdelalibreraglibc,cuyalecturase recomiendaypuedeencontrarseen: :// http www.gnu.org /software/ /manual/ libc
fgets(miBuffer,15,stdin) ^ ^ bufferdestdin ^ ^
(espaciodeusuario)
(espaciodeusuario)
3. EstrategiasdeBuffering Existentresestrategiasdiferentesdebuffering:
[2]SesueledecirqueenlafamiliadesistemasoperativostipoUnixtodoesunarchivo.Porejemplo,el cdigoparaenviarunaseriedecaracteresaunarchivodetexto,alpuertoserieoalmonitoreselmismo.
return0; }
Porejemplo,sisecompilaelsiguientecdigo
#include<stdio.h> intmain() { charnombre[5]; printf("Nombre:"); fgets(nombre,sizeof(nombre),stdin); printf("%s",nombre); printf("newline\n"); fgets(nombre,sizeof(nombre),stdin); printf("%s",nombre); printf("newline\n"); return0; }
yseingresaunstringde10caracteresenlaprimeroportunidadquenosdaelprograma, elsegundofgetstomaelremanentedejadoenelbufferporelprimerfgets.
Acontinuacinsepresentandosejemplosdecmosepuedelimpiarelbufferdelstream 5
stdinenGNU/Linux.Esimportanterecordarquefflush()noestdefinidaparastdin,sino parabuffersdesalidacomoeldestdout.
Enelprimerejemploseutilizaunloopparaterminardeleercaracteresquepueden haberquedadoenelbufferporingresospreviosdecaracteres.Esteeselcdigo
#include<stdio.h> intmain() { charnombre[5]; printf("Nombre:"); fgets(nombre,sizeof(nombre),stdin); printf("%s",nombre); printf("newline\n"); printf("Apellido:"); while(getchar()!='\n');/*LEEDELBUFFERHASTAQUEENCUENTRA fgets(nombre,sizeof(nombre),stdin);UNCARACTERNEWLINE*/ printf("%s",nombre); printf("newline\n"); return0; }
Esposibledefinirunamacroqueimplementeelloop,comosehaceacontinuacin: #defineFLUSHwhile(getchar()!='\n')
#include<stdio_ext.h> { charnombre[5]; printf("Nombre:"); fgets(nombre,sizeof(nombre),stdin); printf("%s",nombre); printf("newline\n"); printf("Apellido:"); __fpurge(stdin);/*BORRAELCONTENIDODELBUFFERDESTDIN*/ fgets(nombre,sizeof(nombre),stdin); printf("%s",nombre); printf("newline\n"); return0; }