Funciones de lectura y escritura en C/C

++
Las funciones printf y scanf
La función scanf permite leer secuencias de caracteres con un formato especificado previamente, guardando los valores en las variables especificadas y devolviendo como función el número de elementos leídos correctamente. Su sintaxis es scanf(“<formato>”,<variables>); En formato se pueden colocar los especificadores particulares de los tipos de datos que se van a leer. En variables, a menos que sea una cadena, se coloca un & antes de cada una (en realidad esto es un apuntador), separándolas por comas. Cuando se lee una cadena de caracteres scanf por defecto lee hasta encontrar una espacio, tabulación, salto de línea o el final del archivo. Especificador %c %s %d, %i %u %ld %lu %lld %llu %e, %f, %g %lf %o %x %[patron] Tipo char cadena int unsigned int long int unsigned long int long long int unsigned long long int float double número octal número hexadecimal patron

Cuando se usa %[patron] scanf lee una cadena de caracteres hasta encontrar un caracter que no se encuentre en los especificados dentro de los corchetes. Esto nos permite leer cadenas con espacios intercalados, leer hasta encontrar un punto o una coma, leer solo números o funciones similares. Además, si se usa %[^patron] scanf leerá hasta encontrar alguno de los caracteres de la lista del patrón, es decir, se invierte su uso. La función printf permite imprimir texto con formato utilizando una sintaxis similar a la de scanf. Se usan los mismos identificadores, aunque en las variables no hace falta usar &'s, solo se colocan los nombres de las variables. Cabe mencionar que el especificador para long long int es %lld en sistemas operativos de la familia Linux y %I64d en sistemas Windows. Confundir esto lleva a fallas en el funcionamiento del programa, y generalmente el compilador no detecta este tipo de errores.

La función sscanf
En ocasiones requerimos leer una cadena de caracteres y después obtener de ella variables numéricas. En estos casos, en los que necesitamos “leer dos veces” una misma entrada, contamos con la función sscanf que nos permite leer un texto con formato de una cadena de caracteres previamente leída. Su sintaxis es la misma que la se scanf, pero se incluye adicionalmente, previo a las indicacionesdel

Nota: No retira el c=cin. que permite especificar una cantidad máxima de caracteres a leer.peek(). Regresa el caracter leído o EOF en caso de haber alcanzado el fin de archivo. Regresa el caracter leído o EOF en caso de haber alcanzado el fin de archivo. tiene el inconveniente de guardar en memoria todo lo que encuentre antes del salto de línea aún si el arreglo de caracteres del argumento no tiene espacio para ello. podemos usar la función gets. cout << x. c=getc(stdin). cout << “Hello. Ejemplos .str. Su sintaxis es cin >> variable_1 >> variable_2 >> . sin embargo. Nota: En C. cin >> a.&i). I am ” << age << “ years old and my zipcode is ” << zipcode. cin >> a >> b >> c. Para evitar estas situaciones podemos hacer uso de la función fgets....get(). aunque en tiempo de ejecución ocupan más tiempo. Las funciones cin y cout Las funciones cin y cout son la versión en C++ de printf y scanf. cout << 120.h Regresa el caracter leído o EOF en caso de haber alcanzado el fin de archivo. Para indicar un salto de línea podemos usar endl como argumento. Librería Descripción stdio. stdio."%s %*s %d". el nombre del arreglo de caracteres sobre el que se va a leer.formato. Ejemplos: cout << “Enunciado” << endl. << variable_n . Esta función lee una cadena de caracteres hasta encontrar un salto de línea.h Regresa el caracter leído o EOF en caso de haber alcanzado el fin de archivo. ). Y de forma análoga con cout tenemos cout << variable_1 << . La función cin permite leer una entrada con formato. pero podemos hacerlo usando estas dos funciones. Ejemplo: sscanf (sentence.h existe una función equivalente a cin. lo que lleva a errores en la memoria.stdin stdio. iostream carácter del flujo de entrada. Para emplearlas debe incluirse la biblioteca iostream. >> variable_n.. Leyendo linea por linea Para leer de este modo. Leyendo caracter a caracter Para leer carácter a carácter disponemos de las siguientes funciones: Función c=getc(stdin).peek(). Proporcionan una sintaxis más sencilla. c=cin. c=getchar(). además del origen de la entrada. no ungetc(c. iostream Regresa el caracter leído o EOF en caso de haber alcanzado el fin de archivo.

Optimización de la lectura En el problema de la UVA Online Judge 10055 .b). main() { long long a.133 436 . Podemos preguntar si un caracter leído regresó fin de archivo simplemente comparandolo con EOF: if(c==EOF) return 0. Código #include <iostream> using namespace std.a). a continuación se muestra el resultado de sustituir la función scanf por una versión propia. } Usar nuestra propia función de lectura en lugar de "scanf" Siguiendo con el ejemplo anterior. Caracter de fin de archivo Mas que un caracter. b. la solución de cada caso es la diferentecia entre el mayor y el menor de los números. &b) == 2) if (a > b) printf("%lld\n".420 388 Tiempo Memoria (S) (Kb) 1. else printf("%lld\n". b . mientras que en Windows por lo general es posible hacerlo con Ctrl+Z.stdin). while(cin >> a >> b) if (a > b) cout << a .gets(nombre). main() { long long a. En C/C++ se simboliza con EOF (End of File). while(scanf("%lld%lld". &a. fgets(nombre. es un valor que indica que se ha llegado al final de un archivo o que ha finalizado la transmisión o transferencia de datos.Hashmat the brave warrior.b << endl. } #include <cstdio> using namespace std. b. Código Tiempo Memoria 0. En la siguiente tabla se muestra cual es el efecto de cambiar la forma de leer los datos en este problema. En sistemas operativos de la familia Linux es posible entrar el caracter de fin de archivo en la consola presionando Ctrl+D.30. a .

com/doc/tutorial/basic_io/ http://www.a).cplusplus.'0'. pos++. else printf("%lld\n". Referencias http://mictlan. se obtuvo una mejora significativa en el tiempo de ejecución. long long a.taringa.utm. main() { char buffer[1024]. if (a > b) printf("%lld\n". lo cual puede fomentar la aparición de errores en caso de no implementar bien la función de lectura.'0'. } } (Kb) 0.mx/lectura.utm.html http://es.utm.b). while(gets(buffer) && !feof(stdin)) { pos = a = b = 0.244 388 Como se ve.mx/optimizacion.com/reference/cstdio/fgets/ . b . a .mx/ http://mictlan. el código aumento en tamaño y ligeramente en complejidad. pos.org/wiki/Scanf http://en.wikipedia.html http://www.net/posts/ciencia-educacion/14450390/Lectura-de-cadenas-en-C.org/wiki/Scanf http://www. while(buffer[pos] != ' ') a = a*10 + buffer[pos++] . b.wikipedia.html http://mictlan.cplusplus. while(buffer[pos] != 0) b = b*10 + buffer[pos++] . Sin embargo.(S) #include <cstdio> using namespace std.

Sign up to vote on this title
UsefulNot useful