15:16 22 abr 2016

Anuncio
Portada
Streams
Funciones
fopen
fwrite
Curso de programación en C moderno
(II Edición)
fread
fputs
fgets
fprintf
fscanf
Neira Ayuso, Pablo
Falgueras García, Carlos
Funciones
peligrosas
Tema 10
Entrada/Salida
Índice
Portada
1 ¿Qué es un stream?
Streams
Funciones
fopen
fwrite
fread
fputs
fgets
fprintf
fscanf
Funciones
peligrosas
2 Funciones básicas
fopen
fwrite
fread
fputs
fgets
fprintf
fscanf
3 Funciones peligrosas
¿Qué es un stream?
Portada
Flujo de bytes de longitud indeterminada, al que se accede de
forma secuencial.
Streams
Funciones
fopen
fwrite
fread
fputs
fgets
fprintf
fscanf
Funciones
peligrosas
En un stream:
• Al leer uno o más bytes, en la próxima lectura
obtendremos los siguientes.
• Al escribir uno o más bytes, en la próxima escritura los
añadiremos a continuación.
Streams estándar:
• stdout: Salida estándar (normalmente por consola)
• stdin: Entrada estándar (normalmente por teclado)
• stderr: Salida estándar de errores (normalmente por
consola)
Funciones básicas
Portada
Streams
Funciones
fopen
fwrite
fread
fputs
fgets
fprintf
fscanf
Funciones
peligrosas
• Apertura y cierre de ficheros:
• FILE ∗f = fopen(" file . txt", "r");
• fclose ( f ) ;
• Lectura/Escritura en crudo:
• size_t read = fread(buf, sizeof (char) , bufsize , f ) ;
• size_t written = fwrite(buf, sizeof (char) , bufsize , f ) ;
• Lectura/Escritura sin formato:
• fputs ("Hola Mundo", f);
• fgets (buf, bufsize , f ) ;
• Lectura/Escritura con formato:
• fprintf ( f , "Hola", name);
• fscanf ( f , "%10s %d", str, &i);
Para más información ver:
http://es.cppreference.com/w/c/io
fopen
Portada
Streams
Funciones
FILE *fopen(const char *fname, const char *mode);
int fclose(FILE *stream);
fopen
fwrite
fread
fputs
fgets
Modos:
fprintf
fscanf
Funciones
peligrosas
modo
"r"
"w"
"a"
"r+"
"w+"
"a+"
significado
Abre para leer
Crea para escribir
Crea para añadir
Abre para leer/escribir
Crea para leer/escribir
Crea para leer/añadir
si ya existe
lee desde el principio
descarta el contenido
escribe al final
lee/escribe desde el principio
descarta el contenido
lee*/escribe desde el final
si no existe
error
lo crea
lo crea
error
lo crea
lo crea
fwrite
Portada
Streams
Funciones
fopen
fwrite
fread
fputs
fgets
fprintf
fscanf
Funciones
peligrosas
size_t fwrite (const void ∗buf, size_t size , size_t count,FILE ∗strm);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#i n c l u d e < s t d i o . h>
#i n c l u d e < s t d l i b . h>
#i n c l u d e < s t r i n g . h>
#d e f i n e FNAME " f i l e "
i n t main ( ) {
FILE ∗ f ;
c h a r b u f [ ] = " H o l a Mundo" ;
f = f o p e n (FNAME, "w+" ) ;
i f (! f ) {
perror (" Error al abrir ") ;
e x i t ( EXIT_FAILURE ) ;
}
f w r i t e ( buf , s i z e o f ( c h a r ) , s t r l e n ( buf ) ,
if ( ferror ( f )) {
perror (" Error al e s c r i b i r ") ;
e x i t ( EXIT_FAILURE ) ;
}
}
fclose ( f ) ;
return 0;
f);
fread
Portada
Streams
Funciones
fopen
fwrite
fread
fputs
fgets
fprintf
fscanf
Funciones
peligrosas
size_t fread (void ∗buf, size_t size , size_t cnt , FILE ∗strm);
1 #d e f i n e FNAME " f i l e "
2 #d e f i n e BUFSIZE 256
3
4 i n t main ( ) {
5
FILE ∗ f ;
6
c h a r b u f [ BUFSIZE ] ;
7
i n t read ;
8
9
f = f o p e n (FNAME, " r " ) ;
10
i f (! f ) {
11
p e r r o r ( "No s e ha p o d i d o a b r i r e l f i c h e r o " ) ;
12
e x i t ( EXIT_FAILURE ) ;
13
}
14
15
r e a d = f r e a d ( b u f , s i z e o f ( c h a r ) , BUFSIZE − 1 , f ) ;
16
if ( ferror ( f )) {
17
perror (" Error al leer ") ;
18
e x i t ( EXIT_FAILURE ) ;
19
}
20
21
b u f [ r e a d ] = ' \0 ' ;
22
p r i n t f ( "%s " , b u f ) ;
23
24
fclose ( f ) ;
25
return 0;
26 }
fputs
Portada
Streams
Funciones
fopen
fwrite
fread
fputs
fgets
fprintf
fscanf
Funciones
peligrosas
int fputs (const char ∗ str , FILE ∗strm);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#i n c l u d e < s t d i o . h>
#i n c l u d e < s t d l i b . h>
#i n c l u d e < s t r i n g . h>
#d e f i n e FNAME " f i l e "
i n t main ( )
{
FILE ∗ f ;
c h a r b u f [ ] = " H o l a Mundo" ;
f = f o p e n (FNAME, "w+" ) ;
i f (! f ) {
perror (" Error al abrir ") ;
e x i t ( EXIT_FAILURE ) ;
}
f p u t s ( buf , f ) ;
if ( ferror ( f )) {
perror (" Error al e s c r i b i r ") ;
e x i t ( EXIT_FAILURE ) ;
}
}
fclose ( f ) ;
return 0;
fgets
Portada
Streams
Funciones
fopen
fwrite
fread
fputs
fgets
fprintf
fscanf
Funciones
peligrosas
char ∗ fgets (char ∗buf, int bufsize , FILE ∗strm);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#d e f i n e FNAME " f i l e "
#d e f i n e BUFSIZE 256
i n t main ( )
{
FILE ∗ f ;
c h a r b u f [ BUFSIZE ] ;
f = f o p e n (FNAME, " r " ) ;
i f (! f ) {
perror (" Error al abrir ") ;
e x i t ( EXIT_FAILURE ) ;
}
int i = 0;
w h i l e ( f g e t s ( b u f , BUFSIZE , f ) )
p r i n t f ( "%d : \"% s \"\ n " , i ++, b u f ) ;
if ( ferror ( f )) {
perror (" Error al leer ") ;
e x i t ( EXIT_FAILURE ) ;
}
}
fclose ( f ) ;
return 0;
fprintf
Portada
Streams
Funciones
fopen
fwrite
fread
fputs
fgets
fprintf
fscanf
Funciones
peligrosas
int fprintf (FILE ∗strm, const char ∗frmt, ...) ;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#i n c l u d e < s t d i o . h>
#i n c l u d e < s t d l i b . h>
#i n c l u d e < s t r i n g . h>
#d e f i n e FNAME " f i l e "
i n t main ( )
{
FILE ∗ f ;
f = f o p e n (FNAME, "w+" ) ;
i f (! f ) {
perror (" Error al abrir ") ;
e x i t ( EXIT_FAILURE ) ;
}
f p r i n t f ( f , " H o l a Mundo\ n 2 + 2 = %d " , 2 + 2 ) ;
if ( ferror ( f )) {
perror (" Error al e s c r i b i r ") ;
e x i t ( EXIT_FAILURE ) ;
}
}
fclose ( f ) ;
return 0;
fscanf
Portada
Streams
Funciones
fopen
fwrite
fread
fputs
fgets
fprintf
fscanf
Funciones
peligrosas
int fscanf (FILE ∗strm, const char ∗frmt, ...) ;
1 i n t main ( )
2 {
3
FILE ∗ f ;
4
char s t r 1 [1 0] , s r t 2 [ 1 0 ] ;
5
int a , b , c , ret ;
6
7
f = f o p e n (FNAME, " r " ) ;
8
i f (! f ) {
9
perror (" Error al abrir ") ;
10
e x i t ( EXIT_FAILURE ) ;
11
}
12
13
w h i l e ( ( r e t = f s c a n f ( f , "%10 s %10 s %d + %d = %d " ,
14
s t r 1 , s t r 2 , &a , &b , &c ) ) == 5 ) {
15
p r i n t f ( "%s %s \ n %d + %d = %d \ n " , s t r 1 , s t r 2 , a , b , c ) ;
16
}
17
if ( ferror ( f )) {
18
perror (" Error al leer ") ;
19
e x i t ( EXIT_FAILURE ) ;
20
}
21
e l s e i f ( r e t != EOF) {
22
f p r i n t f ( s t d e r r , " E r r o r a l a n a l i z a r : %d/%d \ n " , r e t , 5 ) ;
23
}
24
25
fclose ( f ) ;
26
return 0;
27 }
Funciones peligrosas
Portada
Streams
Funciones
fopen
fwrite
fread
fputs
fgets
fprintf
fscanf
Funciones
peligrosas
Todas las funciones que lean un número indefinido de bytes sin
comprobar el tamaño del buffer de destino.
• scanf y sus variantes si no especificamos el tamaño al
escanear una cadena: "%s"
• gets, que lee una cadena de stdin sin posibilidad de
especificar ningún límite para su tamaño. Eliminada en el
estándar de 2011.
Descargar