PDF de programación - SEMINARIO DE C - Sesión 3

Imágen de pdf SEMINARIO DE C - Sesión 3

SEMINARIO DE C - Sesión 3gráfica de visualizaciones

Actualizado el 20 de Mayo del 2018 (Publicado el 27 de Abril del 2017)
753 visualizaciones desde el 27 de Abril del 2017
192,8 KB
10 paginas
Creado hace 18a (27/09/2005)
Algoritmos y Estructuras de Datos

Ingeniería en Informática, Curso 2º

SEMINARIO DE C

Sesión 3



Contenidos:

1. Funciones de entrada/salida
2. Manejo de ficheros
3. Gestión dinámica de memoria
4. Otras funciones de interés
Ejercicios



Algoritmos y Estructuras de Datos
Seminario de C – Sesión 3



2/10



1. Funciones de entrada/salida

• Escribir por pantalla: printf

printf ( <cadena> );
printf ( <cadena con formato>, <expresión 1>, <expresión 2>, ...);

printf("¡Buenos días!");
printf("Un entero: %d y un real: %f\n", 27*12, 3.1416);

• Especificación de formato en printf:

% [flags] [width] [.prec] [F|N|h|l|L] caracter_tipo

• Caracteres de tipo:
d, i (decimal), o (octal), u (unsigned), x, X (hexadecimal), f (float con la forma
[-]dddd.dddd), e, E, (float con la forma [-]d.dddd e[+/-]ddd), g, G (float
“inteligente”), c (char), s (string), p (puntero).

• sprintf. Igual que printf, pero en lugar de escribir en pantalla escribe el

resultado en una cadena (el primer parámetro).
char resultado[100];
sprintf(resultado, "Probando sprintf con el número %u.\n", -1);
printf(resultado);

• Leer de teclado: scanf

Formato parecido a la función printf.



int scanf ( <cadena con huecos>, &<variable1>, &<variable2>, ...);
int i, j, n;
float r;
char cadena[20];



n= scanf("%d", &i);
n= scanf("%d %f", &j, &r); → Lee un entero (en j) y un real (en r)
n= scanf("%s", cadena);

→ Lee de teclado un entero y lo guarda en i

→ Lee una cadena (hasta el primer espacio)



El valor devuelto por scanf indica el número de huecos leídos.
Los especificadores de formato son los mismos que para printf.


• sscanf. El equivalente a scanf, pero en lugar de leer de teclado lee los

caracteres de una cadena (el primer parámetro).
char entrada_simulada[100]= " 26 88.3 92";
int a, b;
float g;
sscanf(entrada_simulada, "%d %f %d", &a, &g, &b);

• putchar(char c). Escribe un carácter por pantalla. Equivale a:
• char getchar(void). Lee un carácter de teclado. Equivale a:

printf("%c", c)

Algoritmos y Estructuras de Datos
Seminario de C – Sesión 3



3/10

(scanf("%c", &c), c)




• Ejemplo.


#include <stdio.h>

main() {
int i, n;
float f;
char cadena[30];

printf("Introduce un entero, un float y una cadena:");
/* Probar distintas posibilidades en la siguiente línea */
n= scanf("%d %f %s", &i, &f, cadena);
/* Adaptando también este printf, claro */
printf("Huecos leídos: %d\nValores: %d, %f, %s \n", n, i, f, cadena);

}


• Ojo: normalmente la salida estándar es la pantalla y la entrada estándar el

teclado. Pero se puede utilizar redirección de entrada y salida.


>> gcc ejer1.c –o ejer1.out
>> ./ejer1.out

>> ./ejer1.out > res.txt
>> ./ejer1.out < in.txt

>> ./ejer1.out >res.txt <in.txt



→ Compilamos el programa de ejemplo
→ Ejecutamos. E/S: teclado/pantalla
→ Ahora la salida va al fichero res.txt
→ Aquí la entrada está en el fichero in.txt

La entrada estándar, salida estándar y salida de error estándar también se
pueden manejar como ficheros (con los nombres stdin, stdout y stderr) con las
funciones que veremos a continuación.

Algoritmos y Estructuras de Datos
Seminario de C – Sesión 3



4/10



2. Manejo de ficheros

• Los tipos y funciones necesarios para el manejo de ficheros están definidos en la

librería stdio.h.


• La librería stdio.h define el tipo FILE (ojo, en mayúsculas). Para usar

ficheros debemos usar punteros al tipo FILE.
#include <sdtio.h>
FILE *f, *g;

• Operaciones con ficheros:

fgets, fputs, fread, fwrite

o Abrir un fichero: fopen
o Leer/escribir en un fichero: fprintf, fscanf, getc, putc,
o Moverse a un punto: fseek
o Comprobar si se ha llegado al final: feof
o Cerrar un fichero: fclose

• Abrir un fichero: fopen

FILE * fopen ( char *nombre , char *modo )

o Valor devuelto: devuelve un puntero al fichero abierto. Si no se puede
o Modo de acceso: de tipo cadena

abrir devuelve NULL.

Fichero de texto

Fichero binario


Abrir sólo lectura
Crear y abrir para escritura
Abrir para añadir al final
Abrir para lectura/escritura
Crear y abrir para lectura/escritura
Abrir o crear para añadir

"r"
"w"
"a"
"r+"
"w+"
"a+"

"rb"
"wb"
"ab"
"r+b"
"w+b"
"a+b"

• Cerrar un fichero: fclose

int fclose ( FILE *fichero ) . Devuelve EOF si hubo algún error.

• Leer/escribir en un fichero.
• fprintf, fscanf. Igual que printf y scanf pero en un fichero, que se pasa

