Sie sind auf Seite 1von 10

5.

- ARREGLOS Y ARCHIVOS
5.1 arreglos (Vectores y Matrices)
Qu es un arreglo?
En muchos casos es necesario declarar un conjunto de variables que
tengan el mismo tipo de datos. En lugar de hacerlo en forma
individual, C permite declarar como un arreglo a un conjunto de
variables del mismo tipo de datos
Un arreglo es un conjunto de variables que son del mismo tipo de
datos. A cada parte de un arreglo se le denomina elemento. Todos
los elementos de un arreglo se referencian con el mismo nombre del
arreglo y se almacenan en un conjunto de posiciones consecutivas de
memoria.
Un matriz o vector, (array) es una zona de almacenamiento continuo, que contiene una serie de elementos del mismo tipo,
los elementos de la matriz. Desde el punto de vista lgico una matriz se puede ver como un conjunto de elementos
ordenados en filas o columnas, de dos dimensiones.
La forma de acceder a los elementos de la matriz es directa, esto significa que el elemento deseado es obtenido a partir de
su ndice y no hay que ir buscndolo elemento por elemento. para trabajar con vectores muchas veces es preciso
recorrerlos. Esto se realiza por medio de bucles.
Ejemplos:
Main()
{
Int i, v[5]; // v[5] es un vector de 5 componentes
For(i=0;i<5;i++)
{V[i] =0; // asigna 0 al vector
Printf(%d \n,v[i]);
}
Return 0;
}
Matrices multidimensionales
Es posible declarar matrices multidimensionales entendindolas como un vector de x dimensin. En dichos casos en un
nmero de elementos del vector es el producto resultante de cada dimensin
Caractersticas:
Un arreglo es una coleccin de datos relacionados de igual tipo e
identificados bajo un nombre genrico nico.

La estructura completa ocupa un segmento de memoria nico y sus
elementos se almacenan en forma contigua.

Para procesar un elemento del arreglo, se debe especificar el nombre de
la estructura y uno o ms ndices que determinan la posicin relativa del
elemento.

El ndice que determina la posicin de los elementos de u arreglo
comienza siempre con cero.

En la declaracin se debe establecer la cantidad de elementos
(dimensin) que puede tener como mximo el arreglo en el programa o
definir los elementos que lo componen.

La dimensin de un arreglo debe ser siempre mayor o igual a su longitud.

Si se requiere 2 ndices para establecer la posicin de un elemento, el
arreglo es una tabla o matriz. Con 3 ndices es una matriz tridimensional y con ms ndices una matriz
multidimensional.

El nombre de un arreglo representa la direccin de memoria del inicio el arreglo (de su primer elemento).

