Mostrando las entradas con la etiqueta masturbacion. Mostrar todas las entradas
Mostrando las entradas con la etiqueta masturbacion. Mostrar todas las entradas

Las diferencias de amigos y mejores amigos

Amigo: Te pide permiso para agarrar agua o comida.
Mejor amigo: Es la razón por la cual no tienes comida en la nevera.
Amigo: Te sacaría de la cárcel.
Mejor amigo: Estaría preso contigo diciéndote: “¿tienes frío maricon?”.
Amigo: No te ha visto llorar.
Mejor amigo: No le diría a nadie que has llorado, pero se cagaría de la risa cuando ya no estuvieras triste.
Amigo: Te pide prestadas tus cosas un par de días y te las devuelve.
Mejor amigo: Bota tus vainas y te dice “Coño pana; no se donde lo dejé”…
Amigo: Solo sabe algunas cosas sobre ti.
Mejor amigo: Podría escribir un libro con todas las pendejadas que han pasado y las brutalidades que has hecho.
Amigo: Te dejaría de hablar si los demás lo hacen.
Mejor amigo: Manda a comer mierda a los que te dejen de hablar.
Amigo: Toca la puerta de tu casa.
Mejor amigo: Entra hasta tu cuarto y grita: Hay comida…?
Amigo: Te quita la cerveza cuando ve que ya estás cayéndote de la pea.
Mejor amigo: Ya tambaleándose se acerca y te medio dice: “te la terminas GÜEVÓN porque aquí no desperdiciamos nada”

C++ ejemplos

Ejemplos
En este apéndice se incluyen algunos programas de ejemplo escritos en lenguaje
C.  Los  programas  han sido  realizados  de  forma  que  puedan ser  compilados  en la
mayoría de compiladores existentes para los sistemas operativos MS-DOS y UNIX sin
que exista la necesidad de realizar ningún tipo de cambio en los mismos.
B.1 - palindro.c.
/* Programa que calcula si una palabra es palindroma, esto es, se lee
igual de derecha a izquierda que de izquierda a derecha. */
#include <stdio.h>
#include <string.h>
#define TAM 100
/* Rutina que calcula si una palabra es palindroma.
Parametros: char *cadena Puntero al string con la palabra.
Return: int 0 no palindroma, <>0 palindroma. */
int Palindroma(char *cadena)
{
   register int i,j;
   i=0;
   j=strlen(cadena)-1;
   while (i<j && cadena[i]==cadena[j])
   {
      i++;
j--;
}
return (i>=j);
}
int main(void)
{
   char cadena[TAM];
   printf("\nIntroduce la palabra\n");
   gets(cadena);
   printf("La palabra: %s %s palindroma.\n",cadena,
      (Palindroma(cadena)) ? "es" : "no es");
return 0;
}
B.2 - matriz.c.
/* Programa que calcula el producto de dos matrices. */
#include <stdio.h>
75El lenguaje de programación C
/* Definicion del tamaño maximo */
#define TAM 10
/* Definicion de los codigos de error */
#define OK 0
#define ERROR 1
/* Definicion de la estructura de datos */
struct MATRIZ
{
   unsigned fila,columna;
float matriz[TAM][TAM];
};
/* Rutina que muestra un menu y pide una opcion del menu.
Parametros: Ninguno.
Return: char Opcion del menu elegida. */
char Menu(void)
{
   register char d;
   printf("\nElige la opcion deseada:\n");
   printf("\t0 -- Salir del programa.\n");
   printf("\t1 -- Cambiar la matriz A.\n");
   printf("\t2 -- Cambiar la matriz B.\n");
   printf("\t3 -- Calcular A*B\n");
   printf("\t4 -- Calcular B*A\n");
   while ((d=getchar())<'0' || d>'4');
return d;
}
/* Rutina que pide el numero de filas o de columnas de una matriz.
Parametros: char *cadena Puntero al string a mostrar.
Return: unsigned Numero de filas o de columnas. */
unsigned PedirTamano(const char *cadena)
{
unsigned valor;
do
{
      printf("%s",cadena);
      scanf("%u",&valor);
   }
   while (valor==0 || valor>TAM);
   return valor;
}
/* Rutina que cambia una matriz.
Parametros: struct MATRIZ *a Puntero a la matriz que vamos a cambiar.
Return: Ninguno. */
void PedirMatriz(struct MATRIZ *a)
{
   register unsigned i,j;
float valor;
76El lenguaje de programación C
   a->fila=PedirTamano("\nNumero de filas de la matriz: ");
   a->columna=PedirTamano("\nNumero de columnas de la matriz: \n");
   for(i=0;i<a->fila;i++)
      for(j=0;j<a->columna;j++)
      {
         printf("M[%u][%u]: ",i,j);
         scanf("%f",&valor);
         a->matriz[i][j]=valor;
      }
}
/* Rutina que multiplica dos matrices. Las matrices se pasan por
puntero pues ello es mas rapido, aunque no se modifican en toda la
funcion.
Parametros: struct MATRIZ *a Puntero a la estructura con la primera
matriz a multiplicar.
            struct MATRIZ *b Puntero a la estructura con la segunda
matriz a multiplicar.
            struct MATRIZ *res Puntero a la estructura que contendra
el resultado.
Return: int Codigo de error. */
int Multiplicar(const struct MATRIZ *a,const struct MATRIZ *b,struct
MATRIZ *res)
{
   register unsigned i,j,k;
if (a->columna!=b->fila)
      return ERROR;
   res->fila=a->fila;
   res->columna=b->columna;
for(i=0;i<a->fila;i++)
      for(j=0;j<b->columna;j++)
{
         res->matriz[i][j]=0;
for(k=0;k<a->fila;k++)
            res->matriz[i][j]+=a->matriz[i][k]*b->matriz[k][j];
}
   return OK;
}
/* Rutina que muestra en pantalla el resultado de la operacion.
Parametros: struct MATRIZ *res Puntero a la estructura con el
resultado.
Return: Ninguno. */
void Mostrar(const struct MATRIZ *res)
{
register unsigned i,j;
for(i=0;i<res->fila;i++)
{
      for(j=0;j<res->columna;j++)
         printf("Res[%u][%u]= %f\n",i,j,res->matriz[i][j]);
      printf("\nPulsa Enter para continuar.\n");
      getchar();
   }
}
77El lenguaje de programación C
int main(void)
{
   struct MATRIZ a,b,res;
   char d;
   a.fila=a.columna=b.fila=b.columna=1;
   a.matriz[0][0]=b.matriz[0][0]=1.0;
   do
      switch(d=Menu())
{
         case '0':break;
case '1':PedirMatriz(&a);
            break;
case '2':PedirMatriz(&b);
break;
case '3':
if (Multiplicar(&a,&b,&res)==ERROR)
               printf("\nNo es posible multiplicar A*B\n");
else
               Mostrar(&res);
break;
         case '4':
            if (Multiplicar(&b,&a,&res)==ERROR)
               printf("\nNo es posible multiplicar B*A\n");
else
Mostrar(&res);
break;
      }
   while (d!='0');
return 0;
}
B.3 - ordenar.c.
/* Programa que ordena un fichero de cualquier tamaño mediante el
algoritmo QuickSort. El fichero contiene como primer elemento un
unsigned con el numero de elementos del fichero, y a continuacion
figuran todos los elementos a ordenar */
#include <stdio.h>
#include <stdlib.h>
/* Rutina que lee el fichero de datos y devuelve un puntero al array
de la memoria reservada.
Parametros: char *nombre Nombre del fichero a leer.
            unsigned *num Puntero al unsigned que contendra el numero
de elementos del array.
Return: float * Puntero al array de float, NULL si sucede un error. */
float *LeerFichero(const char *nombre, unsigned *num)
{
   FILE *fp;
float *p;
register unsigned i;
78El lenguaje de programación C
   if ((fp=fopen(nombre,"rt"))==NULL)
{
      printf("\nError, no puedo abrir el fichero: %s\n",nombre);
      return NULL;
}
fscanf(fp,"%u\n",num);
if ((p=(float *)calloc(*num,sizeof(float)))==NULL)
{
      printf("\nError, memoria insuficiente.\n");
      fclose(fp);
return NULL;
}
for(i=0;i<*num;i++)
fscanf(fp,"%f\n",&p[i]);
fclose(fp);
return p;
}
/* Rutina que escribe el fichero de datos ordenado.
Parametros: char *nombre Nombre del fichero donde guardar los datos.
            unsigned num Numero de elementos del array.
            float *p Puntero al array ordenado.
Return: Ninguno. */
void GuardarFichero(const char *nombre,const unsigned num,const float
*p)
{
   FILE *fp;
register unsigned i;
if ((fp=fopen(nombre,"wt"))==NULL)
{
      printf("\nError, no puedo crear el fichero: %s\n",nombre);
      return;
}
fprintf(fp,"%u\n",num);
for(i=0;i<num;i++)
fprintf(fp,"%f\n",p[i]);
fclose(fp);
}
/* Rutina que ordena un array segun el algoritmo Quick-Sort.
Parametros:   float *p Puntero al array a ordenar.
              unsigned izq Elemento de la izquierda a ordenar.
              unsigned der Elemento de la derecha a ordenar.
Return:   Ninguno. */
void QuickSort(float *p,unsigned izq,unsigned der)
{
register unsigned i=izq,j=der;
float val,inter;
val=p[(i+j)/2];
do
{
      while (p[i]<val) i++;
while (p[j]>val) j--;
if (i<=j)
79El lenguaje de programación C
      {
         inter=p[i];
p[i]=p[j];
p[j]=inter;
i++;
j--;
      }
   }
while (i<=j);
if (izq<j) QuickSort(p,izq,j);
if (i<der) QuickSort(p,i,der);
return;
}
int main(int argc,char *argv[])
{
float *p;
unsigned num;
if (argc!=3)
   {
      printf("\nModo de uso: %s <fichero1> <fichero2>\n",argv[0]);
      return(1);
}
if ((p=LeerFichero(argv[1],&num))==NULL)
return 1;
QuickSort(p,0,num-1);
GuardarFichero(argv[2],num,p);
free(p);
return 0;
}
B.4 - fichero.c.
/* Programa que maneja una pequeña base de datos directamente sobre el
fichero */
#include <stdio.h>
#include <string.h>
/* Definicion de las constantes del programa */
#define TAM 30
#define TAM_BUFFER 10
/* Definicion de los codigos de error */
#define OK 0
#define ERROR 1
/* Definicion de las estructuras de datos del programa */
struct FICHA
{
   unsigned long dni;
char nombre[TAM];
   char apellido[2][TAM];
};
80El lenguaje de programación C
/* Rutina que muestra un menu en pantalla.
Parametros: Ninguno.
Return: char Opcion elegida. */
char Menu(void)
{
   register char d;
   printf("\nElige una opcion:\n");
   printf("\t0 -- Salir del programa.\n");
   printf("\t1 -- Insertar un nuevo elemento.\n");
   printf("\t2 -- Buscar un elemento por su dni.\n");
   printf("\t3 -- Buscar un elemento por su apellido.\n");
   while ((d=getchar())<'0' || d>'3');
return d;
}
/* Rutina que muestra un elemento en pantalla.
Parametros: struct FICHA *ficha Puntero a la estructura con los datos
a mostrar.
Return: Ninguno. */
void Mostrar(const struct FICHA *ficha)
{
   printf("\n\nDNI: %lu\n",ficha->dni);
   printf("NOMBRE: %s\n",ficha->nombre);
   printf("PRIMER APELLIDO: %s\n",ficha->apellido[0]);
   printf("SEGUNDO APELLIDO: %s\n",ficha->apellido[1]);
   printf("\nPulsa Enter para continuar\n");
   getchar();
}
/* Rutina que busca un elemento dado su dni.
Parametros: FILE *fichero Puntero al fichero de trabajo.
            unsigned long dni Numero de dni a buscar.
            char opcion Opcion de ejecucion, 1 mostrar, 0 no mostrar.
Return: int Codigo de error. */
int BuscarDni(FILE *fichero,const unsigned long dni,const char opcion)
{
struct FICHA ficha;
   fseek(fichero,0L,SEEK_SET);
while (fread(&ficha,sizeof(struct FICHA),1,fichero)==1)
      if (dni==ficha.dni)
{
         if (opcion)
            Mostrar(&ficha);
Return OK;
}
   return ERROR;
}
/* Rutina que busca por apellidos.
Parametros: FILE *fichero Puntero al fichero de trabajo.
            char *apellido Apellido a buscar.
Return: int Codigo de error.*/
81El lenguaje de programación C
int BuscarApellido(FILE *fichero,char *apellido)
{
   struct FICHA ficha;
char encontrado=0;
fseek(fichero,0L,SEEK_SET);
while (fread(&ficha,sizeof(struct FICHA),1,fichero)==1)
      if (!strcmp(apellido,ficha.apellido[0]) ||
         !strcmp(apellido,ficha.apellido[1]))
      {
         Mostrar(&ficha);
         encontrado=1;
      }
   return (encontrado) ? OK : ERROR;
}
/* Rutina que inserta un nuevo elemento en el fichero.
Parametros: FILE *fichero Puntero al fichero de trabajo.
            struct FICHA *ficha Puntero a la ficha a insertar.
Return: int Codigo de error. */
int Insertar(FILE *fichero,const struct FICHA *ficha)
{
   if (BuscarDni(fichero,ficha->dni,0)!=ERROR)
      return ERROR;
   fseek(fichero,0L,SEEK_END);
   fwrite(ficha,sizeof(struct FICHA),1,fichero);
return OK;
}
/* Rutina que pide los datos de una ficha.
Parametros: struct FICHA *ficha Puntero a la ficha que contendra los
datos.
            char opcion Opcion de ejecucion (0..2).
Return: struct FICHA * Puntero a la ficha que contiene los datos. */
struct FICHA *PedirDatos(struct FICHA *ficha,
const char opcion)
{
   switch(opcion)
{
      case 0: printf("\nDNI: ");
         scanf("%lu",&ficha->dni);
fflush(stdin);
break;
case 1: fflush(stdin);
printf("APELLIDO: ");
         strupr(gets(ficha->apellido[1]));
break;
case 2: printf("\nDNI: ");
scanf("%lu",&ficha->dni);
fflush(stdin);
printf("NOMBRE: ");
strupr(gets(ficha->nombre));
printf("PRIMER APELLIDO: ");
         strupr(gets(ficha->apellido[0]));
         printf("SEGUNDO APELLIDO: ");
         strupr(gets(ficha->apellido[1]));
82El lenguaje de programación C
         break;
   }
return ficha;
}
int main(int argc,char *argv[])
{
FILE *fichero;
struct FICHA ficha;
register char d;
if (argc!=2)
{
      printf("\nModo de uso: %s <fichero>\n",argv[0]);
return 1;
}
if ((fichero=fopen(argv[1],"a+b"))==NULL)
{
      printf("\nError creando el fichero: %s\n",argv[1]);
return 1;
}
if (setvbuf(fichero,NULL,_IOFBF,
TAM_BUFFER*sizeof(struct FICHA))!=0)
{
      printf("\nError creando el buffer para %d elementos.\n",
         TAM_BUFFER);
fclose(fichero);
return 1;
}
do
switch(d=Menu())
{
         case '0':break;
case '1':if (Insertar(fichero,PedirDatos(&ficha,2))==ERROR)
                     printf("\nNumero de dni duplicado.\n");
            break;
         case '2':PedirDatos(&ficha,0);
            if (BuscarDni(fichero,ficha.dni,1)==ERROR)
               printf("\nDni no existente.\n");
            break;
         case '3':PedirDatos(&ficha,1);
            if (BuscarApellido(fichero,ficha.apellido[1])==ERROR)
               printf("\nApellido inexistente.\n");
            break;
      }
   while (d!='0');
fclose(fichero);
return 0;
}
B.5 - arbol.c.
/* Programa que lee las palabras de un fichero y las almacena en un
arbol binario */
#include <stdio.h>
 El lenguaje de programación C
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
/* Definicion de la longitud maxima de una palabra */
#define TAM 30
/* Definicion de las estructuras de datos del programa */
struct ARBOL
{
   char pal[TAM+1];
struct ARBOL *izq,*der;
};
/* Rutina que lee una palabra del fichero.
Parametros: FILE *fichero Puntero al fichero de donde se leen las
palabras.
            char *cadena Array de caracteres donde almacenar las
palabras.
Return: char * Puntero a la cadena con la palabra leida, NULL si
error. */
char *LeerPalabra(FILE *fichero,char *cadena)
{
   register char d,i=0;
while ((d=fgetc(fichero))!=EOF && !isalpha(d));
if (d==EOF)
      return NULL;
do
cadena[i++]=d;
while (i<TAM && (isalpha(d=fgetc(fichero)) || isdigit(d) ||
d=='_'));
cadena[i]='\0';
   return cadena;
}
/* Rutina que crea el arbol binario, leyendo para ello el fichero.
Parametros: char *nombre Nombre del fichero a leer.
Return: struct ARBOL * Puntero a la raiz del arbol creado, NULL si
error. */
struct ARBOL *LeerFichero(char *nombre)
{
   FILE *fichero;
   char cadena[TAM+1],insertado;
   int val;
struct ARBOL *cab=NULL,*p,*q;
if ((fichero=fopen(nombre,"rt"))==NULL)
   {
      printf("\nError, no puedo leer el fichero: %s\n",nombre);
      return(NULL);
   }
   while (LeerPalabra(fichero,cadena)!=NULL)
{
      if ((q=(struct ARBOL *)malloc(sizeof(struct ARBOL)))==NULL)
{
84El lenguaje de programación C
         printf("\nError reservando memoria.\n");
         fclose(fichero);
return NULL;
      }
      strcpy(q->pal,cadena);
q->izq=q->der=NULL;
if (cab==NULL)
cab=q;
else
{
p=cab;
insertado=0;
while (!insertado)
            if ((val=strcmp(cadena,p->pal))<0)
               if (p->izq==NULL)
{
                  p->izq=p;
                  insertado=1;
}
else
p=p->izq;
            else
if (val>0)
if (p->der==NULL)
{
                     p->der=q;
insertado=1;
}
else
p=p->der;
               else
insertado=1;
      }
   }
fclose(fichero);
return cab;
}
/* Rutina que muestra por pantalla el arbol ordenado a la vez que
libera la memoria.
Parametros: struct ARBOL *p Puntero al nodo a mostrar.
            unsigned *cont Puntero al contador de elementos para
permitir parar la visualizacion.
Return: Ninguno.
*/
void Mostrar(struct ARBOL *p,unsigned *cont)
{
   if (p->izq!=NULL)
      Mostrar(p->izq,cont);
puts(p->pal);
if (++*cont>21)
{
*cont=1;
printf("\nPulsa Enter para continuar.\n");
getchar();
}
if (p->der!=NULL)
85El lenguaje de programación C
      Mostrar(p->der,cont);
   free(p);
}
int main(int argc,char *argv[])
{
struct ARBOL *p;
unsigned cont=1;
if (argc!=2)
{
      printf("\nModo de uso: %s <fichero>\n",argv[0]);
      return 1;
}
if ((p=LeerFichero(argv[1]))==NULL)
return 1;
printf("\n\n\n\n\n\n");
Mostrar(p,&cont);
   return 0;
}

c++ apendice e y f

A.5 - Asignación dinámica de memoria.
calloc
#include <stdlib.h>
void *calloc(size_t num,size_t tam);
La función calloc() asigna memoria para un array de num objetos, cada uno de
los cuales tiene tamaño tam. La memoria asignada es inicializada con el valor cero. La
función calloc() devuelve un puntero al primer byte de la región asignada. Si no existe
memoria  libre  suficiente  para  satisfacer  la  petición,  se  devuelve  un  puntero  nulo
(NULL).
free
#include <stdlib.h>
void free(void *ptr);
La  función  free() libera  la  memoria  apuntada  por  ptr,  haciendo  que  dicha
memoria este disponible para futuras asignaciones. Solo se debe llamar a free() con un
puntero que haya sido previamente asignado utilizando alguna función de asignación
dinámica.El lenguaje de programación C
malloc
#include <stdlib.h>
void *malloc(size_t tam);
La  función  malloc() devuelve  un puntero  al  primer  byte  de  una  región de
memoria de tamaño tam que se encuentra libre. Si no existe memoria suficiente para
satisfacer la petición, se devuelve un puntero nulo (NULL).
realloc
#include <stdlib.h>
void *realloc(void *ptr,size_t tam);
La función realloc() cambia el tamaño de la memoria apuntada por  ptr al que
esta especificado por  tam. El valor de  tam puede ser mayor o menor que el original.
Devuelve un puntero al  nuevo bloque de memoria,  ya  que puede ser  necesario que
realloc() traslade el bloque de posición al  incrementar  su tamaño. Si  esto sucede,  el
contenido del antiguo bloque se copia en el nuevo bloque, por lo cual, la información
no se pierde.
Si  ptr es un puntero nulo (NULL),  realloc() simplemente asigna  tam bytes de
memoria y devuelve un puntero a dicha memoria. Si tam es cero, la memoria asignada
se libera. Si no existe memoria suficiente para satisfacer la petición, realloc() devuelve
un puntero nulo (NULL), y el bloque de memoria original se deja sin cambiar.
A.6 - Funciones varias.
abs
#include <stdlib.h>
int abs(int num);
La función abs() devuelve el valor absoluto del entero dado por num.
atof
#include <stdlib.h>
double atof(const char *cad);
La función  atof() convierte  la  cadena apuntada  por  cad en un valor  de tipo
double. La cadena debe contener un número valido en coma flotante. En caso contrario
el valor devuelto es indefinido.
El número puede terminar por cualquier carácter que no pueda formar parte de
un  número  válido  en  coma  flotante.  Esto  incluye  espacios  en  blanco,  signos  de
puntuación distintos del punto, y caracteres que no sean E o e. Así si se llama a atof()
con la cadena "100.00HOLA", devolverá el valor 100.00.El lenguaje de programación C
atoi
#include <stdlib.h>
int atoi(const char *cad);
La función atoi() convierte la cadena apuntada por cad en un valor de tipo int.
La  cadena  debe contener  un número entero valido.  Si  no es  este  el  caso,  el  valor
devuelto  es  indefinido,  aunque,  la  mayoría  de  implementaciones  de  la  función
devuelven el valor cero.
El número puede acabar con cualquier carácter que no pueda formar parte de un
número entero.  Esto incluye espacios  en blanco,  signos  de puntuación,  y cualquier
carácter  que no sea la  E o la  e. Esto supone que si  se llama a  atoi() con la cadena
"123.23", devolverá el valor 123.
atol
#include <stdlib.h>
long int atol(const char *cad);
La función atol() convierte la cadena apuntada por cad en un valor de tipo long
int. Para más información consultar la función atoi().
exit
#include <stdlib.h>
void exit(int estado);
La  función  exit() da  lugar  inmediatamente  a  la  terminación  normal  de  un
programa.  El  valor  de  estado se  pasa  al  proceso  que  llamo  a  este  programa,
normalmente el sistema operativo, si el entorno lo soporta. Por convenio, si el valor de
estado es cero, se supone que se ha producido una terminación normal del programa.
Un  valor  distinto  de  cero  puede  utilizarse  para  indicar  un  error  definido  por  la
implementación.
labs
#include <stdlib.h>
long labs(long num);
La función labs() devuelve el valor absoluto de num.
system
#include <stdlib.h>
int system(const char *cad);
La  función  system() pasa  la  cadena  apuntada  por  cad como  una  orden  al
procesador  de ordenes del  sistema operativo.  Si  se llama a  system() con un puntero
nulo (NULL),  devuelve un valor  distinto de cero si  está  presente un procesador  deEl lenguaje de programación C
ordenes, en otro caso, se devuelve un valor distinto de cero. Si  cad no es un puntero
nulo  (NULL),  system() devuelve  el  valor  cero  si  la  orden  ha  sido  correctamente
ejecutada, y un valor distinto de cero en caso contrario.