como primer parámetro.
FILE *f;
int n;
f= fopen("prueba", "r+");
if (!f) {printf("Error. No puedo..."); return;}
fprintf(f, "Hola número %d", n);
fscanf(f, "%d", &n);

• fgetc(FILE *f), fputc(int c, FILE *f). Leer o escribir un carácter en

un fichero. Devuelven la constante EOF si hay un error.
char c;
while ((c= fgetc(f))!= EOF)

Algoritmos y Estructuras de Datos
Seminario de C – Sesión 3



printf("Leído: %c\n", c);



5/10



• fgets, fputs. Leer o escribir una línea de texto de un fichero. Recordar que
scanf("%s", ...) lee una cadena pero acabando en el primer espacio en
blanco (tabulador, intro o espacio).

int fputs (char *cadena, FILE *fichero)

Escribe la cadena cadena hasta el final de la misma (carácter '\0'). Devuelve
EOF si ha ocurrido un error.

char *fgets (char *cadena, int max, FILE *fichero)

Lee la siguiente línea del fichero en cadena, acabando en un final de línea
(carácter '\n'). Devuelve NULL si ha ocurrido un error.

• fread, fwrite. Leer o escribir en un fichero en modo binario.


unsigned fread(void *ptr, unsigned size, unsigned n, FILE *fichero)

unsigned fwrite(void *ptr, unsigned size, unsigned n, FILE *fichero)

Lee del fichero un bloque de size*n bytes y los almacena a partir de la
posición apuntada por ptr. Se supone que size es el tamaño del tipo de datos a
leer y n el número de datos. Devuelve el número de datos leídos (si no hay error,
debería ser igual a n).

Escribe en el fichero un bloque de size*n bytes, que se encuentran a partir de
la posición apuntada por ptr. Se supone que size es el tamaño del tipo de
datos a escribir y n el número de datos. Devuelve el número de datos escritos (si
no hay error, debería ser igual a n).

• fseek. Moverse a un punto concreto de un fichero.


int fseek(FILE *fichero, long offset, int modo)

Permite moverse a una posición cualquiera dentro de un fichero. La posición
nueva está dada por offset (desplazamiento, en bytes) a partir de la posición
dada por modo: SEEK_SET (=0) desde el comienzo del fichero; SEEK_CUR (=1)
desde la posición actual; SEEK_END (=2) desde el final del fichero.
Función de consulta: long int ftell (FILE *fichero).

• feof. Comprobar si se ha llegado al final de un fichero.


int feof(FILE *fichero)
Devuelve true (valor distinto de 0) si hemos llegado al final del fichero o false
(valor 0) en caso contrario.

Algoritmos y Estructuras de Datos
Seminario de C – Sesión 3



6/10



• Ejemplo.


#include <stdio.h>
#include <stdlib.h> /* Función random() */
#include <time.h> /* Función time() */

int main() {
FILE *e, *s;
char *nombre= "ejemplo.txt";
int n, m, total= 0;
if (!(e= fopen(nombre, "w"))) {
printf("Error. No se puede crear %s\n", nombre);
return 1;
}
srandom(time(NULL)); /* Inicializar generador de random */
fprintf(e, "%d %d\n", random()%10, random()%4);
if (fclose(e)==EOF) {
printf("Error. No se puede cerrar %s\n", nombre);
return 2;
}
if (!(s= fopen("ejemplo.txt", "r"))) {
printf("Error. No se puede abrir %s\n", nombre);
return 3;
}
while (!feof(s)) {
total++;
if (fscanf(s, "%d %d\n", &n, &m)==2)
printf("Real Murcia: %d – Real Madrid: %d\n", n, m);
else
printf("El fichero no tiene el formato esperado\n");
}
printf("Realizados %d pronósticos.\n", total);
if (fclose(s)==EOF) {
printf("Error. No se cerrar el fichero %s\n", nombre);
return 4;
}
return 0;
}



• Probar distintas posibilidades en la línea señalada por:

"w" poner "a", "r", "r+", "w+", ... ¿Cuál es el resultado?



, en lugar de



Algoritmos y Estructuras de Datos
Seminario de C – Sesión 3



7/10

3. Gestión dinámica de memoria


• Se puede reservar memoria en tiempo de ejecución. Las funciones para

reserva de memoria están en: stdlib.h


• Toda la memoria reservada debe ser liberada antes de acabar. Es decir, no hay

liberación automática de memoria.


• El manejo de memoria dinámica se hace usando punteros.

int *arrayDimanico;
float **matrizDinamica= NULL;


• Reserva de memoria: malloc


void * malloc (unsigned tamano)

o Reserva tamano bytes de memoria y devuelve un puntero a la zona

reservada.
arrayDinamico = (int *) malloc (100*sizeof(int));

o Devuelve NULL si no se ha podido reservar esa cantidad.
o No se inicializa la memoria.
o ¿Cómo reservar memoria para matrizDinamica?

• Reserva e inicialización de memoria: calloc


void * calloc (unsigned ndatos, unsigned size)

o Reserva ndatos*size bytes de memoria y devuelve un puntero a la
zona reservada. Se supone que size es el tamaño del tipo de datos a
escribir y ndatos el número de datos.
arrayDinamico = (int *) calloc (100, sizeof(int));

o Devuelve NULL si no se ha podido reservar esa cantidad.
o Se inicializa la memoria reservada con 0.

• Relocalizar de memoria: realloc


void * realloc (void *ptr, unsigned tamano)

o Redimensiona la cantidad de memoria reservada previamente a la nueva
  • Links de descarga
http://lwp-l.com/pdf3234

Comentarios de: SEMINARIO DE C - Sesión 3 (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad