You are on page 1of 30

Manejo de archivos en lenguaje C

Programacion estructurada
Archivos
Oscar Alvarado Nava
oscar.alvarado.nava@gmail.com
Departamento de Electr
onica
Divisi
on de Ciencias B
asicas e Ingeniera
Universidad Aut
onoma Metropolitana, Unidad Azcapotzalco

13O, noviembre de 2013

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

1/30

Manejo de archivos en lenguaje C

Contenido

Manejo de archivos en lenguaje C


Archivos de caracteres

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

2/30

Manejo de archivos en lenguaje C


Archivos de caracteres

Funciones buffereadas comunes


Nombre

Funci
on

fopen()
fclose()
putc()
fputc()
getc()
fgetc()
fseek()
fprintf()
fscanf()
feof()
ferror()
rewind()
remove()
fflush()
fread()
fwrite()

Abre un archivo
Cierra un archivo
Escribe un caracter en el archivo

Oscar Alvarado Nava

Lee un caracter en el archivo


Busca un bytes en especfico
Lo mismo que printf pero a un archivo
Lo mismo que scanf pero a un archivo
Regresa verdadero cuando llega al final del archivo
Regresa verdadero cuando se ha generado un error
Regresa el apuntador a la posici
on inicial
Elimina archivo
Limpia el flujo
Lee tipos de datos multi-byte
Escribe tipos de datos multi-byte

UAM Azcapotzalco

Archivos

3/30

Manejo de archivos en lenguaje C


Archivos de caracteres

Archivo de texto datos.dat

1 Programacion estructurada
2 Trimestre 13 - Otono
3 Oscar Alvarado Nava

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

4/30

Manejo de archivos en lenguaje C


Archivos de caracteres

Volcado del archivo datos.dat

< tss-1-01@ce >


< /users/tss/1/tss-1-01 >
$ cat datos.dat
< tss-1-01@ce >
< /users/tss/1/tss-1-01 >
$ od -x datos.dat
< tss-1-01@ce >
< /users/tss/1/tss-1-01 >
$ od -x datos.dat

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

5/30

Manejo de archivos en lenguaje C


Archivos de caracteres

lee caracteresEOF.c
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
27
28

/* Programacion estructurada , 13 O , Oscar Alvarado Nava


Lee caracter a caracter hasta encontrar el EOF */
# include < stdio .h >
int main ()
{
FILE * fd ;
char caracter ;
int i ;
fd = fopen ( " datos . dat " ," r " ) ;
if ( fd == NULL )
{
printf ( " error al abrir el archivo \ n " ) ;
return 0;
}
i =0;
while ( ( caracter = fgetc ( fd ) ) != EOF )
{
printf ( " %c " , caracter ) ;
i ++;
}
printf ( " \ n \ nSe leyeron %d caracteres \ n " ,i ) ;
fclose ( fd ) ;
return 0;
}

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

6/30

Manejo de archivos en lenguaje C


Archivos de caracteres

lee linea.c
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
27
28

/* Programacion estructurada , 13 O , Oscar Alvarado Nava


Lee caracter a caracter hasta encontrar el primer \ n */
# include < stdio .h >
int main ()
{
FILE * fd ;
char caracter ;
int i ;
fd = fopen ( " datos . dat " ," r " ) ;
if ( fd == NULL )
{
printf ( " error al abrir el archivo \ n " ) ;
return 0;
}
i =0;
while ( ( caracter = fgetc ( fd ) ) != \ n )
{
printf ( " %c " , caracter ) ;
i ++;
}
printf ( " \ n \ nSe leyeron %d caracteres \ n " ,i ) ;
fclose ( fd ) ;
return 0;
}

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

7/30

Manejo de archivos en lenguaje C


Archivos de caracteres

lee palabra.c
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
27
28

/* Programacion estructurada , 13 O , Oscar Alvarado Nava


Lee caracter a caracter hasta encontrar el primer espacio */
# include < stdio .h >
int main ()
{
FILE * fd ;
char caracter ;
int i ;
fd = fopen ( " datos . dat " ," r " ) ;
if ( fd == NULL )
{
printf ( " error al abrir el archivo \ n " ) ;
return 0;
}
i =0;
while ( ( caracter = fgetc ( fd ) ) != )
{
printf ( " %c " , caracter ) ;
i ++;
}
printf ( " \ n \ nSe leyeron %d caracteres \ n " ,i ) ;
fclose ( fd ) ;
return 0;
}

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