Al pasar arreglos como parmetros de funciones la relacin entre parmetro formal-parmetro actual es similar al
pasaje por referencia. Para evitar cambios en el arreglo enviado en la llamada a una funcin se debe preceder al
variable arreglo establecida como parmetro formal en el prototipo de la funcin con el modificador const.
Declaracin de arreglos
La forma general para declarar un arreglo es la siguiente:
Tipo_de_datos Nombre-arreglo [tamao-arreglo];
Aqu tipo_de_datos es el especificador de tipo que indica de qu tipo de datos ser el arreglo declarado. Nombre-arreglo es
el nombre del arreglo declarado. Tamao-arreglo define cuantos elementos puede contener el arreglo. En la declaracin de
un arreglo se requieren los corchetes ([ y ]). Este par de corchetes se conoce como el operador de subndices del arreglo
Por ejemplo, en la siguiente instruccin se declara un arreglo de enteros:
Int arreglo_ent [8];
En donde int especifica el tipo de datos del arreglo cuyo nombre es arreglo_ent. El tamao del arreglo es 8, lo que significa
que puede almacenar ocho elementos (en este caso, enteros)
En C, se debe declarar un arreglo de manera explcita, antes de poder utilizarlo, como se hace con las variables
Indexacin de arreglos
Char da [7];
Despus de declarar un arreglo se puede acceder por separado a cada uno de sus elementos, para ello debe utilizar el
nombre del arreglo en una expresin, seguido de un nmero, llamado ndice, encerrado entre corchetes. Lo que es
importante es que en C todos los arreglos se indexan comenzando en 0. En otras palabras el ndice del primer elemento del
arreglo es 0 y no 1, por lo tanto el primer elemento del ejemplo anterior seria char da [0];
Inicializacin de arreglos
Los arreglos estaticos se declaran y definen como cualquier otra variable. Usualmente
se establece la dimensin de la estructura, es decir, la mxima cantidad de elementos
que puede contener el programa
Para inicializar un arreglo en el programa podemos recorrer cada elemento del arreglo
para asignar los valores correspondientes, o bien, pueden inicializarce los elementos
en la misma declaracin, enumerando la lista de datos a asignar
Por ejemplo, puede inicializarse el primer elemento del arreglo da como da [0]=D;
Aqu se asigna el valor numerado D al primer elemento de da, da [0].
La segunda forma de inicializar un arreglo consiste en inicializar al mismo tiempo
todos sus elementos. Por ejemplo con la siguiente instruccin inicializa un arreglo de
enteros, arEnteros:
Int arEnteros [5]= {100, 8, 3, 365, 16};
Aqu los enteros que estn dentro de las llaves ({y}) se asignan respectivamente a
los elementos del arreglo arEnteros. Es decir, 100 al primer elemento (arEnteros
[0], 8 al segundo elemento (arEnteros [1]), 3 al tercer elemento (arEnteros [2]), y
as sucesivamente
EJEMPLO
#include <stdio.h>
Main ()
{
Int i;
Int lista_ent [10];
For [(i=0;I<10;i++)
{Lista_ent[i]=i+1;
Printf (lista_ent [%d] se inicializa con %d \n, lista_ent[i]);
}
Return 0;
}

Este programa despliega los siguientes resultados:
Lista_ent [0] se inicializa con 1
Lista_ent [1] se inicializa con 2
Lista_ent [2] se inicializa con 3
Lista_ent [3] se inicializa con 4
Lista_ent [4] se inicializa con 5
Lista_ent [5] se inicializa con 6
Lista_ent [6] se inicializa con 7
Lista_ent [7] se inicializa con 8
Lista_ent [8] se inicializa con 9
Lista_ent [9] se inicializa con 10

Clasificacin de los arreglos
En base al nmero de ndices que determinan la posicin de un elemento en el arreglo podemos definir
Arreglos lineales o unidimensionales: la posicin de un elemento la determina un nico ndice
Arreglos multidimensionales: se requieren 2 ndices o ms para posicionar un elemento en la coleccin.
Tambin conocidos como tablas o matrices multidimensionales.
Arreglos bidimensionales
Se requieren 2 indices para posicionar un elemento en la coleccin. Tambin son conocidos como
tablas o matrices
Arreglos multidimensionales
se requieren mas de dos ndices para posicionar un elemento en la coleccin tambin conocidos como
tablas o matrices multidimensionales
Adems de arreglos de una sola dimensin, el lenguaje C tambin maneja arreglos multidimensionales.
Se pueden declarar arreglos con tantas dimensiones como el compilador lo permita
La forma general de declarar un arreglo de N dimensiones es
Tipo_de_datos nombre-arreglo [tamao-arreglo1] [tamao-arreglo2]. . . [tamao-
arreglo3];
En donde n puede ser cualquier entero positivo
La siguiente instruccin declara un arreglo bidimensional entero:
Int arreglo_ent [2] [3];
Aqu los dos pares de corchetes representan las dos dimensiones con un tamao de 2 y 3 elementos enteros,
respectivamente. Se puede agregar que las matrices bidimensionales comienzan o se escriben por columna rengln
respectivamente
EJEMPLO
#include <stdio.h>
Main()
{
Int dos_dim[3][5];
Int i,j;
For (i=0;i<3;i++)
For(j=0;i<5;i++=
{ Dos_dim[i]=I;
Printf(%d \n,dos_dim[i];
}
Return 0;
}

Dimensin y longitud de un arreglo
Los arreglos son estructuras estticas que requieren establecer la cantidad de elementos que pueden almacenar. Pero en la
prctica no siempre se conoce la cantidad exacta de elementos a asignar al arreglo; entonces se debe dimensionar por
exceso. El valor empleado para declarar un arreglo se denomina dimensin y la cantidad real de elementos es la longitud
del arreglo. Si un programa L<D habr posiciones vacas en la estructura lo cual no representa ningn problema,
obviamente debemos tener cuidado en recorrer el arreglo en toda su longitud y no en toda su dimensin lo cual si sera un
problema.
ndices enumerados
Las constantes enumeradas que permiten definir nuevos tipos de datos en C++. Es posible emplear tales tipos para asignar
datos e inclusive definir ndices de un arreglo.

Arreglos como parmetros de funciones
Es posible usar arreglos como parmetros de funciones. En C++ no es posible pasar por valor un bloque de memoria
competo como parmetro a una funcin, aun si esta ordenado como arreglo, pero est permitido pasar su direccin de
memoria, lo cual es mucho ms rpido y eficiente. Al pasar una direccin de memoria estamos efectuando un pasaje por
referencia. Para admitir arreglos lineales como parmetros lo nico que se debe hacer al declarar la funcin es especificar
en el argumento el tipo de dato que contiene el arreglo, un identificador es especificar en el argumento el tipo de dato que
contiene el arreglo, un identificador y un par de corchetes vacios void leer_arreglo ( int arg[ ] ). El nombre del arreglo
identifica a una variable que contiene la direccin de memoria donde comienza el bloque donde se aloja el arreglo. Este
tiene la direccin de memoria del elemento del arreglo.
Declaracin y
uso de
archivos
5.2 Manejo de archivos
Qu es un archivo?
En C, un archive puede referirse a un archive en disco, una terminal, una
impresora o una unidad de cinta. En otras palabras, un archivo representa un
dispositivo concreto con el que usted tiene que intercambiar informacin. Antes
de realizar un dispositivo concreto con el que usted tiene que intercambiar
informacin. Antes de realizar cualquier comunicacin con un archivo, tiene que
abrirlo. Despus de terminar de intercambiar de informacin con l, necesita
cerrarlo
Un arreglo es una estructura de datos homognea, es decir solo admite una
coleccin de elementos de igual tipo. A menudo se requiere organizar los datos de una entidad en una estructura, pero
admitiendo informacin de diferente naturaleza (tipo). C++ dispone para este caso del tipo struct.
Un struct en C++ es una coleccin de componentes, los cuales pueden ser de diferente tipo. Cada componente o miembro
debe declararse individualmente. Su sintaxis general es la siguiente:

struct compuesta
{ miembro 1;
Miembro 2;
Miembro 3;
.
Miembro n;
};
Un struct es una estructura de datos e C++ que permite organizar un conjunto
de datos relacionados de diferente tipo. Estos datos que conforman el struct se
denominan miembros.
Los miembros de un struct pueden ser de tipo simple o tambin otras
estructuras de datos: arreglos, structs, etc.
Tambin los elementos de un arreglo pueden ser de tipo struct.
Los objetos cin y cout para flujos de entrada y salida no permiten operar
estructuras de datos completas. Se deben utilizar los componentes de una
estructura, como el elemento de un arreglo o un miembro de un struct.
C++ admite la identificacin de tipos a travs de la palabra clave typedef. Estas
definiciones suelen ser globales y se realizan usualmente fuera de la funcin
principal de programa main().

Un arreglo es una estructura de datos homognea, es decir solo admite una coleccin de
elementos de igual tipo. A menudo se requiere organizar los datos de una entidad en una estructura, pero admitiendo
informacin de diferente naturaleza (tipo). C++ dispone para este caso del tipo struct.
Un struct en C++ es una coleccin de componentes, los cuales pueden ser de diferente tipo. Cada componente o miembro
debe declararse individualmente. Su sintaxis general es la siguiente:
Ficha
Apellido
Nombres
Identificacin
Edad
Cant_materias

Al definir una estructura estamos planteando el esquema de la composicin pero sin definir ninguna variable en particular.

Arreglo de structs
Es posible emplear arreglos como miembros de una composicin struct. Pero tambin
podemos definir un arreglo cuyos elementos sean estructuras.

struct ficha {
char *apellido;
char *nombres;
long identificacin;
Struct ficha
{
Char *apellido;
Char *nombres;
Long identificacin;
Int edad;
Int cant_materias;
};
int edad;
int cant_materias;
};
struct ficha z[5] =
{ {Lopez,Gerardo,24567890, 21, 11},
{"Gimnez","Ana", 25689901,20},
{"Zapata, Andrs", 26701231, 19,8},
{"Faras","Marina", 23199870, 22,15},
{"Martino","Manuel", 24500654, 21,10}
}



Procesamiento de una variable struct

Para procesar la informacin relacionada a una estructura podemos operar con sus miembros individualmente o en
ocasiones con la estructura completa. Para acceder a un miembro individual debemos utilizar el identificador de la variable
struct, un punto de separacin y el nombre del miembro componente.
Tipos definidos por el usuario: typedef
Es posible en C++ identificar a tipos existentes o estructuras de datos con nombres y tratarlos como si fueran nuevos tipos
de datos. Entonces, las variables o funciones podrn declararse en base a estos nuevos nombres que representan tipos de
datos de C++.
Para asignar un nombre correspondiente a una definicin de tipo en C++ debemos empelar la palabra reservada typedef.
Ejemplo:

typedef unsigned char byte; //se le da el alias byte a los char sin signo //
typedef int tabla[50][12]; //definicin del nombre tabla como matriz de 50x12 enteros //

typedef struct
{
char *apellido;
char *nombres;
long dni;
int edad;
int cant_materias;
}
ficha // definicin del tipo ficha como estructura


Qu es un flujo?
El flujo de datos que usted transfiere desde su programa a un archivo, o viceversa, se llama flujo, el cual es una serie de
bytes. A diferencia de un archivo, que identifica un dispositivo E/D, un flujo es un dispositivo independiente. Todos los flujos
tienen el mismo comportamiento sin importar el dispositivo al que estn asociados. Para realizar operaciones de E/S, puede
leer desde o escribir a cualquier tipo de archivos tan solo con asociar un flujo al archivo.
Existen dos formatos de flujos el primero se llama flujo de texto, el cual consiste en una secuencia de caracteres(es decir,
texto). Dependiendo del sistema, cada lnea de caracteres de un flujo de texto puede terminar un carcter de lnea nueva
(\n). los flujos de texto se emplean para datos textuales, los cuales tienen una apariencia consistente de un ambiente a otro,
o de una maquina a otra.
El segundo formato de flujo se denomina flujo binario, el cual es una secuencia de bytes; por ejemplo, el contenido de un
archivo de programa ejecutable. Los flujos binarios se usan principalmente para datos no textuales, en donde el contenido
exacto de los datos se mantiene sin importar la apariencia

E/S en bferes
En c, un rea de memoria que se usa temporalmente para almacenar datos antes de enviarlos a su destino, se llama bfer.
Con la ayuda de bferes, el sistema operativo puede mejorar su eficiencia reduciendo el nmero de accesos a los
dispositivos de E/S (archivos)
El acceso a un disco o dispositivo de E/S es por lo regular mucho ms lento que el acceso directo a la memoria. Se pueden
realizar varias operaciones de E/S en un bfer que representa al archivo de E/S, en lugar del archivo mismo. Por ejemplo si
se envan varias operaciones de escritura a un bfer, estas se almacenaran en memoria hasta que sea el momento de
guardar o confirmar los nuevos datos en el dispositivo real. As que en lugar de hacer varias operaciones de escritura en
fila, cada una de las cuales hace ms lento el dispositivo de disco, todas se llevan a cabo en el bfer de memoria y solo se
acceder al dispositivo de disco una vez, al desalojar el bfer
Apuntadores de FILE
La estructura FILE es la estructura de control de archivo definida en el archivo de encabezado stdio.h. un apuntador de tipo
FILE se llama apuntador de archivo, el cual hace referencia a un archivo en disco, un flujo utiliza un apuntador de archivo
para conducir la operacin de las funciones de E/S. por ejemplo lo siguiente define un apuntador de archivo llamado aptrf:
FILE *aptrf;
En la estructura FILE hay un miembro, llamado indicador de posicin del archivo, el cual apunta a la posicin del archivo en
la que a continuacin se leern o escribirn datos.
Como abrir archivos
La funcin fopen () de E/S de C, abre un archivo y le asocia un flujo. Es
necesario especificar el mtodo de apertura del archivo y el nombre del
mismo como argumentos para la funcin fopen ().
La sintaxis de la funcin fopen () es:
#include <stdio.h>
FILE *fopen(const char *nomarchivo, const char *modo);

Aqu, nomarchivo es un apuntador es un apuntador char que hace
referencia a una cadena que contiene un nombre de archivo. Este nombre se
da al archivo que esta por abrir la funcin fopen (). modo apunta a otra
cadena que especifica la forma de abrir el archivo. La funcin fopen ()
devuelve un apuntador tipo FILE. Si ocurre un error durante el procedimiento de apertura de un archivo, la funcin fopen ()
devuelve un apuntador nulo
El parmetro modo est formado por una combinacin de los caracteres r (read [lectura]), w (write [escritura]), b (binary
[binario]), a (append [agregar]), y + (update [actualizar]).
Cuando utilice el modo r y el archivo ya exista, se preservara el contenido del archivo y los nuevos que escriba se
agregaran al final. Si el archivo aun no existe se creara. Esto contrasta con write, que siempre intenta crear un archivo
nuevo, y descartara cualquier dato que pudiera haber en el archivo. Usar el carcter + establece los modos tanto de lectura
como de escritura. Cuando utiliza r, el archivo ya debe existir si no es as la llamada fracasara
La siguiente lista muestra las formas posibles de abrir un archivo mediante
varias cadenas de modos
r abre un archivo de texto existente para lectura
w crea un archivo de texto para escritura
a abre un archivo de texto existente para agregarle informacin
r+ abre un archivo de texto existente para agregarle informacin.
w+ crea un archivo de texto existente para lectura o escritura
a+ abre un archivo de texto para agregarle informacin
rb abre un archivo binario existente para lectura o escritura
wb crea un archivo binario para escritura
ab abre un archivo binario existente para agregarle informacin
r+b abre un archivo binario existente para lectura o escritura
w+b abre un archivo binario para lectura o escritura
a+b abre o crea un archivo binario para agregarle informacin
EJEMPLO
Las siguientes instrucciones intentan abrir un archivo llamado prueba.txt:
FILE *aptrf;
If ((aptrf = fopen ( prueba.txt , r))== NULL) {
Printf (No es posible abrir el archive prueba.txt, \n);
Exit (1);
}




Como cerrar archivos
Despus de leer, escribir o agregar algunos datos nuevos a un archivo en disco, tiene que disociar el archivo de un flujo
especifico por medio de una llamada a la funcin fclose ().
La sintaxis de la funcin fclose () es:
#include <stdio.h>
Int fclose(FILE *flujo);
Aqu, flujo es un apuntador de archive que est asociado con un flujo al archive abierto. Si fclose () cierra con xito un
archivo, devuelve 0. En caso contrario, la funcin devuelve EOF. Por lo regular, la funcin fclose () solo falla cuando se
retira el disco antes de llamar a la funcin o cuando ya no queda espacio en el disco
Despus de la operacin de E/S, se tiene que cerrar el archivo que este abierto y asociado con un flujo. En caso contrario,
podran perderse los datos guardados en el archivo; podran ocurrir algunos errores impredecibles durante la ejecucin de
su programa. Adems, no cerrar un archivo cuando ya no se usa podra evitar que otros programas o usuarios tengan
acceso al archivo ms adelante.

EJEMPLO
El siguiente programa indica como abrir y cerrar un archivo de texto, y como verificar el valor del apuntador de archivo que
devuelve fopen ().
#inclue <stdio.h<
Enum {XITO, FRACASO};
Main (void)
{
FILE *aptrf;
Char nomarchivo[]=haiku.txt;
Int valdevol=EXITO;

If ((aptrf=fopen(nomarchivo, r)) == NULL) {
Printf (No es posible abrir %s. \n, nomarchivo);
Valdevol=FRACASO;
} else {
Printf (El valor de aptrf es: 0x%p \n, aptrf);
Printf (Listo para cerrar el archivo.);
Fclose (aptrf);
}
Return valdevol;
}



Lectura y escritura de archivos en disco
En C, puede realizar operaciones de E/S en las siguientes formas:
Leer o escribir un carcter a la vez.
Leer o escribir una lnea de texto ( es decir, una lnea de caracteres) a la vez
Leer o escribir un bloque de caracteres a la vez


Un carcter a la vez
Fgetc () y fputc (), se usan para leer o escribir un carcter a la vez en un archivo de disco
La sintaxis de la funcin fgetc () es
#include <stdio.h>
Int fgetc(FILE *flujo);

Aqu el flujo es el apuntador asociado a un flujo, esta funcin extrae el siguiente tipo carcter del flujo. La funcin devuelve
entonces un valor de tipo int que se convierte a partir del carcter.
La sintaxis de la funcin fputc () es
#include <stdio.h>
Int fputc(int c, FILE *flujo);
Aqu, c es un valor de tipo int que representa un carcter. De hecho, el valor int se convierte en unsigned char antes de
imprimirlo. Flujo es el apuntador de archivo asociado a un flujo, si tiene xito la funcin devuelve un carcter impreso en
caso contrario devuelve EOF


Una lnea a la vez
Adems de leer o escribir un carcter a la vez, tambin puede leer o escribir una lnea de caracteres a la vez. En C hay un
par de funciones de E/S, fgets() y fputs(), que le permiten hacerlo.
La sintaxis de la funcin fgets() es
#include <stdio.h>
Char *fgets(char *s, int n, FILE *flujo);
Aqu, s hace referencia a un arreglo de caracteres que se usa para almacenar los caracteres ledos del archive abierto al
que el apuntador de archive flijo. n especifica el mximo de elementos de arreglo

La sintaxis de la funcin fputs () es:
#include <stdio.h>
Int fputs (const char *s, FILE *flujo);
Aqu, s apunta al arreglo que contiene los caracteres a escribir en un archive asociado al apuntador de archive flujo. El
modificador const indica que la funcin fputs () no puede modificar el contenido del arreglo al que apunta s.

Un bloque a la vez
Si lo desea, tambin puede leer o escribir un bloque de datos a la vez. En C hay dos funciones de E/S, frear () y fwrite (),
que se pueden utilizar para realizar operaciones de E/S en bloque. Las funciones fread() y fwrite() se reflejan entre si
La sintaxis de la funcin fread () es
#include <stdio.h>
Size_t fread (void *aptr, size: t tamao, size_t n, FILE *flujo);
aqu aptr es un apuntador a un arreglo en el que se almacenan los datos. Tamao indica el tamao de cada elemento de
arreglo. N especifica el nmero de elementos a leer. Flujo es un apuntador de archivo asociado al archivo abierto para
lectura. Size_t es un tipo integral definido en el archivo de encabezado stdio.h. la funcin fread() devuelve el nmero de
elementos que en realidad se leyeron
la sintaxis de la funcin fwrite() es
#include <stdio.h>
Size_t fwrite (const void *aptr, size_t tamao, size_t n, FILE *flujo);
Aqu aptr hace referencia al arreglo que contiene los datos por escribir en un archivo abierto al que apunta el apuntador de
flujo. Tamao indica el tamao de cada elemento de arreglo. N indica el nmero de elementos a escribir. La funcin fwite()
devuelve el nmero de elementos que en realidad se escribieron.
Hay una funcin llamada feof() que se puede usar para determinar el final de un archivo. Esta funcin es ms til cuando se
est leyendo un archivo binario, debido a que los valores de ciertos bytes podran ser iguales al valor de EOF. Esto quiere
decir que el carcter que se usa como marca de fin de archivo en un archivo de texto, se puede presentar con facilidad en
un archivo binario, pe en ese caso no pretende sealar el fin devuelto por fread, podra terminar en una posicin incorrecta.
Utilizar feof() le ayuda a evitar errores al determinar el final de un archivo, ya que esta funcin verifica si el indicador de
posicin del archivo llego al final del mismo, sin importar la presencia de cualquier EOF
Las sintaxis es
#include <stdio.h>
Int feof(FILE *fujo);
Flujo es el apuntador de archivo asociado a un archivo abierto. La funcin feof () devuelve 0 si no se ha llegado al final de
archivo, en caso contrario da un archivo diferente de 0

Archivos Leer archivos
explicacin

Das könnte Ihnen auch gefallen