C++ apendice d

A.4 - Funciones matemáticas.
acos
#include <math.h>
double acos(double arg);
La función acos() devuelve el arcocoseno de arg. El argumento de acos() debe
estar en el rango de -1 a 1, en cualquier otro caso se produce un error de dominio.
asin
#include <math.h>
double asin(double arg);
La función  asin() devuelve el  arcoseno de  arg.  El  argumento de  asin() debe
estar en el rango de -1 a 1, en cualquier otro caso se produce un error de dominio.
atan
#include <math.h>
double atan(double arg);
La función atan() devuelve el arcotangente de arg.
atan2
#include <math.h>
double atan2(double y,double x);
La  función  atan2() devuelve el  arcotangente  de  y/x.  Utiliza  el  signo de sus
argumentos para obtener el cuadrante del valor devuelto.El lenguaje de programación C
ceil
#include <math.h>
double ceil(double num);
La  función  ceil() devuelve  el  menor  entero  mayor  o  igual  que  num y  lo
representa como double. Por ejemplo, dado 1.02, ceil() devuelve 2.0, dado -1.02, ceil()
devuelve -1.0.
cos
#include <math.h>
double cos(double arg);
La función cos() devuelve el coseno de arg. El valor de arg debe venir dado en
radianes.
cosh
#include <math.h>
double cosh(double arg);
La función cosh() devuelve el coseno hiperbólico de arg. El valor de arg debe
venir dado en radianes.
exp
#include <math.h>
double exp(double arg);
La función exp() devuelve el número e elevado a la potencia de arg.
fabs
#include <math.h>
double fabs(double num);
La función fabs() devuelve el valor absoluto de num.
floor
#include <math.h>
double floor(double num);
La función floor() devuelve el mayor entero, representado como double, que no
es mayor que  num. Por ejemplo, dado  1.02,  floor() devuelve  1.0, dado  -1.02,  floor()
devuelve -2.0.El lenguaje de programación C
fmod
#include <math.h>
double fmod(double x,double y);
La función fmod() devuelve el resto de la división entera x/y.
log
#include <math.h>
double log(double num);
La función log() devuelve el logaritmo neperiano de num. Se produce un error
de dominio si num es negativo, y un error de rango si el argumento es cero.
log10
#include <math.h>
double log10(double num);
La función  log10() devuelve el logaritmo en base  10 de  num.  Se produce un
error de dominio si num es negativo, y un error de rango si el argumento es cero.
pow
#include <math.h>
double pow(double base,double exp);
La función pow() devuelve base elevada a exp. Se produce un error de dominio
si  base es  cero y  exp es  menor  o igual  a  cero.  También puede ocurrir  si  base es
negativo y exp no es entero. Un desbordamiento produce un error de rango.
sin
#include <math.h>
double sin(double arg);
La función sin() devuelve el seno de  arg. El valor de  arg debe venir dado en
radianes.
sinh
#include <math.h>
double sinh(double arg);
La función  sinh() devuelve el  seno hiperbólico de  arg.  El  valor  de  arg debe
venir dado en radianes.El lenguaje de programación C
sqrt
#include <math.h>
double sqrt(double num);
La función sqrt() devuelve la raíz cuadrada de num. Si se llama con un número
negativo, se produce un error de dominio.
tan
#include <math.h>
double tan(double arg);
La función tan() devuelve la tangente de arg. El valor de arg debe venir dado en
radianes.
tanh
#include <math.h>
double tanh(double arg);
La función tanh() devuelve la tangente hiperbólica de arg. El valor de arg debe
venir dado en radianes.

c++ apendice c

A.3 - Funciones de cadenas.
memchr
#include <string.h>
void *memchr(const void *buffer,int ch,size_t cuenta);
La  función  memchr() busca  en  buffer la  primera  ocurrencia  de  ch en  los
primeros cuenta caracteres. La función devuelve un puntero a la primera ocurrencia del
carácter ch en buffer. Si no encuentra ch, devuelve un puntero nulo (NULL).
memcmp
#include <string.h>
int memcmp(const void *buf1,const void *buf2,size_t cuenta);
La función  memcmp() compara  los  primeros cuenta  caracteres  de los arrays
apuntados  por  buf1 y  buf2.  La comparación se hace lexicográficamente.  La función
devuelve un entero que es interpretado según se indica a continuación:
Valor devuelto Descripción
Menor que cero buf1 es menor que buf2
Igual a cero buf1 es igual a buf2
Mayor que cero buf1 es mayor que buf2
Tabla A.3.1: Interpretación de los valores devueltos por la función memcmp().
memcpy
#include <string.h>
void *memcpy(void *hacia,const void *desde,size_t cuenta);
La función memcpy() copia cuenta caracteres del array apuntado por desde en el
array apuntado por hacia. Si los arrays se superponen, el comportamiento de memcpy()
queda indefinido. La función devuelve un puntero a hacia.
memset
#include <string.h>
void *memset(void *buf,int ch,size_t cuenta);
La función  memset() copia el  byte menos significativo de  ch en los primero
cuenta caracteres  del  array  apuntado por  buf.  Devuelve  buf.  Su uso más  común es
inicializar una región de memoria con algún valor conocido.
strcat
#include <string.h>
char *strcat(char *cad1,const char *cad2);El lenguaje de programación C
La función strcat() concatena una copia de  cad2 en cad1, y añade al  final de
cad1 un carácter  nulo ('\0'). El carácter  nulo de terminación, que originalmente tenía
cad1, es sustituido por el primer carácter de cad2. La cadena cad2 no se modifica en
esta operación. La función strcat() devuelve cad1.
strchr
#include <string.h>
char *strchr(char *cad,int ch);
La función strchr() devuelve un puntero a la primera ocurrencia del byte menos
significativo de ch en la cadena apuntada por  cad. Si no sucede, devuelve un puntero
nulo (NULL).
strcmp
#include <string.h>
int strcmp(const char *cad1,const char *cad2);
La función strcmp() compara lexicográficamente dos cadenas que finalizan con
el carácter nulo, y devuelve un entero que se interpreta de la siguiente forma:
Valor devuelto Descripción
Menor que cero cad1 es menor que cad2
Igual a cero cad1 es igual a cad2
Mayor que cero cad1  es  mayor  que
cad2
Tabla A.3.2: Interpretación de los valores devueltos por la función strcmp().
strcpy
#include <string.h>
char *strcpy(char *cad1,const char *cad2);
La función  strcpy() se  utiliza  para  copiar  el  contenido de  cad2 en  cad1.  El
elemento cad2 debe ser un puntero a una cadena que finalice con un carácter nulo. La
función devuelve un puntero a cad1.
strlen
#include <string.h>
unsigned int strlen(char *cad);
La función strlen() devuelve el número de caracteres de la cadena apuntada por
cad que finaliza con un carácter nulo. El carácter nulo no se contabiliza.
strtok
#include <string.h>
char *strtok(char *cad1,const char *cad2);El lenguaje de programación C
La función  strtok() devuelve un puntero a la siguiente palabra  de la  cadena
apuntada por cad1. Los caracteres que constituyen la cadena apuntada por cad2 son los
delimitadores que identifican la palabra. Devuelve un puntero nulo (NULL) cuando no
existe ninguna palabra que devolver.
La primera vez que se llama a strtok() se utiliza realmente cad1 en la llamada.
Las llamadas posteriores utilizan un puntero nulo (NULL) como primer argumento.
La función strtok() modifica la cadena apuntada por cad1, pues, cada vez que se
encuentra una palabra,  se pone un carácter  nulo donde esta  el  delimitador.  De esta
forma strtok() puede continuar avanzando por la cadena.

c++ apendice c