8/30

Manejo de archivos en lenguaje C


Archivos de caracteres

lee palabras a cadenas.c (1/2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

/* Programacion estructurada , 13 O , Oscar Alvarado Nava


Crea cadenas : lee caracter a caracter hasta encontrar el
primer espacio o nueva linea , agrega el nulo y continua hasta el EOF */
# include < stdio .h >
int main ()
{
FILE * fd ;
char cadenas [20][50]; // 20 de cadenas de maximo 49 caracteres
char caracter ;
int i , ncadenas ;
fd = fopen ( " datos . dat " ," r " ) ;
if ( fd == NULL )
{
printf ( " error al abrir el archivo \ n " ) ;
return -1;
}

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

9/30

Manejo de archivos en lenguaje C


Archivos de caracteres

lee palabras a cadenas.c (2/2)


19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 }

i =0;
ncadenas =0;
while ( ( caracter = fgetc ( fd ) ) != EOF )
{
if ( caracter != && caracter != \ n )
{
cadenas [ ncadenas ][ i ] = caracter ;
i ++;
}
else if ( i != 0)
{
cadenas [ ncadenas ][ i ]= \0 ;
ncadenas ++;
i =0;
}
}
fclose ( fd ) ;
printf ( " \ n \ nSe leyeron %d cadenas \ n " , ncadenas ) ;
for ( i =0; i < ncadenas ; i ++)
printf ( " %d : \" %s \"\ n " ,i , cadenas [ i ]) ;
return 0;

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

10/30

Manejo de archivos en lenguaje C


Archivos de caracteres

lee palabra2.c
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

/* Programacion estructurada , 13 O , Oscar Alvarado Nava


Lee la primera palabra de un archivo con funcion de biblioteca
*/
# include < stdio .h >
# define MAX 50
int main ()
{
FILE * fd ;
char palabra [ MAX ];
fd = fopen ( " datos . dat " ," r " ) ;
if ( fd == NULL )
{
printf ( " error al abrir el archivo \ n " ) ;
return 0;
}
fscanf ( fd , " %s " , palabra ) ;
printf ( " palabra leido : \" %s \"\ n " , palabra ) ;
fclose ( fd ) ;
return 0;
}

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

11/30

Manejo de archivos en lenguaje C


Archivos de caracteres

lee palabras.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

/* Programacion estructurada , 13 O , Oscar Alvarado Nava


Lee el contenido de un archivo por palabras
*/
# include < stdio .h >
# define MAX 50
int main ()
{
FILE * fd ;
char palabra [ MAX ];
fd = fopen ( " datos . dat " ," r " ) ;
if ( fd == NULL )
{
printf ( " error al abrir el archivo \ n " ) ;
return 0;
}
while ( fscanf ( fd , " %s " , palabra ) != EOF )
printf ( " palabra leida : \" %s \"\ n " , palabra ) ;
fclose ( fd ) ;
return 0;
}

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

12/30

Manejo de archivos en lenguaje C


Archivos de caracteres

lee palabras arg.c


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
27

/* Programacion estructurada , 13 O , Oscar Alvarado Nava


Lee el contenido de un archivo por palabras */
# include < stdio .h >
# define MAX 50
// ejecutar asi : ./ lee_pala br as _a rg datos . dat
int main ( int argc , char * argv [])
{
FILE * fd ;
char palabra [ MAX ];
if ( argc != 2 )
{
printf ( " uso : %s < nombre del archivo >\ n " , argv [0]) ;
return -1;
}
fd = fopen ( argv [1] , " r " ) ;
if ( fd == NULL )
{
printf ( " error al abrir el archivo \ n " ) ;
return -1;
}
while ( fscanf ( fd , " %s " , palabra ) != EOF )
printf ( " palabra leida : \" %s \"\ n " , palabra ) ;
fclose ( fd ) ;
return 0;
}

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

13/30

Manejo de archivos en lenguaje C


Archivos de caracteres

lee linea.c
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

/* Programacion estructurada 13 O , Oscar Alvarado Nava


Lee una linea de palabras hasta el caracter \ n */
# include < stdio .h >
# include < string .h > // para strlen
# define MAX 100
int main ()
{
FILE * fd ;
char linea [ MAX ];
int nchars ;
fd = fopen ( " datos . dat " ," r " ) ;
if ( fd == NULL )
{
printf ( " error al abrir el archivo \ n " ) ;
return 0;
}
fgets ( linea , MAX , fd ) ;
nchars = strlen ( linea ) ;
linea [ nchars -2]= \0 ; // elimina \ r y \ n
printf ( " linea leida : \" %s \"\ n " , linea ) ;
fclose ( fd ) ;
return 0;
}

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

14/30

Manejo de archivos en lenguaje C


Archivos de caracteres

Archivo de texto datos2.dat

1
2
3
4
5
6

5
1
2
3
4
5

1.0
2.2
3.1
4.5
5.1

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

15/30

Manejo de archivos en lenguaje C


Archivos de caracteres

lee numeros.c
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
27
28

/* Programacion estructurada , 13 O , Oscar Alvarado Nava


Lee palabras y los convierte a enteros y flotantes */
# include < stdio .h >
int main ()
{
FILE * fd ;
int i , ndatos ;
int entero ;
float flotante ;
fd = fopen ( " datos2 . dat " ," r " ) ;
if ( fd == NULL )
{
printf ( " error al abrir el archivo \ n " ) ;
return 0;
}
fscanf ( fd , " %d " ,& ndatos ) ;
printf ( " Se leeran %d pares de datos \ n " , ndatos ) ;
for ( i =0; i < ndatos ; i ++)
{
fscanf ( fd , " %d " ,& entero ) ;
printf ( " %d " , entero ) ;
fscanf ( fd , " %f " ,& flotante ) ;
printf ( " %f \ n " , flotante ) ;
}
fclose ( fd ) ;
return 0;
}

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

16/30

Manejo de archivos en lenguaje C


Archivos de caracteres

Datos de personas datos3.dat

1
2
3
4
5
6
7
8
9
10
11

10
Benjamin 34 90.5
Humberto 33 75.3
Juan 35 80.7
Miguel 39 70.3
Francisco 42 80.0
Gerardo 41 110.5
Alex 36 101.3
Omar 41 90.1
Ricardo 45 110.5
Fernando 28 70.5

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

17/30

Manejo de archivos en lenguaje C


Archivos de caracteres

lee personas.c (1/2)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

/* Programacion estructurada , 13 O , Oscar Alvarado Nava


Lee palabras y los convierte a cadenas , enteros y flotantes */
# include < stdio .h >
/* maximo 20 lugares para almacenar datos en memoria */
# define MAX 20
int main ()
{
FILE * fd ;
int i , ndatos ;
char nombres [ MAX ][20]; // MAX cadenas de maximo 19 caracteres y nulo
int edades [ MAX ];
float pesos [ MAX ];
fd = fopen ( " datos3 . dat " ," r " ) ;
if ( fd == NULL )
{
printf ( " error al abrir el archivo \ n " ) ;
return 0;
}

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

18/30

Manejo de archivos en lenguaje C


Archivos de caracteres

lee personas.c (2/2)

23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 }

fscanf ( fd , " %d " ,& ndatos ) ;


printf ( " Se leeran %d datos de personas \ n " , ndatos ) ;
for ( i =0; i < ndatos ; i ++)
{
fscanf ( fd , " %s " ,& nombres [ i ]) ;
fscanf ( fd , " %d " ,& edades [ i ]) ;
fscanf ( fd , " %f " ,& pesos [ i ]) ;
}
fclose ( fd ) ;
for ( i =0; i < ndatos ; i ++)
printf ( " %d : %s , %d , %f \ n " ,i , nombres [ i ] , edades [ i ] , pesos [ i ]) ;
return 0;

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

19/30

Manejo de archivos en lenguaje C


Archivos de caracteres

escribe personas.c (1/2)


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
27
28

/* Programacion estructurada , 13 O , Oscar Alvarado Nava


Solicita cadenas , enteros y flotantes y los almacena como
caracteres en un archivo */
# include < stdio .h >
/* maxima longitud de los arreglos de datos */
# define MAX 20
int main ()
{
FILE * fd ;
int i , ndatos ;
char nombres [ MAX ][20]; // MAX cadenas de maximo 19 caracteres y nulo
int edades [ MAX ];
float pesos [ MAX ];
char archivo [ MAX ];
printf ( " Cuantos datos de personas ? \ n " ) ;
scanf ( " %d " , & ndatos ) ;
for ( i =0; i < ndatos ; i ++)
{
printf ( " Datos de la persona %d \ n " ,i ) ;
printf ( " nombre : " ) ;
scanf ( " %s " ,& nombres [ i ]) ;
printf ( " edad : " ) ;
scanf ( " %d " ,& edades [ i ]) ;
printf ( " peso : " ) ;
scanf ( " %f " ,& pesos [ i ]) ;
}

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

20/30

Manejo de archivos en lenguaje C


Archivos de caracteres

escribe personas.c (2/2)

29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 }

printf ( " Nombre del archivo ? \ n " ) ;


scanf ( " %s " , archivo ) ;
fd = fopen ( archivo , " w " ) ;
if ( fd == NULL )
{
printf ( " error al abrir el archivo \ n " ) ;
return 0;
}
fprintf ( fd , " %d \ n " , ndatos ) ;
for ( i =0; i < ndatos ; i ++)
fprintf ( fd , " %s %d %f \ n " , nombres [ i ] , edades [ i ] , pesos [ i ]) ;
fclose ( fd ) ;
return 0;

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

21/30

Manejo de archivos en lenguaje C


Archivos de caracteres

plot char.c (1/2)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

/* Programacion estructurada , 13 O , Oscar Alvarado Nava


Evalua una funcion y almacena los datos como caracteres en un archivo */
# include < stdio .h >
# include < math .h > // debera compilarse : gcc plot_char . c -o plot_char - lm
# define MAX_NOMBRE 20
/* Declaracion de la funcion a evaluar */
float funcion ( float ) ;
/* Definicion de la funcion a evaluar */
float funcion ( float x )
{
return sin (10.0* x ) + cos (3.0* x ) ;
}
int main ()
{
char archivo [ MAX_NOMBRE ];
float x , x0 , x1 , deltax ;
int np ;
FILE * fd ;
printf ( " Plotea la funcion f ( x ) = sen10x + cos3x \ n " ) ;

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

22/30

Manejo de archivos en lenguaje C


Archivos de caracteres

plot char.c (2/2)


24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 }

printf ( " Nombre del archivo donde se almacenara [x , f ( x ) ]: " ) ;


scanf ( " %s " , archivo ) ;
if ( ( fd = fopen ( archivo , " w + " ) ) == NULL )
{
printf ( " error al abrir el archivo: %s \ n " , archivo ) ;
return -1;
}
printf ( " Intervalo de evaluacion : \ n " ) ;
printf ( " x0 : " ) ;
scanf ( " %f " ,& x0 ) ;
printf ( " x1 : " ) ;
scanf ( " %f " ,& x1 ) ;
printf ( " numero de puntos : " ) ;
scanf ( " %d " ,& np ) ;
deltax = ( x1 - x0 ) /( float ) np ;
printf ( " Calculando ... " ) ;
for ( x = x0 ; x < x1 ; x += deltax )
fprintf ( fd , " %f %f \ n " ,x , funcion ( x ) ) ;
printf ( " ok \ n " ) ;
fclose ( fd ) ;
return 0;

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

23/30

Manejo de archivos en lenguaje C


Archivos de caracteres

Datos a plotear datos4.dat


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

0.000000
0.000500
0.001000
0.001500
0.002000
0.002500
0.003000
0.003500
0.004000
0.004500
0.005000
0.005500
0.006000
0.006500
0.007000
0.007500
0.008000
0.008500
0.009000
0.009500
0.010000
0.010500
0.011000
0.011500
0.012000
...

1.000000
1.004999
1.009995
1.014989
1.019981
1.024969
1.029955
1.034938
1.039917
1.044894
1.049867
1.054836
1.059802
1.064764
1.069722
1.074677
1.079627
1.084573
1.089514
1.094451
1.099383
1.104311
1.109234
1.114152
1.119064

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

24/30

Manejo de archivos en lenguaje C


Archivos de caracteres

Graficacion con gnuplot en Linux

oskr@kro:$ gnuplot
gnuplot> plot datos4.dat with dots

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

25/30

Manejo de archivos en lenguaje C


Archivos de caracteres

Grafica
2
"d.d"
1.5

0.5

-0.5

-1

-1.5

-2
0

Oscar Alvarado Nava

0.5

1.5

UAM Azcapotzalco

2.5

3.5

Archivos

4.5

26/30

Manejo de archivos en lenguaje C


Archivos de caracteres

plot byte.c (1/2)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

/* Programacion estructurada , 13 O , Oscar Alvarado Nava


Evalua una funcion y almacena los datos como " bytes " en un archivo */
# include < stdio .h >
# include < math .h > // debera compilarse : gcc plot_byte . c -o plot_byte - lm
# define MAX_NOMBRE 20
/* Declaracion de la funcion a evaluar */
float funcion ( float ) ;
/* Definicion de la funcion a evaluar */
float funcion ( float x )
{
return sin (10.0* x ) + cos (3.0* x ) ;
}
int main ()
{
char archivo [ MAX_NOMBRE ];
float x , x0 , x1 , deltax , fx ;
int np ;
FILE * fd ;
printf ( " Plotea la funcion f ( x ) = sen10x + cos3x \ n " ) ;

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

27/30

Manejo de archivos en lenguaje C


Archivos de caracteres

plot byte.c (2/2)


24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 }

printf ( " Nombre del archivo donde se almacenara [x , f ( x ) ]: " ) ;


scanf ( " %s " , archivo ) ;
if ( ( fd = fopen ( archivo , " w + " ) ) == NULL )
{
printf ( " error al abrir el archivo: %s \ n " , archivo ) ;
return -1;
}
printf ( " Intervalo de evaluacion : \ n " ) ;
printf ( " x0 : " ) ;
scanf ( " %f " ,& x0 ) ;
printf ( " x1 : " ) ;
scanf ( " %f " ,& x1 ) ;
printf ( " numero de puntos : " ) ;
scanf ( " %d " ,& np ) ;
deltax = ( x1 - x0 ) /( float ) np ;
printf ( " Calculando ... " ) ;
for ( x = x0 ; x < x1 ; x += deltax )
{
fwrite (& x , sizeof ( float ) ,1 , fd ) ;
fx = funcion ( x ) ;
fwrite (& fx , sizeof ( float ) ,1 , fd ) ;
}
printf ( " ok \ n " ) ;
fclose ( fd ) ;
return 0;

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

28/30

Manejo de archivos en lenguaje C


Archivos de caracteres

leePlot byte.c (1/2)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

/* Programacion estructurada , 13 O , Oscar Alvarado Nava


Lee los " bytes " almacenados en un archivo , los interpreta como
flotantes y los mustra como caracteres */
# include < stdio .h >
# include < math .h > // debera compilarse : gcc leePlot_byte . c -o leePlot_byte - lm
# define MAX_NOMBRE 20
int main ()
{
char archivo [ MAX_NOMBRE ];
float x , fx ;
int np , i ;
FILE * fd ;
printf ( " Muestra los valores de la evaluacion de f ( x ) = sen10x + cos3x \ n " ) ;
printf ( " Nombre del archivo donde estan almacenados [x , f ( x ) ]: " ) ;
scanf ( " %s " , archivo ) ;
if ( ( fd = fopen ( archivo , " r + " ) ) == NULL )
{
printf ( " error al abrir el archivo: %s \ n " , archivo ) ;
return -1;
}

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

29/30

Manejo de archivos en lenguaje C


Archivos de caracteres

leePlot byte.c (2/2)

24
25
26
27
28
29
30
31
32
33
34
35
36
37 }

printf ( " numero de puntos a leer : " ) ;


scanf ( " %d " ,& np ) ;
for ( i = 0; i < np ; i ++ )
{
fread (& x , sizeof ( float ) ,1 , fd ) ;
fread (& fx , sizeof ( float ) ,1 , fd ) ;
printf ( " x: %f , fx: %f \ n " ,x , fx ) ;
}
fclose ( fd ) ;
return 0;

Oscar Alvarado Nava

UAM Azcapotzalco

Archivos

30/30

You might also like