FORMATOS (EJEMPLOS AL FINAL): scanf/fscanf: -------------- formato scanf (" ", param1, ...., paramN) <------------------> lista_parametros formato fscanf(f," ", param1, ...., paramN) <------------------> lista_parametros El funcionamiento es lo mismo en cuanto a los formatos de lectura. Lo unico que cambia es que el fscanf tiene el parametro f para leer de fichero y el scanf siempre lee de teclado. Formato esta compuesto por: - caracteres espacio: ' ', \t, \n Si nosotros ponemos uno de estos en el formato, hara matching con todos los caracteres espacio seguidos que haya de donde estemos leyendo. - caracteres no espacio: ASCII menos caracteres espacio Se hace matching perfecto. Es decir, que si ponemos en el formato el caracter a , es porque nosotros que desde donde nosotros leemos haya una a. Antes, si poniamos un caracter espacio, se esperaba que viniera uno o mas caracteres espacio, no era un matching perfecto. - caracteres de conversion: Aplica la conversion a los siguientes caracteres de la entrada y lo almacena en el siguiente parametro de la lista. Ejemplos: scanf ("%d %d", &i, &j); En la entrada esperamos un numero entero, despues uno o mas caracteres espacio y despues otro entero. Se podria leer esto por teclado: a) 3 5 b) 3 5 c) 3 5 Ahora, si nosotros hacemos esta llamada: scanf ("%d-%d", &i , &j); Nosotros estamos esperando que por teclado nos introduzcan un numero entero,un guion y otro numero entero. 3-5 Conversion: ----------- %[*][width][l|L]type * Elimina el almacenamiento scanf("%*d %d",&j); Lo que dice esto es que se esperan dos enteros, pero que el primero de ellos no lo queremos guardar en ningun sitio. Por lo tanto, solo necesitamos poner un parametro para el segundo entero, la j. width: maximo numero de caracteres a leer, es posible que lea menos si es que se acaba el entero, la cadena o lo que quisieramos leer. scanf("%3d", &i); si por teclado nos introducen 3879 en la i solo guardariamos los tres primeros digitos y la i valdria 387 modifiers: l -> indica long int, double L -> indica long double type: Debemos distinguir entre los que ignoran los caracteres espacio que aparecen antes de lo que queremos y esperamos leer y los que no. --- Los que lo ignoran: d -> int e, f, g, E, G -> float, double s -> string (cadena caracteres) hasta caracter espacio por lo tanto si tuvieramos algo del estilo scanf("%d", &i); y por la entrada tuvieramos Caracteres Espacio <--------------------> 3 En la i tendriamos el valor 3 y nos habriamos saltado todos los caracteres espacio. Esto pasaria igual si tuvieramos return's (\n) o tabuladores (\t) antes de leer el entero. --- Los que no lo ignoran c -> caracter Convenciones: ------------- %nc -> lee n caracteres (no es string), por lo tanto tampoco pone el caracter nulo y ademas no ignora caracteres espacio, Estos dos siguientes tampoco ignoran caracteres espacio al principio, es decir, los leeria. %[cjto car] lee mientras que el caracter que va leyendo pertenece al conjunto y luego pone el caracter nulo %[^cjto car] lee mientras que el caracter que va leyendo no pertenece al conjunto y luego pone el caracter nulo. Ejemplos: 1.- fscanf(f, "%s %c", cadena, &car); supongamos que en el fichero tenemos hola hola Despues de la llamada a fscanf tendremos en cadena hola\0 y en car h El blanco que hemos puesto entre %s y %c se ha tragado todos los blancos que teniamos entre hola y hola. cadena <- "hola" car <- 'h' 2.- fscanf(f, "%s%c", cadena, &car); supongamos que en el fichero tenemos hola hola Despues de la llamada a fscanf tendremos en cadena hola\0 pero ahora en car tendremos un espacio en blanco (' ') ya que el formato %c no salta caracteres espacio. cadena <- "hola" car <- ' ' 3.- fscanf (f,"%3c%c", vector, &car); supongamos que en el fichero tenemos hola es decir, dos blancos y la palabra hola Despues de la llamada tendriamos que vector tiene vector[0]=' ' vector[1]=' ' vector[2]='h' vector[3] no sabemos lo que tendra car = 'o' 4.- fscanf (f,"%3s%c", vector, &car); supongamos que en el fichero tenemos hola es decir, dos blancos y la palabra hola Acordaros que ahora el tipo %s se salta los caracteres espacio del principio. Despues solo leera tres caracteres de hola. vector[0]='h' vector[1]='o' vector[2]='l' vector[3] '\0' /* SE GUARDA EL CARACTER NULO */ car = 'a' 5.- fscanf(f,"%[^ab]%c",v, &car); suponemos que en el fichero de entrada tenemos ____hol\n _hola donde _ es un espacio en blanco. Lo que hace esta operacion es ir leyendo caracteres uno a uno hasta que se encuentra un caracter que sea a o b, entonces para. Asi, en v tendremos v <- ____hol\n_hol\0 no nos saltamos caracteres espacio al principio y vamos copiando mientras no encontramos una 'a'. Despues del ultimo caracter pondra un caracter nulo. car <- 'a' En car se guarda a porque nosotros leimos hasta encontrarnos con una a pero esta se deja para que se pueda leer despues. 6.- fscanf(f, "%[ab]%s", v, cadena); Supondremos que en el fichero de entrada tenemos baaaaaaaaah! la Lo que hace esta operacion es ir leyendo caracteres uno a uno MIENTRAS que se encuentra caracteres que son a's o b's, sino parara. Asi en v tendremos v <- baaaaaaaaa\0 guardamos todas las a's y b's consecutivas que hay hasta encontrar algo que no sea a ni b. Al final pondra un caracter nulo. En cadena tendremos cadena <- "h!" 7.- fscanf(f, "%*[ab]%s", cadena); Supondremos que en el fichero de entrada tenemos baaaaaaaaah! la En cadena tendremos cadena <- "h!" Lo primero hemos decidido que no lo guardariamos en ningun sitio. 8.- fscanf(f, "%8c", v); __aabbccddee en v <- __aabbcc sin caracter nulo y sin saltarse los caracteres espacio del principio. 9.- fscanf(f, "%8s", v); __aabbccddee en v <- aabbccdd\0 y el caracter nulo lo pone. 10.- En examenes finales y de aplicacion de los anyos anteriores podeis encontrar mas ejemplos de lectura con formato, estan las soluciones. En estos examenes se decia que un fichero tenia un determinado formato y tu tenias que hacer la lectura segun el formato que te encontrabas en el fichero.