A.3 - Funciones de cadenas.
memchr
#include <string.h>
void *memchr(const void *buffer,int ch,size_t cuenta);
La  función  memchr() busca  en  buffer la  primera  ocurrencia  de  ch en  los
primeros cuenta caracteres. La función devuelve un puntero a la primera ocurrencia del
carácter ch en buffer. Si no encuentra ch, devuelve un puntero nulo (NULL).
memcmp
#include <string.h>
int memcmp(const void *buf1,const void *buf2,size_t cuenta);
La función  memcmp() compara  los  primeros cuenta  caracteres  de los arrays
apuntados  por  buf1 y  buf2.  La comparación se hace lexicográficamente.  La función
devuelve un entero que es interpretado según se indica a continuación:
Valor devuelto Descripción
Menor que cero buf1 es menor que buf2
Igual a cero buf1 es igual a buf2
Mayor que cero buf1 es mayor que buf2
Tabla A.3.1: Interpretación de los valores devueltos por la función memcmp().
memcpy
#include <string.h>
void *memcpy(void *hacia,const void *desde,size_t cuenta);
La función memcpy() copia cuenta caracteres del array apuntado por desde en el
array apuntado por hacia. Si los arrays se superponen, el comportamiento de memcpy()
queda indefinido. La función devuelve un puntero a hacia.
memset
#include <string.h>
void *memset(void *buf,int ch,size_t cuenta);
La función  memset() copia el  byte menos significativo de  ch en los primero
cuenta caracteres  del  array  apuntado por  buf.  Devuelve  buf.  Su uso más  común es
inicializar una región de memoria con algún valor conocido.
strcat
#include <string.h>
char *strcat(char *cad1,const char *cad2);El lenguaje de programación C
La función strcat() concatena una copia de  cad2 en cad1, y añade al  final de
cad1 un carácter  nulo ('\0'). El carácter  nulo de terminación, que originalmente tenía
cad1, es sustituido por el primer carácter de cad2. La cadena cad2 no se modifica en
esta operación. La función strcat() devuelve cad1.
strchr
#include <string.h>
char *strchr(char *cad,int ch);
La función strchr() devuelve un puntero a la primera ocurrencia del byte menos
significativo de ch en la cadena apuntada por  cad. Si no sucede, devuelve un puntero
nulo (NULL).
strcmp
#include <string.h>
int strcmp(const char *cad1,const char *cad2);
La función strcmp() compara lexicográficamente dos cadenas que finalizan con
el carácter nulo, y devuelve un entero que se interpreta de la siguiente forma:
Valor devuelto Descripción
Menor que cero cad1 es menor que cad2
Igual a cero cad1 es igual a cad2
Mayor que cero cad1  es  mayor  que
cad2
Tabla A.3.2: Interpretación de los valores devueltos por la función strcmp().
strcpy
#include <string.h>
char *strcpy(char *cad1,const char *cad2);
La función  strcpy() se  utiliza  para  copiar  el  contenido de  cad2 en  cad1.  El
elemento cad2 debe ser un puntero a una cadena que finalice con un carácter nulo. La
función devuelve un puntero a cad1.
strlen
#include <string.h>
unsigned int strlen(char *cad);
La función strlen() devuelve el número de caracteres de la cadena apuntada por
cad que finaliza con un carácter nulo. El carácter nulo no se contabiliza.
strtok
#include <string.h>
char *strtok(char *cad1,const char *cad2);El lenguaje de programación C
La función  strtok() devuelve un puntero a la siguiente palabra  de la  cadena
apuntada por cad1. Los caracteres que constituyen la cadena apuntada por cad2 son los
delimitadores que identifican la palabra. Devuelve un puntero nulo (NULL) cuando no
existe ninguna palabra que devolver.
La primera vez que se llama a strtok() se utiliza realmente cad1 en la llamada.
Las llamadas posteriores utilizan un puntero nulo (NULL) como primer argumento.
La función strtok() modifica la cadena apuntada por cad1, pues, cada vez que se
encuentra una palabra,  se pone un carácter  nulo donde esta  el  delimitador.  De esta
forma strtok() puede continuar avanzando por la cadena.

C++ apendice b

A.2 -Funciones de caracteres.
isalnum
#include <ctype.h>
int isalnum(int ch);
La función isalnum() devuelve un valor distinto de cero si  ch es una letra del
alfabeto o un dígito. En caso contrario, se devuelve un valor distinto de cero.
isalphaEl lenguaje de programación C
#include <ctype.h>
int isalpha(int ch);
La función isalpha() devuelve un valor distinto de cero si  ch es una letra del
alfabeto, en cualquier otro caso devuelve cero.
iscntrl
#include <ctype.h>
int iscntrl(int ch);
La función iscntrl() devuelve un valor distinto de cero si ch se encuentra entre 0
y 0x1F o si ch es igual a 0x7F (tecla DEL), en cualquier otro caso devuelve cero.
isdigit
#include <ctype.h>
int isdigit(int ch);
La función isdigit() devuelve un valor distinto de cero si  ch es un dígito (0..9),
en cualquier otro caso devuelve el valor cero.
isgraph
#include <ctype.h>
int isgraph(int ch);
La  función  isgraph() devuelve  un valor  distinto  de  cero si  ch es  cualquier
carácter imprimible distinto del espacio, en cualquier otro caso devuelve cero.
islower
#include <ctype.h>
int islower(int ch);
La función  islower() devuelve un valor  distinto de cero si  ch es una carácter
minúscula, en cualquier otro caso devuelve cero.
isprint
#include <ctype.h>
int isprint(int ch);
La  función  isprintf() devuelve  un valor  distinto  de  cero  si  ch es  cualquier
carácter imprimible, incluyendo el espacio, en cualquier otro caso devuelve cero.
ispunct
#include <ctype.h>El lenguaje de programación C
int ispunct(int ch);
La función ispunct() devuelve un valor distinto de cero si  ch es un carácter de
puntuación, excluyendo el espacio, en cualquier otro caso devuelve el valor cero.
isspace
#include <ctype.h>
int isspace(int ch);
La función  isspace() devuelve un valor  distinto de cero si  ch es un espacio,
tabulador, o carácter de salto de línea, en cualquier otro caso devuelve el valor cero.
isupper
#include <ctype.h>
int isupper(int ch);
La  función  isupper() devuelve  un valor  distinto  de  cero si  ch es  una  letra
mayúscula, en cualquier otro caso devuelve cero.
isxdigit
#include <ctype.h>
int isxdigit(int ch);
La  función  isxdigit() devuelve  un valor  distinto  de  cero si  ch es  un dígito
hexadecimal, en cualquier otro caso devuelve cero. Un dígito hexadecimal está en uno
de estos rangos: 0 hasta 9, A hasta F y a hasta f.
tolower
#include <ctype.h>
int tolower(int ch);
La función tolower() devuelve el equivalente en minúscula de ch, si  ch es una
letra mayúscula, en cualquier otro caso se devuelve ch sin modificar.
toupper
#include <ctype.h>
int toupper(int ch);
La función toupper() devuelve el equivalente en mayúsculas de ch, si ch es una
letra minúscula, en cualquier otro caso se devuelve ch sin modificar.

C++ apendice a

Apéndice A - Funciones de biblioteca del
standard ANSI de C.
Antes de comenzar  a describir  las funciones de biblioteca del  standard ANSI de C,
unos pequeños comentarios:
Existen muchas mas funciones de las aquí  descritas,  pero este pequeño conjunto de
funciones  es  lo suficientemente amplio como para  que puedan realizarse  todas  las
operaciones necesarias.
Las funciones se encuentran clasificadas de acuerdo a la función que realizan (entrada/
salida de datos, etc.), con el fin de facilitar su uso.
Las funciones se presentan de la siguiente forma:
Nombre de la función: fclose
Fichero de includes donde se encuentra su prototipo: #include <stdio.h>
Formato de la función: int fclose(FILE *f);
Breve descripción de la función.
A.1 - Funciones de entrada y salida de datos.
fclose
#include <stdio.h>
int fclose(FILE *f);
La función fclose() cierra el archivo asociado a la variable f y vuelca su buffer
al disco. Después de un fclose(), la variable f queda desligada del archivo y cualquier
buffer que tuviera asignado se libera. Si fclose() se ejecuta de forma correcta, devuelve
el valor cero, en cualquier otro caso devuelve un valor distinto de cero.
feof
#include <stdio.h>
int feof(FILE *f);
La  función  feof() comprueba  el  indicador  de  posición  del  archivo  para
determinar si  se ha alcanzado el final  del archivo asociado a  f. Un valor distinto de
cero supone que el indicador de posición del archivo esta en el final del mismo, en caso
contrario se devuelve el valor cero.
ferror
#include <stdio.h>
int ferror(FILE *f);El lenguaje de programación C
La función ferror() comprueba si existen errores en alguna operación realizada
sobre el archivo asociado a f. Un valor devuelto de cero indica que no hay errores, un
valor  distinto  de  cero  indica  la  existencia  de  errores.  Los  indicadores  de  error
asociados  a  f permanecen activos  hasta  que  se  cierra  el  archivo o se  llama  a  las
funciones rewind() o perror().
fflush
#include <stdio.h>
int fflush(FILE *f);
La función fflush() vacía el buffer asociado a la variable f. Si el archivo ha sido
abierto para escritura,  fflush() vacía el contenido del buffer de salida en el archivo. Si
el archivo ha sido abierto para lectura, fflush() tan solo vacía el contenido del buffer de
entrada. Un valor de cero indica que el buffer se ha vaciado de forma correcta, un valor
distinto de cero indica un error. Todos los buffers se vuelcan automáticamente cuando
un programa termina de forma correcta,  cuando están llenos,  o cuando se cierra el
archivo (ver fclose()).
fgetc
#include <stdio.h>
int fgetc(FILE *f);
La función fgetc() devuelve el carácter  del archivo de entrada asociado a  f, e
incrementa el indicador de posición del archivo. El carácter se lee como unsigned char
y  se  convierte  a  int,  por  lo cual  no existe  ningún problema  en asignarle  el  valor
devuelto por fgetc() a una variable de tipo carácter (char).
fgets
#include <stdio.h>
char *fgets(char *cad,int num,FILE *f);
La  función  fgets() lee  como  máximo  hasta  num-1 caracteres  del  archivo
asociado a f y los sitúa en el array apuntado por cad. Los caracteres se leen hasta que
se recibe un carácter de salto de linea, un EOF (fin de fichero) o hasta que se llega al
limite  especificado.  Después  de  leídos  los  caracteres,  se  pone automáticamente  un
carácter  de nulo inmediatamente después del  ultimo carácter  leído.  Si  se termina la
lectura por un carácter de salto de linea, dicho carácter se guarda como parte de cad. Si
tiene éxito, fgets() devuelve un puntero a la dirección de cad. En caso de error devuelve
un puntero nulo (NULL).
fopen
#include <stdio.h>
FILE *fopen(const char *nombre,const char *modo);
La  función  fopen() abre  un archivo cuyo nombre viene dado por  nombre y
devuelve un puntero a una estructura de tipo FILE que se le asocia en la apertura. ElEl lenguaje de programación C
tipo de operaciones permitidas en el archivo están definidas por el valor de modo. Los
valores permitidos de modo son:
Modo Descripción
r Abrir un archivo para lectura.
w Crear un archivo para escritura.
a Abrir un archivo para añadir.
rb Abrir un archivo binario para lectura.
wb Crear un archivo binario para escritura.
ab Abrir un archivo binario para añadir.
rt Abrir un archivo de texto para lectura.
wt Crear un archivo de texto para escritura.
at Abrir un archivo de texto para añadir.
r+ Abrir una archivo para lectura/escritura.
w+ Crear un archivo para lectura/escritura.
a+ Abrir un archivo para leer/añadir.
r+b Abrir un archivo binario para lectura/escritura.
w+b Crear un archivo binario para lectura/escritura.
a+b Abrir un archivo binario para leer/añadir.
r+t Abrir un archivo de texto para lectura/escritura.
w+t Crear un archivo de texto para lectura/escritura.
a+t Abrir un archivo de texto para leer/añadir.
Tabla A.1.1: Modos de apertura de un fichero con la función fopen().
Si fopen() tiene éxito en abrir el archivo, devuelve un puntero de tipo FILE, en
caso contrario devuelve un puntero nulo (NULL).
fprintf
#include <stdio.h>
int fprintf(FILE *f,const char *formato,...);
La  función  fprintf() escribe  en  el  archivo  asociado  a  f los  valores  de  los
argumentos que componen su lista  de argumentos según se especifica en la cadena
formato.  Devuelve  un  número  que  indica  el  número  de  caracteres  escritos.  Si  se
produce  un  error  se  devuelve  un  valor  negativo.  Para  una  explicación  sobre  sus
argumentos consúltese la función printf().
fputc
#include <stdio.h>
int fputc(int c,FILE *f);
La  función  fputc() escribe  el  carácter  especificado  por  c en  el  archivo
especificado por f a partir de la posición actual  del archivo, y entonces incrementa el
indicador de posición del archivo. Aunque c tradicionalmente se declara de tipo int, es
convertido por  fputc() a  unsigned char, por lo cual  en lugar  de un int se puede usar
como argumento un char o unsigned char. Si se utiliza un int, la parte alta del mismoEl lenguaje de programación C
será ignorada y no se escribirá.  Si  se ejecuta de forma correcta,  fputc() devuelve el
valor c, en caso de error devuelve el valor EOF.
fputs
#include <stdio.h>
int fputs(const char *cad,FILE *f);
La función fputs() escribe el contenido de la cadena de caracteres apuntada por
cad en el archivo especificado por f. El carácter nulo de terminación de la cadena no es
escrito. En caso de error fputs() devuelve el valor EOF.
fread
#include <stdio.h>
int fread(void *buf,size_t tam,sise_t cuenta, FILE *f);
La función fread() lee cuenta numero de elementos, cada uno de ellos de  tam
bytes de longitud, del archivo asociado a la variable f, y los sitúa en el array apuntado
por  buf.  El  indicador  de posición del  archivo se incrementa en el  número de bytes
leídos. La función fread() devuelve el número de elementos realmente leídos. Si se leen
menos elementos de los pedidos en la llamada se produce un error. La función fread()
funciona de forma correcta en archivos abiertos en modo binario; en archivos abiertos
en modo texto, pueden producirse ciertos cambios de caracteres (salto de carro seguido
de salto de linea se convierte en salto de linea, etc.).
fscanf
#include <stdio.h>
int fscanf(FILE *f,const char *formato,...);
La función fscanf() lee del archivo asociado a la variable f de igual forma que la
función  scanf() lo realiza del  teclado.  Devuelve el numero de argumentos a los que
realmente  se  asigna  valores.  Este  número no incluye  los  campos  ignorados.  Si  se
produce un error antes de realizar la primera asignación se devuelve el valor EOF. Para
mas información consultar la función scanf().
fseek
#include <stdio.h>
#int fseek(FILE *f,long desp,int origen);
La función  fseek() coloca el  indicador  de posición del  archivo asociado a la
variable f de acuerdo a los valores dados por origen y desp. Su objetivo es dar soporte
a las operaciones de E/S de acceso directo.  El valor de  origen debe ser una de estas
constantes, definidas en stdio.h:
Origen Nombre de la constante Valor
Comienzo del archivo SEEK_SET 0
Posición actual SEEK_CUR 1El lenguaje de programación C
Final del archivo SEEK_END 2
Tabla A.1.2: Valores del origen en la función fseek().
La función fseek() devuelve un valor de cero si sucede correctamente, en caso
contrario el valor devuelto es distinto de cero.
Puede utilizarse  fseek() para  mover  el  indicador  de posición en el  archivo a
cualquier  lugar  del  mismo,  incluso mas  alla  del  final  del  mismo,  pero es  un error
intentar situarse antes del comienzo del archivo.
ftell
#include <stdio.h>
long ftell(FILE *f);
La función ftell() devuelve el valor actual del indicador de posición del archivo
asociado a la variable f. Para archivos binarios, el valor devuelto es el número de bytes
desde el principio del archivo. Para archivos de texto solo debe usarse como argumento
para la función fseek(), ya que, debido a que secuencias de caracteres como retorno de
carro y salto de línea pueden sustituirse por un salto de línea, el tamaño aparente del
archivo puede variar. Si falla la función ftell() devuelve el valor -1L.
fwrite
#include <stdio.h>
int fwrite(const void *buf,size_t tam,size_t cuenta,FILE *f);
La función fwrite() escribe  cuenta numero de elementos, cada uno de ellos de
tam bytes de longitud, del array apuntado por buf al archivo asociado a la variable f. El
indicador  de posición del  archivo se incrementa en el  número de bytes  escritos.  La
función  fwrite() devuelve el  número de elementos realmente escritos.  Si  se escriben
menos elementos de los pedidos en la llamada se produce un error. La función fwrite()
funciona de forma correcta en archivos abiertos en modo binario; en archivos abiertos
en modo texto, pueden producirse ciertos cambios de caracteres (salto de carro seguido
de salto de linea se convierte en salto de linea, etc.).
getc
#include <stdio.h>
int getc(FILE *f);
La función  getc() devuelve del  archivo de entrada asociado a la variable  f el
siguiente carácter  desde la posición actual  e incrementa el indicador de posición del
archivo. El carácter se lee como unsigned char y se transforma en un int. Si se alcanza
el final  de archivo devuelve el carácter  EOF. Debido a que  EOF es un valor valido
para  archivos  abiertos  en  modo  binario,  debe  utilizarse  la  función  feof() para
comprobar el final del fichero en dichos archivos.
getsEl lenguaje de programación C
#include <stdio.h>
char *gets(char *cad);
La función gets() lee caracteres desde stdin (entrada standard, normalmente el
teclado),  y los sitúa en el  array de caracteres  apuntado por  cad.  Se leen caracteres
hasta que se recibe un carácter de salto de línea o una marca de EOF. El carácter de
terminación  se  transforma,  automáticamente,  en  el  carácter  nulo  para  terminar  la
cadena. Si se ejecuta correctamente, gets() devuelve un puntero a cad. En caso de error
se devuelve un puntero nulo (NULL).  No existe límite al  número de caracteres que
leerá  gets(),  por  lo  cual  le  corresponde  al  programador  asegurarse  de  que  no  se
sobrepasa el tamaño del array apuntado por cad.
perror
#include <stdio.h>
int perror(const char *cad);
La función perror() convierte el valor de la variable global errno en una cadena
de caracteres y escribe esta cadena en stderr (salida standard de error). Si el valor de
cad no es nulo (NULL), se escribe primero la cadena apuntada por cad, seguida de dos
puntos y el mensaje de error asociado.
printf
#include <stdio.h>
int printf(const char *formato,...);
La función printf() escribe en stdout (salida standard, generalmente la pantalla),
los  argumentos  que componen la  lista  de argumentos  bajo el  control  de la  cadena
apuntada  por  formato.  La  cadena  apuntada  por  formato consta  de  dos  tipos  de
elementos.  El  primer  tipo  esta  constituido  por  los  caracteres  que  se  mostraran  en
pantalla.  El segundo tipo contiene las ordenes de formato que describen la forma en
que se muestran los argumentos. Una orden de formato comienza por el signo %, y le
sigue el código de formato. Las ordenes de formato son:
Especificador Descripción
%c Carácter.
%d Enteros decimales con signo.
%i Enteros decimales con signo.
%e Punto flotante en notación científica (e minúscula).
%E Punto flotante en notación científica (E mayúscula).
%f Punto flotante.
%g Usar el más corto de %e y %f.
%G Usar el más corto de %E y %f.
%o Octal sin signo.
%s Cadena de caracteres.
%u Enteros decimales sin signo.
%x Hexadecimales sin signo (letras minúsculas).El lenguaje de programación C
%X Hexadecimales sin signo (letras mayúsculas).
%p Mostrar un puntero.
%n El argumento asociado es un puntero a un entero, el cual  recibirá el
número de caracteres escritos.
%% Imprimir el signo %.
Tabla A.1.3: Especificadores de formato de la función printf().
Existen ademas  los  modificadores  h (short),  l (long)  y  L.  El  modificador  h
(short) se puede aplicar a los tipos d,  i,  o,  u.,  x y X, y le dice que el tipo de datos es
short int o unsigned short int según el caso. El modificador l (long), se puede aplicar a
los casos anteriores, significando que el tipo de datos es long int o unsigned long int,
pero, además, se puede aplicar a los tipos e, E, f y g, indicando que el tipo de datos es
double. El modificador L se puede aplicar a los tipos e, E, f y g, y dice que el tipo de
datos es long double.
La función  printf() devuelve el  número de caracteres  realmente escritos.  Un
valor negativo indica que se ha producido un error.
putc
#include <stdio.h>
int putc(int c,FILE *f);
La función putc() escribe el carácter contenido en el byte menos significativo
de  c en  el  archivo  apuntado  por  f.  Dado  que  los  argumentos  de  tipo  char son
transformados  en argumentos  de tipo  int en el  momento de  la  llamada,  se  pueden
utilizar  variables  de  tipo  char para  el  argumento  c de  putc().  La  función  putc()
devuelve el carácter escrito. En caso de error devuelve EOF, y, dado que EOF es un
valor  valido en archivos abiertos  en modo binario,  se recomienda en dicho tipo de
archivos el uso de la función ferror() para la comprobación de errores.
puts
#include <stdio.h>
int puts(char *cad);
La función puts() escribe la cadena apuntada por cad en el dispositivo de salida
standard.  El carácter  nulo de terminación de cadena se transforma en un carácter  de
salto de línea.  Si  tiene éxito,  se devuelve un valor no negativo.  En caso de error se
devuelve el valor EOF.
rewind
#include <stdio.h>
void rewind(FILE *f);
La función rewind() mueve el indicador de posición del archivo apuntado por f
al principio del mismo. La función rewind() inicializa también los indicadores de error
y de fin de archivo asociados a la variable f. Ningún valor es devuelto.El lenguaje de programación C
scanf
#include <stdio.h>
int scanf(const char *formato,...);
La  función  scanf() es  una  rutina  de  propósito  general  que  lee  de  stdin
(dispositivo standard de entrada, normalmente el teclado). Puede leer los tipos de datos
que haya y transformarlos en el formato interno adecuado. Es la inversa de la función
printf().  La  cadena  de  control  especificada  por  formato consiste  en tres  clases  de
caracteres:
• Especificadores de formato.
• Caracteres de espacio en blanco.
• Caracteres que no sean espacios en blanco.
Los especificadores de formato de entrada están precedidos por el signo %, y dicen
a  scanf() que tipo de datos  van a ser  leídos a continuación.  Los especificadores de
formato validos son:
Especificador Descripción.
%c Leer un único carácter.
%d Leer un entero decimal.
%i Leer un entero decimal.
%e Leer un número en punto flotante.
%f Leer un número en punto flotante.
%g Leer un número en punto flotante.
%o Leer un número octal.
%s Leer una cadena de caracteres.
%x Leer un número hexadecimal.
%p Leer un puntero.
%n Recibe  un  valor  igual  al  número  de  carácter
leídos.
%u Leer un entero sin signo.
Tabla A.1.4: Especificadores de formato de la función scanf().
Además,  es posible utilizar  los modificadores  h (short),  l (long) y  L de igual
forma que en la función printf().
Un espacio en blanco en la cadena de control da lugar a que scanf() salte sobre
uno o mas espacios de la cadena de entrada, un espacio en blanco puede ser un espacio,
un tabulador o un salto de línea. Además, un espacio en blanco da lugar,  también, a
que scanf() lea, pero no guarde cualquier número de espacios en blanco, incluso cero.
Un carácter que no sea espacio en blanco, da lugar a que scanf() lea y elimine el
carácter  asociado.  Por  ejemplo,  %d:%d da  lugar  a  que  scanf() lea  primero un  int,
después lea, y descarte, los dos puntos, y luego lea otro int. Si el carácter especificado
no se encuentra, scanf() termina su ejecución.El lenguaje de programación C
Todas las variables utilizadas para recibir valores a través de scanf() deben ser
pasadas  por  referencia,  o sea,  por  sus direcciones.  Esto supone que los argumentos
deben ser punteros a las funciones.
La presencia del signo * después del signo % y antes del código del formato,
produce que scanf() lea, pero no asigne el valor leído a ninguna variable, por ejemplo:
scanf("%d%*c%d",&x,&y);
Provoca, si la entrada es 10/20, que se le asigne el valor  10 a la variable x, se
lea y descarte el signo /, y después se asigne el valor 20 a la variable y.
La  función  scanf() devuelve  un  número  igual  al  de  campos  que  han  sido
asignados correctamente, este número no incluye los campos que fueron leídos, pero
no asignados, utilizando el modificador * para eliminar la asignación.
setbuf
#include <stdio.h>
void setbuf(FILE *f, char *buf);
La función setbuf() se utiliza para determinar el buffer del archivo asociado a la
variable f que se utilizara, o bien, si se llama con buf a nulo (NULL), para desactivar el
buffer. Si un buffer va a ser definido por el programador, su tamaño debe ser BUFSIZ,
siendo  BUFSIZ una constante definida en el  archivo  stdio.h.  La función  setbuf() no
devuelve ningún valor.
setvbuf
#include <stdio.h>
int setvbuf(FILE *f,char *buf,int modo,.size_t tam);
La función setvbuf() permite al programador especificar el buffer, el tamaño y
el modo para el archivo asociado a la variable f. El array de caracteres apuntado por
buf se utiliza como buffer de f para las operaciones de entrada y salida. Si buf es nulo
(NULL),  setvbuf() creara su propio buffer, de tamaño tam, mediante una llamada a la
función malloc(). El tamaño del buffer se fija mediante el valor de tam, que debe ser
siempre mayor  de cero.  La variable  modo determina el  uso del  buffer.  Los valores
legales de modo, definidos en stdio.h, son:
Modo Descripción
_IOFBF Modo normal, el buffer se vacía solo cuando se llena (en escritura), o bien,
cuando ya se ha leído todo su  contenido (en lectura).
_IOLBF Igual al anterior, solo que el buffer también se vacía cuando se lee o escribe
un retorno de carro.
_IONBF Desactiva el buffer.
Tabla A.1.5: Valores del modo en la función setvbuf().El lenguaje de programación C
La función setvbuf() devuelve un valor de cero si se ejecuta con éxito. En caso
de error, un valor distinto de cero será devuelto.
sprintf
#include <stdio.h>
int sprintf(char *buf,const char *formato,...);
La  función  sprintf() es  idéntica  a  la  función  printf(),  excepto  que la  salida
generada se sitúa en el array apuntado por buf. El valor devuelto por la función es igual
al  número de caracteres realmente situados en el array.  Para una mayor explicación
refiérase a la función printf().
sscanf
#include <stdio.h>
int sscanf(const char *buf,const char *formato,...);
La función sscanf() es idéntica a la función scanf(), excepto que los datos son
leídos del array apuntado por buf. El valor devuelto por la función es igual al número
de campos que hubieran sido realmente asignados. Este número no incluye los campos
que  fueron saltados  al  utilizar  el  modificador  de  ordenes  de  formato  *.  Para  más
detalles vea la función scanf().
ungetc
#include <stdio.h>
int ungetc(int c,FILE *f);
La  función  ungetc() devuelve  el  carácter  especificado  por  el  byte  menos
significativo  de  c al  archivo especificado  por  f.  Este  carácter  será  devuelto  en la
siguiente  operación de lectura  sobre el  archivo.  Una llamada  a  fflush() o a  fseek()
deshace  una  operación  ungetc() y  deshecha  el  carácter  previamente  devuelto  a  la
secuencia de entrada.  No se debe usar  ungetc() sobre una marca de  EOF.  El  valor
devuelto por la función es igual a c, si la función ha tenido éxito, e igual a EOF, si ha
fallado.

C++ cap 11

Tema 11 - Asignación dinámica de memoria.
Antes de empezar con el desarrollo del tema, es necesario aclarar que el mismo
no pretende explicar las estructuras de datos dinámicas, sino tan solo dar unas ligeras
nociones básicas sobre la posibilidad de asignar memoria de forma dinámica, esto es,
en tiempo de ejecución, y por tanto de crear nuevas variables.
Las  funciones  que  realizan  un  manejo  activo  de  la  memoria  del  sistema
requieren  todas  ellas  para  su  correcto  funcionamiento  la  inclusión,  mediante  la
directiva del prepocesador #include del archivo de cabecera <stdlib.h>.
11.1 - Reserva dinámica de memoria.
En C, la reserva dinámica de memoria se realiza mediante el uso de funciones,
existen  varias  funciones  de  reserva  de  memoria  (ver  apéndice  A),  pero  aquí  solo
explicaremos la reserva dinámica de memoria mediante la función malloc(). La función
malloc() tiene la forma:
void *malloc(unsigned num_bytes);
Siendo  num_bytes el  número  de  bytes  que  se  desean  reservar.  La  función
malloc() devuelve un puntero al tipo de datos void (sin tipo). Dicho puntero puede ser
asignado  a  una  variable  puntero  de  cualquier  tipo  base  mediante  una  conversión
forzada de tipo de datos (casts). Veamos un ejemplo:
int *a;
a=(int *)malloc(sizeof(int));
Y ahora podríamos realizar la siguiente asignación:
*a=3;
La función  malloc(),  y en general,  cualquier  función de reserva dinámica de
memoria,  devuelve  un  puntero  nulo  (NULL)  si  la  reserva  de  memoria  no  puede
realizarse,  generalmente por falta  de memoria disponible.  Por  ello,  antes de usar  un
puntero  devuelto  por  la  función  malloc() o por  cualquier  otra  función de  reserva
dinámica  de  memoria  es  imprescindible,  con el  fin de  evitar  posibles  fallos  en la
ejecución del  programa,  comprobar  que dicho puntero no es nulo (NULL).  Veamos
algunos ejemplos de reserva dinámica de memoria:
float *a;
a=(float *)malloc(sizeof(float));
if (a==NULL) exit(0); /* Salimos del programa */
unsigned long int*b;
if ((b=(unsigned long int)malloc(sizeof(unsigned long int)))==NULL)
   exit(0); /* Salimos del programa */
struct ALFA{El lenguaje de programación C
   unsigned a;
float b;
int *c;
}*d;
if ((d=(struct ALFA *)malloc(sizeof(struct ALFA)))==NULL)
exit(0); /Salimos del programa */
11.2 - Liberación dinámica de memoria.
La memoria dinámica reservada es eliminada siempre al terminar la ejecución
del programa por el propio sistema operativo. Sin embargo, durante la ejecución del
programa puede ser  interesante,  e incluso necesario,  proceder  a  liberar  parte  de la
memoria  reservada  con  anterioridad  y  que  ya  ha  dejado  de  ser  necesario  tener
reservada.  Esto puede realizarse mediante la función free(). La función free() tiene la
forma:
void free(void *p);
Donde p es la variable de tipo puntero cuya zona de memoria asignada de forma
dinámica queremos liberar. Veamos un ejemplo de liberación de memoria:
int *a;
if ((a=(int *)malloc(sizeof(int)))==NULL)
   exit(0); /* Salimos del programa */
......
free(a);
Un aspecto a tener en cuenta es el hecho de que el puntero a liberar no debe
apuntar a nulo (NULL), pues en tal caso se producirá un fallo en el programa. Es por
ello que cobra aún más sentido la necesidad de comprobar  al  reservar  memoria de
forma dinámica que la reserva se ha realizado de forma correcta, tal y como se explico
en el apartado anterior.
11.3  -  Ejemplo  de  asignación  y  liberación  dinámica  de
memoria.
Vamos a ver un sencillo ejemplo práctico de como asignar y liberar memoria.
Para ello construiremos las funciones necesarias para crear, manejar y liberar de forma
dinámica una lista ligada.
En primer  lugar,  definiremos la estructura  de datos  necesaria para  ello.  Esta
estructura de datos es:
struct LISTA{
   tipo dato;
   struct LISTA *sig;
};
Donde tipo es cualquier tipo de datos valido (float, int, long int, etc.)El lenguaje de programación C
Las variables necesarias para crear la lista son las siguientes:
struct LISTA *cabeza=NULL,*p;
tipo dato;
El código de la función de creación de la lista, con inserción por la cabeza:
struct LISTA *CrearLista(struct LISTA *cabeza,tipo dato)
{
   struct LISTA *p;
   if ((p=(struct LISTA *)malloc(sizeof(struct LISTA)))==NULL)
      exit(0); /* Salimos del programa */
   p->dato=dato;
   p->sig=cabeza;
   return p;
}
Siendo la llamada para la creación de la forma:
cabeza=CrearLista(cabeza,dato);
La función para obtener un elemento de la lista es:
struct LISTA *BuscarLista(struct LISTA *p,tipo dato)
{
   while (p!=NULL && p->dato!=dato)
      p=p->sig;
return p;
}
Siendo la llamada de la forma:
if ((p=BuscarLista(cabeza,dato))!=NULL)
   /* El elemento ha sido encontrado */
Y por último, la función para liberar un elemento de la memoria es:
struct LISTA *LiberarLista(struct LISTA *cabeza,tipo dato)
{
   struct LISTA p,q;
   if (cabeza!=NULL)
   {
      p=cabeza;
      if (cabeza->dato==dato)
         cabeza=cabeza->sig;
      else
         while (p!=NULL && p->dato!=dato)
{
            q=p;
p=p->sig;
}
      if (p!=NULL)
{El lenguaje de programación C
         q->sig=p->sig;
free(p);
      }
   }
return cabeza;
}
Siendo la llamada:
cabeza=LiberarLista(cabeza,dato);

C++ cap 10

Tema 10 - Entrada y salida.
Antes de empezar a explicar la entrada y salida en C, es necesario realizar dos
pequeños comentarios:
En primer lugar, para el correcto funcionamiento de la entrada y salida en C, y
dado que las funciones de E/S, estructuras de datos usadas por esas funciones, etc., se
encuentran declaradas en el archivo de cabecera <stdio.h>, es necesario incluir dicho
archivo,  mediante la directiva del  preprocesador  #include,  para que la E/S funcione
correctamente, pues en caso contrario, puede funcionar de forma incorrecta, e incluso,
puede llegar a dar errores de compilación.
En segundo lugar,  aparte de la E/S por consola y la E/S de fichero mediante
buffer  intermedio,  que serán explicadas  en este tema,  existe  una E/S de fichero sin
buffer  intermedio,  proveniente  de  la  primitiva  implementación  de  C en  máquinas
UNIX.,  y  que  el  standard  ANSI  de  C no  ha  estandarizado,  por  lo  cual,  no  es
recomendable su uso. Por este motivo, y dada su similitud en la mayoría de apartados
con el sistema de E/S de fichero mediante buffer intermedio, no será explicado en el
presente tema.
10.1 - Entrada y salida desde consola.
La entrada y salida desde consola se refiere a las operaciones que se producen
en el  teclado y la pantalla  del  ordenador.  Dichos dispositivos  son automáticamente
abiertos  y cerrados  al  comenzar  y terminar  el  programa,  por  lo cual,  no deben ser
abiertos ni cerrados por el propio programa.  Existen,  básicamente, seis funciones de
entrada y salida desde consola, tres de entrada y tres de salida. Veámoslas:
La función getchar(), lee un carácter desde el teclado. Dicha función se define
como:
int getchar(void);
Dicha función lee caracteres, de uno en uno, desde el teclado, esperando, para
leer  los caracteres,  la pulsación de un retorno de carro.  Es por  ello que es posible
escribir  varios  caracteres  antes  de  que  se  ninguno de  ellos  sea  leído.  La  función
getchar() hace eco en pantalla del carácter leído. En caso de error devuelve EOF.
La función  putchar() escribe un carácter  a  la  pantalla  del  ordenador.  Dicha
función se define como:
int putchar(int c);
La función putchar(), si sucede de forma correcta, devuelve el carácter escrito.
En caso de error devuelve el carácter EOF.
Veamos un ejemplo de uso de getchar() y putchar():El lenguaje de programación C
#include <stdio.h>
int main(void)
{
   char ch;
do
{
      ch=getchar();
putchar(ch);
}
while (ch!='e' && ch!='E');
return 0;
}
Este  programa  lee  todas  las  teclas  pulsadas  en el  teclado,  y  las  coloca  en
pantalla, hasta leer una 'e' o una 'E'. Obsérvese que solo lee las teclas después de pulsar
un retorno de carro.
La función gets() lee un string desde el teclado. La función se define como:
char *gets(char *s);
La función gets() lee un string desde el teclado hasta que se pulsa un retorno de
carro.  El string es almacenado en la variable  s, y el retorno de carro leído desde el
teclado  es,  automáticamente,  reemplazado  por  un carácter  de  final  de  string ('\0').
Devuelve un puntero a la variable  s si  sucede de forma correcta,  y  NULL en caso
contrario.  La  función  gets() permite  corregir  errores  de  teclado usando la  tecla  de
retroceso antes de pulsar el retorno de carro.
La función puts() escribe un string en pantalla. La función se define como:
int puts(const char *s);
La función puts() escribe en pantalla el string almacenado en s, y añade al final
un retorno de carro.  Devuelve un entero no negativo si  sucede de forma correcta,  y
EOF en caso de error.
Veamos un ejemplo de uso de gets() y puts():
#include <stdio.h>
#define TAM 100
int main(void)
{
   char cadena[TAM];
   puts("Introduce una cadena:");
   gets(cadena);
return 0;
}El lenguaje de programación C
La función scanf() se usa para leer cualquier tipo de dato predefinido desde el
teclado, y convertirlo, de forma automática, al formato interno adecuado. La función se
define como:
int scanf(const char *formato[,dirección,...]);
El  string  formato es  la  cadena  de control  que indica  los  datos  a  leer.  Dicha
cadena de control consta de tres clases de caracteres:
• Especificadores de formato.
• Caracteres de espacio en blanco.
• Caracteres que no sean espacios en blanco.
Los especificadores de formato están precedidos por  el  signo  %,  y dicen a la
función que tipo de datos  van a  ser  leídos  a  continuación.  Los  especificadores  de
formato validos son:
Especificado
r
Descripción.
%c Leer un único carácter.
%d Leer un entero decimal.
%i Leer un entero decimal.
%e Leer un número en punto flotante.
%f Leer un número en punto flotante.
%g Leer un número en punto flotante.
%o Leer un número octal.
%s Leer una cadena de caracteres.
%x Leer un número hexadecimal.
%p Leer un puntero.
%n Recibe un valor igual al número de carácter leídos.
%u Leer un entero sin signo.
Tabla 10.1.1: Especificadores de formato de la función scanf().
Además,  es  posible  utilizar  los  modificadores  h  (short),  l  (long) y  L.  El
modificador  h se puede aplicar a los tipo d, i, o, u y x, e indica que el tipo de dato es
short int o  unsigned short int según el caso.  El modificador  l se puede aplicar  a los
casos anteriores,  indicando que el tipo de dato es  long int o unsigned long int, pero,
además, se puede aplicar a los tipos e, f y g, indicando, en tal caso, que el tipo de dato
es double. Por último, el modificador L se puede aplicar a los tipos e, f y g, e indica que
el tipo de dato es long double.
Los caracteres de espacio en blanco en la cadena de control  dan lugar  a que
scanf() lea y salte sobre cualquier número (incluido cero) de espacios en blanco. Un
espacio en blanco es, además del carácter espacio, un tabulador o un salto de línea.
Un carácter que no sea espacio en blanco da lugar a que scanf() lea y elimine el
carácter  asociado.  Por  ejemplo,  %d:%d da  lugar  a  que  scanf() lea  primero un  int,El lenguaje de programación C
después lea, y descarte, los dos puntos, y luego lea otro int. Si el carácter especificado
no se encuentra, scanf() termina su ejecución.
Todas las variables utilizadas para recibir valores (si son necesarias), deben ser
pasadas por "referencia", o sea, por sus direcciones. Esto supone que los argumentos
deben ser punteros a las variables.
La presencia del signo * después del signo % y antes del código del formato
produce que scanf() lea, pero no asigne el valor leído a ninguna variable. Por ejemplo:
int x,y;
scanf("%d%*c%d",&x,&y);
Provoca que, si la entrada es 10/20, se le asigne el valor  10 a la variable x, se
lea, y se descarte el signo /, y después se asigne el valor 20 a la variable y.
La  función  scanf() devuelve  un  número  igual  al  de  campos  que  han  sido
asignados correctamente, este número no incluye los campos que fueron leídos, pero
no asignados, utilizando el modificador * para eliminar la asignación. En caso de error
devuelve EOF.
La función printf() se usa para escribir cualquier tipo de dato a la pantalla. Su
formato es:
int printf(const char *formato[,argumento,...]);
La cadena apuntada por formato consta de dos tipos de elementos. El primer tipo
esta  constituido  por  los  caracteres  que  se  mostraran  en pantalla.  El  segundo  tipo
contiene  las  ordenes  de  formato  que  describen  la  forma  en  que  se  muestran  los
argumentos.  Las  ordenes de formato están precedidas  por  el  signo  % y le sigue el
código de formato. Estas ordenes de formato son:
Especificado
r
Descripción
%c Carácter.
%d Enteros decimales con signo.
%i Enteros decimales con signo.
%e Punto flotante en notación científica (e minúscula).
%E Punto flotante en notación científica (E mayúscula).
%f Punto flotante.
%g Usar el más corto de %e y %f.
%G Usar el más corto de %E y %f.
%o Octal sin signo.
%s Cadena de caracteres.
%u Enteros decimales sin signo.
%x Hexadecimales sin signo (letras minúsculas).
%X Hexadecimales sin signo (letras mayúsculas).
%p Mostrar un puntero.El lenguaje de programación C
%n El  argumento asociado es un puntero a un entero,  el  cual  recibirá el
número de caracteres escritos.
%% Imprimir el signo %.
Tabla 10.1.2: Especificadores de formato de la función printf().
Además,  e igual  que con la función scanf(), existen los modificadores  h,  l y  L.
Para su uso consultar la función scanf().
La función printf() devuelve el número de carácteres escritos. En caso de error
devuelve el valor EOF.
Veamos un ejemplo de uso de las funciones scanf() y printf():
#include <stdio.h>
int main(void)
{
   int a,b;
printf("\nIntroduce el valor de a: ");
scanf("%d",&a);
printf("\nIntroduce el valor de b: ");
scanf("%d",&b);
if (b!=0)
      printf("\nEl valor de %d dividido %d es: %f\n",
              a,b,(float)a/b);
else
      printf("\nError, b vale 0\n");
return 0;
}
10.2 - Entrada y salida desde fichero.
Antes de explicar la entrada y salida desde fichero, conviene explicar el tipo de
dato  FILE *.  Dicho tipo de  dato  es  el  "puntero de  fichero",  y es,  realmente,  una
estructura que contiene la información sobre el nombre del fichero abierto, su modo de
apertura (lectura,  escritura,  etc.),  estado,  etc.  Dicho "puntero de fichero",  por  tanto,
especifica el fichero que se esta usando y es,  la forma que poseen las funciones de
entrada y salida desde fichero de conocer sobre que archivo actúan.
Sobre un archivo es necesario, antes de poder usarlo, realizar una operación, la
apertura del mismo; una vez terminado su uso, es necesaria otra operación, cerrar  el
archivo.  De esto se  encargan  dos  funciones  de C.  Dichas  funciones  son  fopen() y
fclose(). Veámoslas con detalle:
La función fopen() se encarga de abrir un archivo. Su definición es:
FILE *fopen(char *nombre,char *modo);El lenguaje de programación C
Donde nombre es un string que contiene el nombre del archivo que queremos leer
y  modo es otro string que contiene el  modo de apertura deseado.  Dichos modos de
apertura son:
Modo Descripción
r Abrir un archivo para lectura.
w Crear un archivo para escritura.
a Abrir un archivo para añadir.
rb Abrir un archivo binario para lectura.
wb Crear un archivo binario para escritura.
ab Abrir un archivo binario para añadir.
rt Abrir un archivo de texto para lectura.
wt Crear un archivo de texto para escritura.
at Abrir un archivo de texto para añadir.
r+ Abrir una archivo para lectura/escritura.
w+ Crear un archivo para lectura/escritura.
a+ Abrir un archivo para leer/añadir.
r+b Abrir un archivo binario para lectura/escritura.
w+b Crear un archivo binario para lectura/escritura.
a+b Abrir un archivo binario para leer/añadir.
r+t Abrir un archivo de texto para lectura/escritura.
w+t Crear un archivo de texto para lectura/escritura.
a+t Abrir un archivo de texto para leer/añadir.
Tabla 10.2.1: Modos de apertura de un fichero con la función fopen().
En todos los casos de añadir, si el archivo especificado no existe, se procede a
crearlo.
Si no se especifica en modo si la apertura se realiza para un archivo binario o
texto,  dependerá de la configuración del  sistema que la apertura sea en binario o en
texto,  siendo en la mayoría de los casos  en modo texto.  La diferencia fundamental
entre modo texto y modo binario es que en modo texto,  secuencias de lectura tales
como retorno de carro/alimentación de línea se traducen en un único carácter  nueva
línea,  mientras  que  en  modo  texto  eso  no  sucede;  el  efecto  contrario  sucede  en
escritura.
La  función  fopen() devuelve  un  puntero  de  tipo  FILE a  la  estructura  que
representa  el  archivo  abierto.  En  caso  de  que  no  pueda  abrir  o  crear  el  archivo
especificado,  se  devuelve  un puntero  NULL,  por  lo  cual,  siempre  que  se  abra  un
archivo, deberá comprobarse que el valor devuelto no es NULL, y entonces, el código
deberá ser:
FILE *fp;
if ((fp=fopen("prueba","w"))==NULL)
{
   puts("\nNo puedo abrir el fichero\n");
   exit(1);
}El lenguaje de programación C
La función fclose() cierra un archivo. Su definición es:
int fclose(FILE *fp);
Donde fp es el puntero al fichero abierto mediante la función fopen().
La función fclose() cierra el archivo, lo cual da lugar a que el buffer de archivo
existente en memoria se libere,  escribiéndose en el  fichero si  es necesario,  además,
libera el bloque de control de archivo, lo cual lo hace disponible para otro archivo (el
sistema operativo limita el número de ficheros abiertos simultáneamente).
Un  valor  devuelto  de  cero  indica  que  el  archivo  fue  cerrado  con  éxito.
Cualquier valor distinto de cero indica un error.
Veamos un ejemplo de uso de fopen() y fclose():
#include <stdio.h>
int main(int argc,char *argv[])
{
   FILE *fp;
if (argc!=2)
{
      puts("Nombre del fichero no pasado");
     return 0;
}
if ((fp=fopen(argv[1],"r"))==NULL)
{
      printf("Error abriendo el fichero: %s\n",argv[1]);
      return 0;
}
if (fclose(fp))
{
      puts("Error cerrando el fichero");
      return 1;
   }
   return 0;
}
Una vez abierto un archivo, y hasta que se proceda a cerrarlo es posible leer,
escribir, etc., en el, según se indique en el modo de apertura. Las principales funciones
de lectura y escritura sobre un archivo son:
int getc(FILE *fp);
int putc(int ch,FILE *fp);
char *fgets(char *str,int n,FILE *fp);
int fputs(const char *str,FILE *fp);
int fscanf(FILE *fp,const char *formato[,dirección,...]);
int fprintf(FILE *fp,const char *formato[,argumento,...]);
int fread(void *memoria,int num,int cont,FILE *fp);
int fwrite(void *memoria,int num,int cont,FILE *fp);El lenguaje de programación C
La  función  getc() lee  caracteres  del  archivo  asociado  a  fp.  Devuelve  EOF
cuando se alcanza el final del archivo.
La función putc() escribe el carácter ch en el archivo asociado a fp. Devuelve el
carácter escrito si funciona de forma correcta, y EOF en caso de error.
La  función  fgets() funciona  de  igual  forma  que  la  función  gets(),  solo que,
además de leer del fichero asociado a fp, el parámetro n indica el número máximo de
caracteres que se pueden leer. Existe, además, una sutil diferencia, la función fgets() no
elimina el retorno de carro (si se lee) de la cadena de entrada, sino que lo conserva en
la misma,. añadiendo a continuación de dicho retorno de carro, y de forma automática,
el carácter de fin de cadena ('\0').
La función  fputs() funciona igual  que la función  puts(),  solo que,  además de
escribir en el fichero asociado a fp, no añade al final del string un retorno de carro, tal
y como hacia la función puts().
Las funciones fscanf() y fprintf() funcionan de forma similar a sus equivalentes
sobre la consola scanf() y printf(), solo que leen o escriben del archivo asociado a fp.
Las función fread() permite leer un bloque de datos. Su declaración es:
int fread(void *memoria,int num,int cont,FILE *fp);
Donde memoria es un puntero a la zona de memoria donde se almacenaran los
datos leídos, num es el tamaño (en bytes) de cada uno de los bloques a leer, cont es el
número de bloques (cada uno de  num bytes de tamaño) a leer, y  fp es el puntero al
fichero desde donde se lee.
La función fread() devuelve el número de bloques (no bytes) realmente leídos.
La función  fwrite() es la función dual  a  fread().  La función  fwrite() permite
escribir un bloque de datos. Su declaración es:
int fwrite(void *memoria,int num,int cont,FILE *fp);
Donde  memoria es un puntero a la zona de memoria donde se encuentran los
datos a escribir,  num es el tamaño (en bytes)  de cada uno de los bloques a escribir,
cont es el número de bloques (cada uno de num bytes de tamaño) a escribir, y fp es el
puntero al fichero desde donde se escribe.
La  función  fwrite() devuelve  el  número  de  bloques  (no  bytes)  realmente
escritos.
Un aspecto a resaltar de las funciones fread() y fwrite() es el hecho de que no
realizan ningún tipo de conversión con los datos leídos o escritos,  así  , la secuencia
retorno de carro/alimentación de línea, no es convertida en el carácter nueva línea en la
escritura,  y  viceversa  para  la  lectura.  Es  por  ello,  que  dichas  funciones  son,
generalmente, usadas con archivos abiertos en modo binario.El lenguaje de programación C
Veamos un ejemplo de uso de fread() y fwrite():
#include <stdio.h>
#define TAM 1000
int main(int argc,char *argv[])
{
   FILE *f_inp,*f_out;
char buffer[TAM];
int num;
if (argc!=3)
      return 0;
if ((f_inp=fopen(argv[1],"rb"))==NULL)
return 0;
if ((f_out=fopen(argv[2],"wb"))==NULL)
exit(1);
while ((num=fread(buffer,sizeof(char),TAM,f_inp))!=0)
fwrite(buffer,sizeof(char),num,f_out);
if (fclose(f_inp) || fclose(f_out)
exit(1);
   return 0;
}
Además de las funciones de entrada y salida de datos desde archivo, descritas
con anterioridad, existen tres funciones que no son de entrada y salida de datos y que
conviene explicar. Dichas funciones son:
int ferror(FILE *fp);
void rewind(FILE *fp);
int fseek(FILE *fp,long num,int origen);
La función ferror() devuelve si  durante la última operación realizada sobre el
archivo asociado a fp se produjo o no un error. Devuelve el valor cero si no se produjo
error, y un valor distinto de cero si se produjo error.
La  función  rewind() posiciona  el  indicador  de  posición  del  archivo  fp al
principio del mismo.
La  función  fseek() se  usa  para  operaciones  de  entrada  y  salida  de  acceso
aleatorio. La función fseek() desplaza el indicador de posición del archivo fp un tamaño
num desde la posición especificada por origen. Los valores validos para origen son:
Origen Nombre de la constante Valor
Comienzo del archivo SEEK_SET 0
Posición actual SEEK_CUR 1
Final del archivo SEEK_END 2
Tabla 10.2.2: Valores del origen en la función fseek().El lenguaje de programación C
La función  fseek() devuelve un valor  de cero si  funciona correctamente.  Un
valor distinto de cero indica un error en la última operación de posicionamiento en el
fichero.
La función fseek() solo funciona correctamente en archivos abiertos en modo
binario,  pues,  dadas  las  conversiones  que  se  realizan  en  ciertas  transacciones  de
caracteres  en  los  archivos  abiertos  en  modo  texto,  se  producirían  errores  en  el
posicionamiento en el  fichero al  usar  dicha función.  Veamos un ejemplo de uso de
fseek():
#include <stdio.h>
int LeeCaracter(FILE *fp,long pos,int origen)
{
   if (fseek(fp,pos,origen))
      return(EOF);
return(getc(fp));
}
Antes  de  terminar  este  tema,  es  necesario  comentar  la  existencia  de  tres
ficheros que son abiertos de forma automática al comenzar la ejecución del programa,
y cerrados, también de forma automática, al terminar la misma. Estos archivos son la
entrada  standard  (stdin),  la  salida  standard  (stdout)  y  la  salida  standard  de  error
(stderr).  Normalmente  estas  ficheros  están  asociados  a  la  consola,  pero  pueden
redireccionarse a cualquier otro dispositivo. Además, dado que son exactamente igual
que  ficheros,  pueden  usarse  sus  nombres  en los  mismos  lugares  que  se  usan  las
variables de tipo FILE *, por lo cual, cualquier función de fichero puede usarse con la
consola usando estos archivos standard abiertos al comenzar el programa. Es por ello,
que podemos leer, por ejemplo, una cadena desde el teclado de la siguiente forma:
char cadena[100];
fgets(cadena,100,stdin);
Y escribir dicha cadena, por ejemplo en la salida standard de error, de la forma:
fputs(cadena,stderr);
THEMRFRIKI S.A. Con tecnología de Blogger.

About