Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Esta parte es una revisin breve de la biblioteca de rutinas (funciones) y archivos include, en tiempo de ejecucin. La biblioteca de Borland C++ es un conjunto de ms de 450 funciones y macros preparadas para utilizar y diseadas para su uso en programas C++. La biblioteca en tiempo de ejecucin hace la programacin ms fcil, ya que incluye una amplia variedad de tareas tales como E/S de bajo y alto nivel, manipulacin de cadenas y archivos, asignacin de memoria, control de procesos, clculos matemticos, etc. Las rutinas de Borland C++ estn contenidas en los archivos de biblioteca Cx.LIB, CPx.LIB, MATHx.LIB y GRAPHICS.LIB. Borland C++ implementa la versin estndar ltima de ANSI C, que entre otras cosas recomienda el uso de los prototipos de funcin en las rutinas de sus programas C++. Este apndice describe alfabeticamente funciones de la biblioteca Borland C++ y contiene todas las funciones incluidas en ANSI/ISO C++.
F.2.
Borland C++ almacena informacin en la memoria principal de la computadora por dos mtodos. El primero utiliza variables globales y locales (incluyendo arrays, cadenas y estructura); en este caso, el almacenamiento o longitudes fija. Para cambiar el tamao de arrays y cadenas de caracteres se debe editar el archivo fuente y recompilar su programa. Esta informacin se almacena en la pila (stack). El segundo mtodo de almacenar informacin es asignar memoria a medida que el programa lo requiera y liberar esta memoria cuando ya no se necesita; esta accin permite utilizar la misma
archivo de cabecera
#include <string.h>
F.1.
sintaxis
Las entradas de las diferentes funciones y macros han sido normalizadas para facilidad de manejo del lector. Las rutinas han sido clasificadas por categoras (en general, se ha procurado respetar la clasificacin dada por Borland y ANSI, pero con una adaptacin ms prxima al uso diario del programador /. Al comienzo de cada categora se hace una breve descripcin de su cometido principal y se presenta una tabla con las funciones que contiene cada categora por orden alfabtico, as como una breve sntesis de su descripcin o propsito. A continuacin, por orden alfabtico, se describen las rutinas de acuerdo al siguiente modelo para cada entrada.
Descripcin Propsito y breve descripcin de cmo y dnde se utiliza la funcin. Ejemplo Una o ms instrucciones o programas sencillos, donde se muestra la explicacin real de la funcin. Funciones relacionadas: strcpy, strncpy. Funciones relacionadas con la funcin descrita.
616
memoria para colas diferentes en un tiempo distinto. Este proceso de asignar memoria se denomina asignacin dinmica de memoria. Por omisin, cada vez que se ejecuta un programa, DOS establece un segmento de 64 Kb denominado segmento de cdigo, que contiene su cdigo programa. DOS establece tambin un segmento de 64 Kb denominado segmento de datos. Su programa puede tener mltiples segmentos de datos y cdigos. El segmento de datos se divide en tres regiones: datos del programa (variables estticas y globales), pila stack (variables locales y argumentos) y montn o montculo heap.
Segmento de datos
datos de un programa. Si hay xito se devuelve 0; en caso contrario, 1, y la variable global errnoc toma el valor ENOMEN (insuficiente memoria).
it(brk(nuevo_break) == -1) perror(brk ha fallado);
Montculo (heap)
Pila (stack)
Datos del programa Asigna memoria principal (un bloque de tamao n.s). El bloque se borra (limpia) a 0. Si se desea asignar un bloque mayor que 64 Kb, se debe utilizar farcalloc. Devuelve un puntero al bloque recin asignado. Si no existe bastante espacio para el nuevo bloque o bien n o s es 0, calloc devuelve nulo.
long *buffer buffer=(long *) calloc(40, sizeof(long));
Despus de asignar partes del segmento de datos a variables estticas y globales y a la pila, el compilador dedica el resto del segmento de datos al montculo o heap. Borland C++ contiene un gran nmero de funciones para asignacin dinmica de memoria, que realizan una gran variedad de tareas: asignar y liberar memoria del montculo y de la pila, obtener informacin de bloques de memoria, etc.
allocmen #include <dos.h>
La funcin allocmen() establece seg para apuntar a un segmento asignado de memoria de t prrafos (1 prrafo = 16 bytes) de largo. Si hay xito se devuelve 1, si hay error (falta memoria), allocmen() devuelve el tamao en prrafos del mayor bloque disponible.
if(allocmen(size, &segadd)!= -1) printf (Error asignacin memoria \n);
unsigned coreleft(void) // modelos small, tiny, medium unsigned long coreleft(void); // en otros modelos de memoria
Determina la cantidad de memoria no utilizada. El valor devuelto depende del modelo de memoria.
Mem_avail = coreleft();
La funcin brk permite modificar el valor break de un programa. El valor break es la direccin de la primera posicin ms all del segmento de
Esta funcin asigna n piezas de tamao s y las pone a 0. Un puntero al principio de la memoria asignada se devuelve si farcalloc() tiene xito; en caso contrario se devuelve NULL.
617
#include <alloc.h>
Rellena todos los bloques libres del montculo far con un valor constante.
estadoheap = farheapfillfree(X);
#include <alloc.h>
#include <alloc.h>
#include <alloc.h>
Asigna n bytes de memoria far. La cantidad completa de memoria encima de la pila est disponible para asignacin por farmalloc. El tamao del bloque puede exceder de 64 Kb.
if(bloquegrande = farmalloc(80000L) == NULL printf(Asignacin fallada\n);
618
farrealloc
#include <alloc.h>
#include <alloc.h>
Se utiliza para reasignar (ajustar el tamao de un bloque de memoria b, al cual se ha asignado una longitud de n bytes).
if(bloquegrande = farrealloc(bloquegrande, 120000L)) = NULL printf(Fallo reasignacin memoria\n);
Verifica la consistencia de un solo nodo (bloque de memoria). Verifica el bloque de memoria identificado por el puntero n.
estadopila = heapchecknode(array);
La funcin free() libera un bloque de memoria. El argumento dir_memoria apunta a un bloque de memoria previamente asignado a travs de una llamada a calloc, malloc o realloc. Despus de la llamada el bloque libre est disponible para asignacin.
char *cad; // asignar memoria para cadena cad = (char *) malloc(50); ... free(cad); // liberar memoria
#include <alloc.h>
Rellena cada byte de todos los bloques de memoria no utilizados en el montculo con un valor de carcter especificado. En Visual C++ la funcin equivalente es heapset.
estadopila = heapfillfree(Z);
#include <alloc.h>
Verifica la consistencia del montculo (heap). En Visual C++ 6.0 la funcin equivalente es _heapcheck();
estadoheap = heapcheck();
#include <alloc.h>
Se utiliza para obtener informacin sobre las entradas en el montculo (heap). La funcin equivalente en Visual C++ es _heapwalk.
619
setblock int
#include <alloc.h>
Asigna memoria a bloques en el montculo. Devuelve un puntero, que es la direccin inicial de la memoria asignada.
cadena = malloc(MAX_CHR)
F.3.
La mayora de los programas requieren casi siempre alguna operacin de clasificacin y bsqueda de elementos en arrays. Borland C++ incluye diferentes funciones que realizan estas tareas.
bsearch() #include <stdlib.h>
void bsearch(const void*k, const void *b, size_t n, size_t a, int(*comparar)(const void*, const void*));
void
Ajusta el tamao de un bloque de memoria b asignado por malloc o calloc a un tamao de n bytes. Devuelve un puntero void al bloque de memoria reasignado.
Nuevo_buffer = realloc(viejo_buffer, long+100);
La funcin bsearch realiza una bsqueda binaria en un array ordenado b, de n elementos, cada uno de a bytes de tamao. El argumento k apunta al valor que se est buscando. bearch devuelve un puntero (la direccin) a la primera aparicin del valor k en el array. Si no se encuentra el valor, bsearch devuelve o. El argumento comparar proporciona la direccin de una rutina que aceptar dos argumentos elem1 y elem2, cada uno un puntero a un elemento del array. La funcin comparar compara cada uno de los elementos apuntados y devuelve un valor de acuerdo con la tabla siguiente:
Valor devuelto Negativo Cero Positivo Condicin Primer elemento menor que el segundo (elem1) (elem2). Los dos elementos son idnticos. Primer elemento mayor que el segundo.
#include <alloc.h>
Se utiliza sbrk para indicar el valor break de un proceso. El valor break es la direccin del primer byte disponible en el segmento de datos por omisin, ms all del segmento de datos que est siendo utilizado por los datos en el proceso.
sbr(500);
La bsqueda binaria requiere que el array est ordenado, por lo cual, caso de que no est ordenado el array, se puede utilizar la funcin qsort para ordenar el array antes de llamar a bsearch. Funciones relacionadas: lfind, lsearch, qsort.
620
lfind
#include <stdlib.h>
Condicin Primer elemento (elem1) menor que el segundo (elem2). Los dos elementos son idnticos. Primer elemento mayor que el segundo.
void * lfind(const void k, const void *b, size_t *num, size_t anchura, int(*comparar)(const void*, const void*));
La funcin lfind() realiza una bsqueda lineal de valor de k (clave) en un array de un nmero especfico de elementos, cada uno de un nmero fijo de bytes de longitud. Al contrario que bsearch(), el array no necesita estar ordenado. lfind() devuelve un puntero al primer elemento del array que coincide con la clave; si la clave no existe en el array, se devuelve un 0.
int comp(const void*, const void *); resultado = (char **) lfind(palabrabuscada, envp, &cuenta, sizeof(char*), comp);
void * lsearch(const void *k, const void *a, size_t *n, size_t W, int(*comparar) (const void*, const void *));
La funcin lsearch realiza una bsqueda lineal de la clave k. El array a contiene n elementos de anchura W. La funcin comparar se utiliza para comparar la clave con el elemento actual del array. Al contrario que bsearch(), en la funcin lsearch() el array no tiene que estar ordenado. lsearch() devuelve un puntero al primer elemento del array que se corresponde con la clave. Si no existe la clave en el array, se devuelve 0 y un registro se aade al array con un valor de k. La diferencia entre lsearch() y lfind() es que lsearch() aadir un registro al final del array con un valor de la clave si ese registro no se ha encontrado en el array. Funciones relacionadas: bsearch, lfind, qsort.
qsort #include <stdlib.h>
F.4.
FUNCIONES DE CADENA
La funcin qsort ordena un array con un nmero dado de elementos utilizando el mtodo de ordenacin rpida quicksort (creado por C.A.R. Hoare). El nmero de elementos de array es n y el tamao (en bytes) de cada elemento es w. La funcin comparar se utiliza para comparar un elemento del array con la clave; devuelve los siguientes valores:
C no tiene el tipo de datos cadena (string). En su lugar, las cadenas se tratan como arrays de caracteres, cada uno de los cuales ocupa un byte. Por notacin el final de una cadena en C se representa por un byte que contiene un carcter nulo (\0). Las cadenas pueden ser declaradas como arrays de caracteres.
char cad[20], cad 5[] = Hola Mortimer;
621
#include <string.h>
A las cadenas se accede directamente a travs de su ndice, como en el ejemplo anterior, o bien a travs de un puntero.
char cad5[] = Hola Mortimer; char *p_cad5; p_cad5 = cad5;
strchr() encuentra la primera aparicin de c en cad y devuelve un puntero a la primera aparicin de c en cad. Si c no se encuentra, devuelve un cero (NULL). printf(%s, strchr(Salario mensual = $85725, $));
visualizar $85725
char *s[81] = Esta es una cadena de prueba; char *ptr; ptr = strchr(s, a);
La funcin stpcpy() copia una cadena en otra. Devuelve un puntero al final de la cadena copiada. Se devuelve el valor de cad1+strlen(cad2)
stpcpy(orden_dos, DIR); stpcpy(caad1, cad2);
#include <string.h>
char *strcat(char *cad1, const char cad2); strcat() concatena (aade) cad1 al final de cad2, terminando la cadena resultante con un carcter nulo (\0). char nombre[80] = Bob; char blanco[2] = ; char ultimo[80] = Marley; ... strcat(nombre,blanco); // blanco se concatena a nombre strcat(nombre,ultimo); // ultimo se concatena a nombre // la cadena nombre ser Bob Marley
strcmpi
#include <string.h>
Compara una cadena con otra sin diferenciar entre maysculas y minsculas y devuelve un entero:
622
< 0 si cad1 < cad2 = 0 si cad1 = cad2 > 0 si cad1 > cad2 v = strcmpi(c1, c2);
strcpy()
#include <string.h>
char *strcpy(char *cad1, const char *cad2); strcpy() copia cad2 en cad1. Si la longitud de la cadena resultante excede el tamao asignado a cad1, puede producir fallos en el programa. char *a = Pepe Luis; char b[12]; strcpy(b, a); cout << b << \n;
#include <string.h>
Obtiene el mensaje de error del sistema correspondiente al nmero dado en el argumento errnum. La funcin strerror() obtiene el mensaje de error del sistema utilizando el valor en la variable global errno, como el ndice una tabla de errores denominadas sys_errlist, que est declarado en el archivo de cabecera stdlib.h.
errno = 0; printf (Error, strerror(errno);
Localiza la posicin de la primera aparicin en una cadena de cualquier carcter de otra cadena. Si tiene xito, la funcin strcspn devuelve el ndi-
623
strerror
#include <string.h>
Esta funcin sirve para generar un mensaje de error definido por el usuario.
printf(%S, _strerror(error apertura archivo));
Convierte una cadena en letras minsculas. La funcin devuelve un puntero a la cadena convertida.
char *orden =SALIR; strlwr(orden); // ahora orden = salir;
stricmp
#include <string.h>
Esta funcin se utiliza para comparar una cadena a otra sin tener en cuenta el tamao de las letras. Convierte todos los caracteres alfabticos de cad1 y cad2 en minsculas; a continuacin, se comparan las dos cadenas y devuelve un valor entero que indica el orden lexicogrfico de cad1 con respecto a cad2.
Si cad1 = cad2 Si cad1 < cad2 Si cad1 > cad2
La funcin strncat() aade los primeros n caracteres de cad2 a cad1, y termina la cadena resultante un carcter nulo. Si cad2 es mayor que n caracteres de longitud, strncat() truncar la cadena a la longitud de n. En otro caso, concatenar la cadena completa.
char *a = Sierra Madre; char *b = de la ciudad de Monterrey; cout << strncat(a, b, 4) << \n; cout << strncat(a, b) << \n;
el valor de la funcin es cero. el valor de la funcin es menor que cero. el valor de la funcin es mayor que cero.
Proporciona la longitud de una cadena cad. El carcter nulo no se incluye en la longitud; en consecuencia, cuando reserve espacio, recuerde aadir 1 al valor devuelto por strlen.
longitud = strlen(nombre); char s[81] = Cadena demo; printf(La longitud de s es:%d\n strlen(s));
Compara un nmero especificado en caracteres de dos cadenas y devuelve un entero con un valor.
< 0 si cad1 < cad2 = 0 si cad1 < cad2 > 0 si cad1 < cad2 char *a = Mortimer el andaluz; char *b = Mortimer el mexicano; if((strncmp(a, b, 8)) == 0)
624
cout << Ambas cadenas comienzan con \Mortimer\; else cout << Estas cadenas no comienzan con \Mortimer\;
Encuentra la ltima aparicin del carcter c en cad. Devuelve un punteo a la ltima aparicin de c o un carcter nulo si c no est en cad.
char *nombrearch = c: /usr/tst/libro/cap1.txt; cout << (strrchr(nombrearch, /)+1 << \n;
Inicializa los caracteres de una cadena a un valor dado (blanco u otro carcter). Devuelve un puntero a la cadena cad. El carcter c se utiliza para rellenar la cadena con ese carcter; n es el nmero de posiciones de caracteres que se han de inicializar.
printf(Introduzca una cadena:); gets(cadena); printf(Introducir un carcter:); c = getche(); long = strlen(cadena)/2; strnset(cadena, c, lon);
Invierte los caracteres de la cadena cad. El carcter de terminacin nulo permanece en el mismo lugar. strrev() devuelve un puntero a la cadena inversa. Aplicacin: Invertir una cadena leda del teclado e imprimir el resultado.
#include <stdio.h> #include <string.h> main() { char demo[80] printf(Introduzca una cadena:); gets(demo); strrev(demo); printf(La cadena inversa es:\n %s |\n, demo); return 0; }
strpbrk
#include <string.h>
Encuentra la primera aparicin en cad1 de cualquiera de los caracteres de cad2. El carcter nulo no se incluye en la bsqueda. Si el carcter no existe, se devuelve un carcter nulo (NULL).
char *s = Mortimer L.J. Mackoy; char *p = strpbrk(s, L4); cout << p << \n; // la salida es L.J.Mackoy
#include <string.h>
Establece todos los caracteres de la cadena cad al valor de c. Termina cuando se encuentra el primer carcter nulo. Devuelve un puntero a la cadena modificada.
#include <string.h> char *cad = -----; strset (cad, x); // cad es ahora xxxxx
625
strspn
#include <string.h>
Convierte cualquier letra minscula de la cadena en mayscula y devuelve un puntero a la cadena convertida (slo alfabeto ingls). La funcin strupr y su homnima strlwr no forman parte de la biblioteca ANSI C. En estos casos, utilice las funciones toupper y tolower.
strupr(sierra madre); // SIERRA MADRE
Localiza la posicin del primer carcter de una cadena (cad1) que no pertenece al conjunto de caracteres de otra (cad2).
loc = strspn (cad1, blanco);
strstr
#include <string.h>
Localiza la primera aparicin de una cadena en otra. Si tiene xito, la funcin strstr devuelve un puntero a la primera aparicin de cad2 como una subcadena de cad1. Si la bsqueda falla, se devuelve NULL.
char *s = Mi autor favorito es Octavio Paz char *a = Octavio Paz; cout << La subcadena << a << se encuentra: << strstr(s, a) << \n;
Convierte cad2 en cad1 basado en informacin especfica local y con un nmero mximo de caracteres a situar en cad1 de n. En el siguiente ejemplo, strxfrm transforma los tres primeros caracteres de cad1 en los tres primeros caracteres de cad2.
char *cad1 = abcdefg; char *cad2 = 1234567; clrscr(); strxfrm(cad1, cad2, 3); printf(Transformada: %s\n, cad1);
F.5.
Rompe una cadena en subcadenas (token) utilizando una lista de separadores. Devuelve un puntero a la subcadena actual y un NULL cuando se alcanza el final de la cadena.
char char cout cout *s *t << << = Prefiere a Verdi, o a Pucini?; = .,!* ; strtok(s, t) << \n; strtok(NULL, !);
#include <string.h>
C utiliza el conjunto de caracteres ASCII. Con frecuencia se necesita determinar la categora de un carcter o convertir un carcter de maysculas en minsculas, o viceversa. La biblioteca C contiene funciones que pueden ser definidas como macros para estos propsitos. Las macros estn definidas en el archivo de cabecera ctype.h. Las macros de clasificacin sirven para determinar qu clase de valor contiene una variable carcter. Puede necesitar conocer esta caracterstica para identificar ciertas clases de caracteres. Por ejemplo, si su programa pide al usuario que teclee un nmero, pero el usuario teclea en su lugar una letra, ser preciso capturar el error. Otro caso es cuando desea imprimir un archivo, y necesita asegurarse de que el archivo contiene slo caracteres imprimibles, en caso de que desee que su programa acepte caracteres de control, necesita saber cundo pulsa el usuario un carcter de control. En resumen, cada vez que necesite identificar el tipo de tecla que ha pulsado el usuario, se pueden utilizar las macros de clasificacin.
626
Asimismo, existen otras funciones en el archivo ctype.h que sirven para convertir caracteres en maysculas en minsculas, y viceversa; y valores enteros en cdigos ASCII.
isalnum int isalnum(int c); #include <ctype.h>
iscntrl, isdigit isgraph, islower isprint, ispunct, isspace isupper,isxdigit int int int int int int int int int iscntrl(int c); isdigit(int c); isgraph(int c); islower(int c); isprint(int c); ispunct(int c); isspace(int c); isupper(int c); isxdigit(int c);
#include <ctype.h>
La funcin isalnum() devuelve un cero si c es un carcter no alfanumrico y un valor distinto de cero si el carcter es alfanumrico.
carac = getch(); if(isalnum(carac)) printf(%c letra|digito \n, carac); else printf(%c no letra|digito \n, carac);
Macro
iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit
Verifica Carcter de control. Dgito decimal. Carcter imprimible (sin espacio). Carcter minscula. Carcter imprimible Carcter puntuacin Carcter blanco. Carcter mayscula. Dgito hexadecimal.
La funcin isalpha() verifica si un carcter es alfabtico. Devuelve un valor distinto de cero si c es un carcter alfabtico, o 0 si c no es alfabtico.
int c = getah() if(isalpha) printf(%c es letra\n, c);
Comprueba si un carcter c es un carcter ASCII; c est en el rango 0-127. Los caracteres 128 a 255 de ASCII son tratados por iascii() como no ASCII.
carac = getch(); if(isascii(carac)) printf(%c es ASCII \n, carac); else printf(%c no es ASCII \n, carac);
Cada macro (funcin) devuelve un valor distinto de cero si c satisface el criterio de esa macro; en caso contrario, devuelve un cero.
if(isprint(c)) if(iscntrl(c)) if(isdigit(c)) if(islower(c)) printf(\n printf(%c printf(%c printf(%c %c es es es imprimible\n, c); un carcter de control\, c); un dgito\n, c); letra minscula\n, c)
627
#include <ctype.h>
F.6.
Las funciones de calendario (fecha y hora) permiten obtener la hora actual y, a continuacin, convertirla y almacenarla de acuerdo a sus necesidades particulares. La hora actual se toma siempre de la hora del sistema. Las funciones de calendario estn incluidas en el archivo de cabecera time.h.
asctime char *asctime(const struct tm *hora); #include <time.h>
#include <ctype.h>
Convierte la fecha y la hora almacenada en una estructura de tipo tm en una cadena de caracteres. La estructura tm se define en time.h as:
struct { int int int int int int int int int }; tm tm_sec; tm_min; tm_hour; tm_mday; tm_mon; tm_year; tm_wday; tm_yday; tm_isdst; // // // // // // // // // [0,59], segundos [0,59], minutos [0,23], horas [1,31], dias del mes [0,11], mes del ao [desde 1900], ao [0,6], dias desde domingo [0,265], numero dia ao indicador hora de verano
Convierte un carcter mayscula en minscula. Utilice _tolower slo cuando est seguro de que el carcter que quiere convertir es una letra mayscula. La funcin _tolower() slo est disponible en sistemas UNIX. Por consiguiente, para asegurar la compatibilidad utilice slo la funcin tolower().
c = tolower(S); // c se convierte en S
#include <time.h>
Estas funciones convierten un carcter minscula en mayscula. Utilice _toupper slo cuando est seguro de que el carcter que quiere convertir es una letra minscula (rango a-z). La macro _toupper no est disponible en ANSI C. Para asegurar la compatibilidad, utilice siempre toupper().
c = toupper(S); // c se convierte en S
Calcula el tiempo empleado por el proceso llamador, es decir, el tiempo utilizado de procesador. Devuelve un valor en ticks que ha de dividirse por la constante CLK_TCK para obtener el tiempo transcurrido en segundos.
clock_t inicio, fin; printf(Inicio:%f\n, clock()/CLK_TCK;
628
ctime
#include <time.h>
#include <sys/timeb.h>
Convierte la fecha y hora almacenada como valor de tipo time_t en una cadena de caracteres (mes da hora ao\0).
time_t hora; hora = time(NULL); printf(Hora actual=%s\n, ctime(&hora));
ftime(&hora);
Obtiene la fecha del sistema. Los componentes se almacenan en la estructura date definida en dos.h.
struct date { int da_year; char da_day; char da_mon; }; struct date fecha; getdate(&fecha); // ao actual (1980-2099) // dia mes (1-31) // mes (1-12)
dostounix
#include <dos.h>
Convierte la fecha y hora DOS (devuelta por getdate y gettime) en formato UNIX.
time_t t; struct time dos_hora; struct date dos_fecha; gatdate(&Dos_hora); gettime(&dos_fecha); t = dostounix(&dos_fecha, &dos_hora);
Obtiene la hora actual del sistema. Los componentes de la hora se almacenan en la estructura time definida en dos.h.
struct time { unsigned char ti_min // minutos (0-59)
629
unsigned char ti_hour unsigned char ti_hund unsigned char ti_sec }; struct time hora; gettime(&hora);
#include <dos.h>
Cambia la fecha actual del sistema. Los componentes de la fecha (da, mes. Ao) se especifican en los campos de la estructura date.
struct date { int da_year; char da_day; char da_mon; }; // ao actual // da mes // mes, 1 para enero, 2...
gmtime
#include <time.h>
Convierte la fecha y hora en el tiempo medio de Greenwich (GMT) (ao, mes, da, hora, minutos, segundos y otros campos). Vase struct tm en asctime.
ahora = gmtime(&hoy);
localtime
#include <time.h>
Cambia la hora actual del sistema. Los componentes de la hora hora, minutos y segundos se deben cargar en los campos apropiados de la estructura time definida en dos.h. Vase gettime.
settime(&hora);
Convierte una fecha y hora en varios campos de una estructura de tipo tm. Vase struct tm en asctime.
tiempoactual = localtime(&ahora);
#include <time.h>
Establece la fecha y hora del sistema al valor contenido en la posicin cuya direccin est en el argumento t.
time_t horasis; horasis = time(NULL); stime(&horasis); printf(segundos desde 1/1/70 %ld, horasis);
630
strftime
#include <time.h>
size_t strftime(char *cad, size_t maxlon, const char *formato, const struct tm *t);
Funciones relacionadas: getdate, gettime, time, setdate, settime. Convierte un puntero en una estructura tm en una cadena cad (con una longitud mxima de n), utilizando f para dar formato a la cadena. El formato es similar a printf().
horaseg = time(NULL); horaactual = localtime(&horaseg); strftime(buffer, 80, %A %B %d 19%y:I:%M, horaactual);
F.7.
MS-DOS, al igual que UNIX, utiliza un sistema de archivos jerrquico que permite al usuario organizar sus archivos en directorios y subdirectorios. Las funciones de control de directorios en Borland C++ proporcionan las herramientas necesarias para crear, modificar, mover y eliminar directorios desde sus programas C. Las funciones de manipulacin de directorios residen en el archivo de cabecera dir.h.
chdir #include <dir.h>
#include <time.h>
Proporciona el tiempo del sistema en segundos desde las 00:00:00 de 1/1/1970 tiempo GMT.
time(&hora);
Cambia el directorio de trabajo actual al directorio especificado en el argumento camino. La funcin devuelve un 0 si tiene xito; en caso contrario, devuelve un valor de 1 para asignar el error. Cuando se produce un error, la variable global errno toma el valor ENOENT (camino o archivo no encontrado).
if(chdir(\\)) { perror(chdir()); exit(1); }
#include <time.h>
Establece las variables de entorno horarios TZ; asigna valores a las variables globales timezone, daylight y tzname.
tzset(); printf(Luz de verano = %d\n, daylight); printf(zona horario = %ld\n, timezone);
unixtodos void
#include <time.h>
Busca en un directorio de disco hasta encontrar el primer archivo cuyo nombre y atributos se corresponden con los valores especificados. El formato de la estructura ffblk es:
struct ffblk { char ff_reserved[21]; // reservada por DOS
631
char ff_atrib; int ff_ftime; int ff_date; long ff_fsize; char ff_name[13]; };
// // // // //
encontrado atributo hora archivo fecha archivo tamao archivo encontrado nombre de archivo
fnsplit
#include <dir.h>
void fnsplit(const char *camino, char *u, char *dir, char *nombrearch, char *ext);
La variable attrib viene definida en el archivo de cabecera <dos.h> y puede ser igual a uno de estos valores:
FA_RDONLY FA_HIDDEN FA_SYSTEM FA_LABEL FA_DIREC FA_ARCH
Separa un nombre de camino completo en sus componentes: letra de la unidad (u), camino del directorio, nombre del archivo y extensin del archivo (ext).
h = fnsplit(camino, unidad, dir, nomarch, ext);
Archivo de slo lectura. Archivo oculto. Archivo del sistema. Etiqueta de volumen. Directorio. Bit de archivo activado.
#include <dir.h>
Obtiene el directorio de trabajo actual en una unidad especfica. El nmero de la unidad (u) 0 indica la unidad actual por omisin, 1 significa unidad A, 2 unidad B, etc. La funcin devuelve un cero si tiene xito, en caso de error devuelve 1.
getcurdir(3, cuentas);
getcwd
#include <dir.h>
void fnmerge(char *camino, const char *u, const char *dir, const *nombrearch, const char *ext);
Crea un nombre de camino completo compuesto de una letra de la unidad (u), camino del directorio (dir), nombre de archivo (nombrearch) y extensin del archivo (ext).
fnmerge(camino, c:, \\aux\\,demo,.dat);
632
#include <dir.h>
La funcin getdisk obtiene el valor entero que representa la unidad actual (0, unidad A; 1, unidad B...)
int unidad; clscr(); unidad = getdisk();
Crea un nombre de archivo a partir de una plantilla. Devuelve un puntero al nombre del archivo si tiene xito y nulo en caso de error.
mktemp(nombre);
Elimina el directorio escrito por la variable camino, siempre que el directorio est vaco, no sea el directorio raz y no sea el directorio de trabajo rmdir(); devuelve 0 si la operacin de borrado tiene xito; si se produce un error, el valor devuelto es 1 y la variable global errno se fija a uno de los siguientes valores:
EACCES ENOENT
Busca un archivo especfico en una lista de directorios, incluyendo el directorio de trabajo actual y los definidos en la variable de entorno PATH. Si el archivo se encuentra, se devuelve un puntero al nombre del camino del archivo; en caso contrario, se devuelve NULL.
buffer = searchpath(BC.EXE);
Permiso denegado. Camino archivo no encontrado. Esta funcin es similar a RMDIR o RD de MS-DOS.
#include <dir.h>
Crea un directorio con un nombre de camino especificado. Funciona igual que la orden MKDIR o MD de DOS. Devuelve 0 si el directorio se ha creado con xito o 1 si se produce un error; en este caso, la variable global errno toma el valor EACCES (permiso denegado) o ENOENT (nombre de camino no vlido).
EACCES ENOENT
Cambia a una nueva unidad por omisin. El valor de la unidad (unidad) es un entero. Unidad A B: C: D: ...
nuevaunidad = setdisk(3); / nueva unidad actual es C:
633
F.8.
#include <stdlib.h>
Un proceso es un programa ejecutable en memoria y su entorno asociado. Cada vez que se ejecuta un programa se crea un proceso. En resumen, un proceso es un programa que se est ejecutando por el sistema operativo. Consta del cdigo del programa y de datos, adems de informacin relativa al proceso, tales como nmero de archivos abiertos. Siempre que se ejecuta un programa al nivel del sistema operativo se arranca un proceso. Las funciones de control de proceso permiten arrancar, detener y gestionar procesos desde dentro de un programa. La mayora de las funciones de control se declaran en el archivo de cabecera process.h; otros archivos de cabecera que contienen funciones de control de proceso y del entorno son locale.h, signal.h, setjmp.h y stdlib.h.
exec(familia)
#include <process.h>
int excel(char *camino, char *arg0,...,NULL); int execle(char *camino, char *arg0,..., *argn, NULL, char **env); int execlp(char *camino, char *arg0, arg1,...,NULL);
abort
int execlpe(char *camino, char *arg0,...argn, NULL, char **env); int execv(char *camino, char argv[]); int execve(char *camino, char argv[], char **env); int execvp(char *camino, char *argv[]); int execvpe(char *camino, char *argv[], char **env);
void abort(void);
}
Funciones relacionadas : exit, _exit, raise, signal, spaw.
Cargan y ejecutan un proceso hijo en la memoria actualmente ocupada por su cdigo del programa. Las funciones exec crean un proceso hijo que carga y ejecuta el programa especificado por el argumento camino.
execlo(hijo.exe, hijo.exe, Uno, Dos, NULL); execv(hijo.exe, argv);
Termina un programa. Antes de terminar, se cierran todos los archivos, se escribe la salida a travs del buffer y se llama a cualquier funcin exit registrada. estado representa el estado de salida del programa; 0, salida normal; distinto de cero, indica un error.
exit(0);
634
#include <stdlib.h>
Termina inmediatamente el proceso actual sin hacer otras operaciones auxiliares (como cierre de archivos).
_exit(0)
Restaura el estado de la pila y la ejecucin local anteriormente grabada en env por setjmp.
longjmp(plaza, 3);
Obtiene la definicin de una variable de la tabla de entorno del proceso. Utiliza la variable global environ para localizar la lista de las variables de entorno y, a continuacin, busca una entrada en la lista correspondiente a nomvar.
varlib = getenv(LIB);
Imprime un mensaje de error del sistema en el flujo stderr. El argumento cadena se imprime primero, seguido por dos puntos; a continuacin, el mensaje de error correspondiente al valor actual de la variable global errno y, finalmente, un carcter de nueva lnea. Si cadena es un puntero nulo o un puntero a una cadena nula, perror imprime slo el mensaje de error del sistema.
perror(Error de cierre de archivos);
Crea nuevas variables de entorno o modifica los valores de las variables de entorno existentes.
if(putenv(argv[1] == -1)
635
#include <signal.h>
Enva una seal al programa en ejecucin. Crea una condicin de excepcin correspondiente al nmero seal. Existen diferentes constantes, por ejemplo, SIGABRT (terminacin anormal).
printf(prueba de raise\n); raise(SIGABRT);
int spawnle(int modo, char *camino, char *arg0, char *arg1,...,NULL, char **envp[]); int spawnlp(int modo, char *camino, char *arg0, char *arg1,...,NULL); int spawnlpe(int modo, char *camino, char *arg0, char *arg1,...,NULL, char **envp[]); int spawnv(int modo, char *camino, char *argv[]); int spawnve(int modo, char *camino, char /argv[], char *envp[]); int spawnvp(int modo, char *camino, char *argv[]); int spawnvpe(int modo, char *camino, char *argv[], char *envp[]);
La familia de funciones spawn crea y ejecuta un nuevo proceso hijo. Debe haber memoria suficiente para cargar y ejecutar el proceso hijo.
spawnlpe(P_WAIT, hijo.exe, hijo.exe, spawnlpe, buf, NULL, env);
Guarda el estado actual del programa (el entorno de la pila) antes de llamar a otra funcin. Este entorno puede ser restaurado por una llamada a longjmp, realizando el efecto de un goto no local.
if(setjmp(env) != 0) printf(valor de longjmp\n);
F.9.
Las funciones de conversin de tipos de datos sirven para crear un puente de unin entre los dos estilos de representacin de nmeros: la cadena de texto legible por los humanos y el formato binario legible por las mquinas. Las funciones de conversin son ideales para convertir argumentos de lneas de rdenes de su representacin de cadena al formato interno.
atof()
Establece tratamiento de seales de interrupcin. La funcin signal permite a un proceso elegir uno de los diferentes modos de manipular una seal de interrupcin del sistema operativo.
signal(SIGINT, SIG_IGN);
La funcin atof() convierte el argumento cadena en un valor de doble precisin. La cadena debe tener el siguiente formato: [blanco][signo][ddd][.]]ddd][exponente][signo][ddd]
e/E
spawn (funciones)
La conversin termina cuando aparece el primer carcter no reconocible o cuando se encuentra un carcter nulo (\0).
636
La conversin de caracteres de la cadena hasta que se encuentre el primer carcter no reconocible o el carcter nulo (\0).
// convierte la cadena 200.85 a real long int i; char cad_ent = 9876543; ... i = atol(cad_ent); // convierte cadena 9876543 a entero // largo.
La funcin atoi() convierte el argumento cadena en un valor entero. La cadena debe tener el siguiente formato: [espacio en blanco][signo][ddd] opcional espacio o tabulacin dgitos decimales
ecvt
#include <stdlib.h>
La funcin ecvt() convierte un argumento de valor doble precisin en una cadena con n dgitos. Si valor tiene ms de n dgitos, los dgitos inferiores se truncan. dec es un puntero a un entero en donde se devuelve la posicin del punto decimal; signo es un puntero a un entero donde se devuelve el signo (cero, positivo; en los restantes casos, negativo).
p_buffer = ecvt(valor, exactitud, &dec, &signo);
La conversin termina cuando se encuentra un carcter no reconocible (carcter nulo, \0, punto decimal o una letra). Si no puede convertir la cadena devuelve nulo.
int i; char *cad_ent =123; ... i = atoi(cad_ent);// convierte la cadena 123 al entero 123
fcvt
#include
<stdlib.h>
Convierte el argumento cadena en un valor entero largo. La cadena debe tener el formato: [espacio en blanco][signo][ddd]
Al igual que la funcin ecvt, fcvt convierte el argumento valor de doble precisin en una cadena de n dgitos. Si el nmero de dgitos de valor excede a n, el exceso de dgitos se trunca. Si hay menos dgitos que n la cadena se rellena con ceros. fcvt se diferencia de ecvt en el modo de tratar los dgitos significativos. ecvt() busca un nmero total de dgitos, mientras que fcvt() busca el nmero de dgitos a la derecha del puntero decimal.
cadena = fcvt(valor, exactitud, %oposicin_d, &signo);
637
gcvt
#include <stdlib.h>
strtod
#include stdlib.h>
La funcin gcvt() convierte el argumento valor de doble precisin en una cadena de caracteres que se almacena en el buffer cuya direccin se da en el argumento buf. Se debe asignar bastante espacio en el buffer para contener todos los dgitos de la cadena convertida y el carcter nulo de terminacin (\0).
gcvt(valor, digitos, cadena);
La funcin strtod() convierte la cadena cad en un valor de doble precisin. La cadena debe tener el formato
[blanco][signo][ddd][.][exponente][signo][ddd]
+, blanco/ tabulacin
d, D, e, E dgitos decimales
itoa
#include stdlib.h>
strtod() devuelve el valor de doble precisin y cero si no se produce la conversin. La conversin se termina con el primer carcter no reconocible. Aplicacin: Convertir la cadena 843899.567 a un valor de coma flotante double. #include <stdio.h> #include <stdlib.h> main() { double x; char *num_flt = 843899.567: char *p; x = strtod(num_flt, &p); printf(x = %f\n,x); }
La funcin itoa() convierte el argumento entero valor en una cadena de caracteres utilizando el argumento base, como base de un sistema de numeracin (2 a 36). Debe existir bastante espacio en cad para contener 17 caracteres, itoa() devuelve un puntero a la cadena cad.
itoa(32, buffer, 16); // buffer contendr 20, ya que 32 entero // equivale a 20 en hexadecimal
ltoa
La funcin ltoa() convierte el argumento entero largo valor en una cadena de caracteres que utiliza el argumento base como base de un sistema de numeracin. Como un entero largo ocupa 32 bits en base 2, la cadena puede ocupar 33 bytes con el carcter nulo de terminacin. Debe haber bastante espacio para contener 33 bytes. ltoa() devuelve un puntero a cad.
long valor = 99288377L ltoa(valor, cadena, 30);
La funcin strtol() convierte una cadena cad en un valor entero largo. La cadena (puede contener hasta 33 caracteres) debe tener el formato: [espacio en blanco][signo][0][x|X][ddd] +, blancos y tabulaciones octal dgitos decimales hexadecimal
638
La conversin se termina con el primer carcter no reconocible. Si se produce un error de desbordamiento (positivo o negativo) la variable errno se establece al valor de la macro ERANGE. Aplicacin. Convertir la cadena 9876 en valor entero.
#include <stdio.h> #include <stdlib.h> main() { int base = 10; long int i; char *cad_ent = 9876; char *ptrcad; i = strtol(cad_ent, &ptrcad, base); printf(i = %ld\n, i); }
ultoa
#include <stdlib.h>
La funcin ultoa() toma valor en base b (entre 2 y 36) y lo convierte en una cadena. Devuelve el puntero al principio de cad. No devuelve cdigo de error. cad puede contener hasta 33 caracteres, excluyendo el carcter de terminacin nulo (\0).
ultoa(valor, buffer, base);
F.10.
FUNCIONES DE ENTRADA/SALIDA
Las funciones de E/S (Entrada/Salida, I/O, Input/Output) permiten leer y escribir datos entre archivos y dispositivos. En C no hay estructuras de archivos predefinidas, todos los datos se tratan como secuencias de bytes. La lista de funciones de E/S se han agrupado de acuerdo a las tareas especficas que realizan: 1. Secuencias o flujos (stream). 2. Bajo nivel. 3. Consola y puertos.
Funciones de flujos (stream)
strtoul
#include <stdlib.h>
Convierte una cadena de caracteres a un entero largo sin signo en la base dada. La cadena debe tener el formato: [espacio en blanco][0][x|X][ddd] dgitos decimales octal blanco o tabulaciones hexadecimal Si la base b es cero, strtoul utiliza el primer carcter de la cadena para determinar la base del valor. La cadena cad puede contener hasta 33 caracteres, excluyendo el carcter de terminacin nulo (\0,). Si se produce un error de desbordamiento, la variable errno se pone al valor de ERANTE.
i = strtoul(cad_ent, &ptrfin, base);
Las funciones de E/S tratan los datos como una secuencia o flujo de caracteres individuales. La eleccin adecuada de las funciones disponibles permite procesar datos en tamaos y formatos diferentes, desde caracteres independientes a estructuras de datos complejos. La E/S por secuencia, o flujo, tambin proporciona acciones de taponamiento (buffering) que mejoran significativamente el rendimiento. Para utilizar los flujos, generalmente se debe incluir el archivo stdio.h.
clearerr void clearerr(FILE *f); #include <stdio.h>
639
#include <stdio.h>
#include <stdio.h>
Cierra un flujo (fclose) o cierra todos los flujos abierta (fcloseall) excepto stdin, stdout y stderr. Se devuelve el nmero de flujos cerrados y EOF si se produce un error.
fcloseall();
Limpia (vaca) un flujo. Los buffers se limpian automticamente cuando estn llenos, cuando se cierra el flujo, o cuando un programa termina normalmente sin cerrar el flujo.
fflush(fp);
Abre un flujo utilizando un handle (entero devuelto por las rutinas de E/S de bajo nivel, tales como open, creat, dup y dup2); asocia una estructura de datos FILE con el archivo especificado por handle.
p_datos = fdopen(handle, rb);
Lee un carcter de la posicin actual del archivo y, a continuacin, incrementa esta posicin.
c = fgetc(fp)
Funciones relacionadas: fgetchar, fputc, fputchar, getc, putc, Funciones relacionadas: fclose, fopen, fropen, open.
feof int feof(FILE *flujo); #include <stdio.h> putchar.
#include <stdio.h>
Obtiene y graba la posicin actual del archivo. fos_t es un tipo definido en stdio.h.
fgetpos(fp, &pos_archivo);
640
fgets
Lee una cadena de un flujo (hasta que se encuentra \n, o el nmero mximo de caracteres especificados).
fgets(caddemo,80, fp);
#include stdio.h>
Vaca (limpia) todos los buffers asociados con los archivos abiertos.
numvaciados = flushall();
#include <stdio.h>
Accin Abre para lectura. Abre un archivo vaco para escritura. Abre para escritura al final del archivo (aadir). Abre para lectura/escritura. Abre un archivo vaco para lectura/escritura. Abre para lectura y aadir. Abre un archivo binario para lectura. Crea un archivo binario para escritura. Abre un archivo binario para aadir. Abre un archivo binario para lectura/escritura. Crea un archivo binario para la lectura/escritura. Abre o crea un archivo binario para lectura/escritura.
#include <stdio.h>
641
Escribe una letra cad en un flujo f. Devuelve el ltimo carcter impreso, si hay error devuelve EOF.
fputs(esto es una prueba, f1);
Mueve el puntero del archivo asociado con f a una nueva posicin que est desplazada desp bytes de org.
Origen
SEEK_SET SEEK_CUR SEK_END
Funciones relacionadas: ftell, rewind, fopen. Lee n registros de t bytes en la memoria apuntada por p desde el flujo f.
fread(buf, strlen(msg)+1, 1, flujo); fsetpos int fsetpos(FILE *f, const fpos_t *p); #include <stdio.h>
Establece la posicin del puntero del archivo al lugar especificado por el objeto apuntado por p.
fsetpos(fp, &posarch);
Cierra el archivo asociado con flujo y reasigna flujo al archivo especificado por f. Los modos (m) utilizados son los mismos de fopen.
freopen(salida.txt, w, stdout);
642
fwrite
#include <stdio.h>
Escribe n elementos (registros) de longitud l desde la memoria apuntada por p al archivo f. Devuelve el nmero de caracteres realmente escritos que, si la funcin tiene xito, es igual al nmero indicado.
num = fwrite(lista, sizeof(char),25,flujo);
Devuelve el siguiente carcter de un flujo de entrada dado e incrementa la posicin actual del puntero del archivo. Si se alcanza el final de archivo, se devuelve EOF.
whilec(c = getc(fx)!= EOF) { printf(%c, c); }
#include <stdio.h>
#include <stdio.h>
Lee una lnea desde el archivo de entrada estndar stdin, por omisin es el teclado y lo guarda en cad.
gets(nombre);
#include <sdio.h>
Funciones relacionadas: cgets, fgetc, getc, getchar, ungetch. Lee un entero (o una palabra de dos bytes) de un flujo f.
getchar int getchar(void); #include <stdio.h> suma = getw(fx) + suma;
643
printf
#include <stdio.h>
#include <stdio.h>
Escribe cadenas de caracteres y valores de variables, con formato, en el archivo de salida estndar stdout (por omisin, la pantalla).
Cdigo
%c %d %e %f %s %x
Formato Carcter. Entero decimal. Real (double o float), notacin cientfica. Coma flotante. Cadena de caracteres. Hexadecimal sin signo.
#include <stdio.h>
#include <stdio.h>
%c %d %x %i %f %o
%p
%s
644
Esta funcin es idntica a scanf, excepto que los datos son ledos del array apuntado por b, en vez de stdin.
sscanf(buffer, %,s%s,uno,dos,tres);
Asigna el buffer b de tamao l y el tipo t con el flujo (archivo) f. Los valores correctos de t son: _IOBF, _IONBF e _IOLBF.
setvbuf(demo, buffer, _IOFBF, 120);
Escribe datos con formato en una cadena. Se diferencia de printf en que la salida generada se sita en el array apuntado por b.
sprintf(cad, &s %d %c, uno,5,7);
Sita un carcter, excepto la constante EOF, en el buffer asociado con un archivo abierto para entrada con buffer.
ungetc(car, stdin);
sscanf
#include <stdio.h>
645
vsscanf
int vsscanf(const char *b, const char *f, lista_va lista_arg); #include <stdio.h> #include <stdarg.h>
Funciona igual que sscanf, excepto que en vsscanf es utilizado un puntero a una lista de variables en lugar de a las propias variables.
vsscanf(buf_en, formato_p, arg_p);
int vfprintf(FILE *f, const char *f, lista_va lista_arg); int vprintf(const char *f, lista_va lista_arg); int vsprintf(char *b, const char *f, lista_va lista_arg);
Las declaraciones de las funciones de bajo nivel se incluyen en los archivos de cabecera io.h, fcntl.h, sys|types.h y sys|sta.h. A diferencia de las funciones stream, las funciones de bajo nivel no requieren el archivo de inclusin stdio.h.
vfscanf
#include <io.h>
Lee entrada con formato de un flujo, tal como scanf, excepto que vfscanf acepta un puntero a la lista de argumentos. vfscanf(demo, formato, arg);
_creat creat
Lee una entrada con formato de un flujo; similar a scanf, excepto que
vscanf acepta un puntero a la lista de argumentos. vscanf(formato, argumento);
int creat(const char *cam, int modo); int _creat(const char *cam, int atributo);
Crea un nuevo archivo o abre y trunca un archivo existente. _creat() acta igual que creat(), excepto que utiliza un byte de atributo del DOS.
646
Modo
S_IWRITE S_IREAD S_IREAD|S_IWRITE
#include <io.h>
fh= creat(datos,S_IREAD|S_IWRITE);
Comprueba si el archivo especificado en el descriptor d es el final de archivo (se devuelve 1 si se alcanza el final del archivo. 0 si no se alcanza el final del archivo, 1 indica un error y errno toma valor EBADF: nmero de archivo incorrecto).
while(!eof(fx))
La funcin lseek mueve el puntero asociado con el descriptor d a una nueva posicin que est emplazada desp bytes de origen.
pos = lseek(fh, OL, SEEK_CUR);
int
Crea un nico archivo temporal con byte de atributo en el directorio escrito por camino.
if((h = creattemp(nombre,9))== -1
Abre el archivo especificado en f para lectura o escritura. El argumento a indica el tipo de operacin permitida y m el tipo de permiso.
Indicador Lectura/escritura
O_RDONLY O_WRONLY O_RDWR O_NDELAY O_APPEND O_TRUNC O_EXCL
Significado Abrir para lectura. Abrir para escritura. Abrir para lectura y escritura. Pone el puntero del archivo al final del archivo. Se crea el archivo y se fijan atributos del archivo. Trunca el archivo a 0. Se utiliza con O_CREAT. Abrir archivo en modo binario. Abrir archivo en modo texto.
Crea un segundo enlace a un archivo abierto (dup) o reasigna un enlace de archivo (dup2).
viejostdout = dup(STDOUT); dup2(fptr, STDOUT);
O_BINARY O_TEXT
647
Funciones relacionadas: access, chmod, close, creat, fopen. Funciones relacionadas: ftell, lseek.
sopen #include <fcntl.h> #include <io.h> #include <share.h> #include <sys/stat.h>
write
#include <io.h>
int write(int d, void *buffer, unsigned lon); int sopen(char *f, int a, int s[, int m]);
Abre un archivo f con acceso a en modo compartido en un entorno de red y con el tipo s de comparticin permitido en el archivo y modo m.
Indicador Lectura/escritura
O_RDONLY O_WRONLY O_RDWR S_IWRITE S_IREAD S_IWRITE|S_IREAD
Escribe datos en un archivo (lon bytes en el archivo asociado con d desde el buffer apuntado por buffer).
write(fx, grande, 60000);
Significado Abrir para lectura. Abrir para escritura. Abrir para lectura y escritura. Acceso de escritura. Acceso de lectura. Acceso de lectura y escritura.
Las funciones de E/S sirven para interactuar con el teclado y la pantalla. Estas funciones se declaran en el archivo de cabecera conio.h.
#include <conio.h>
Lee una cadena de caracteres directamente de la consola, y almacena la cadena y su longitud en la posicin apuntada por cadena.
entrada = cgets(cadena);
Lee lon bytes del archivo asociado con d en el buffer apuntado por buffer.
read(fx, buffer, 100); cprintf #include <conio.h>
int cprintf(const char *formato[,arg,...]); tell long tell(int d); #include <io.h>
648
\n se interpreta como avance de lnea (LF) y \r se debe utilizar para indicar un retorno de carro (CR). cprintf(Cubo de %2d es %rd\r\n,i, i * i * i);
#include <conio.h>
Lee una palabra de paso por consola, que no se visualiza en pantalla (menos de ocho caracteres de longitud).
palabrapaso = getpass(Introduzca clave);
#include <conio.h>
Escribe una cadena en la pantalla. No se enva ningn carcter de nueva lnea despus de la cadena.
cuts(Est usted seguro(s/n)?);
#include <dos.h>
cscanf int
#include <conio.h>
Lee una palabra de 16 bits (inport) o un byte (inportb) de un puerto de E/S especificado por puerto. La funcin inport es til para leer dos puertos adyacentes a la vez, e inportb para controlar dispositivos de entrada/salida.
palabra = inport(PORT_8259_20); P21 = inportb(PORT_8259_21);
Lee caracteres con formato directamente desde la consola en la posicin dada por direccin.
cscanf(%d%d%d, &dia, &mes, &hora);
#include <conio.h>
Funciones relacionadas: getch, getche. Lee un carcter de la consola sin eco (getch) o con eco (getche).
printf(Pulse cualquier tecla para salir); getch(); outport, outportb #include <conio.h>
void outport(int puerto, int palabra); void outportb(int puerto, unsigned char byte);
649
Significado Se verifica existencia del archivo. Ejecutar. Verifica permiso de escritura. Verifica permiso de lectura. Verifica permiso de lectura y escritura.
return(access(nombre, 4)==-1)
Escribe un carcter en la consola (sin accin del buffer). Funciones relacionadas: chmod, fstat, stat.
putch(car); putch(\n); putch(x);
chmod
Sita un carcter en el buffer del teclado de modo que es el siguiente carcter ledo en la consola.
if(c =!EOF) ungetch(c); ungetch(car);
F.11.
El sistema de archivos es un componente clave del/de la PC. Todas las aplicaciones y datos residen en archivos. Las funciones de gestin de archivos permiten establecer y verificar permisos de acceso a archivos. La mayora de las funciones estn en el archivo de cabecera io.h, y las restantes en sys|stat.h, dir.h y stdio.h.
access int access(const char *nomarch, int modo); #include <io.h>
#include <io.h>
650
#include <io.h>
Devuelve informacin sobre el archivo especificado en la estructura de tipo stat apuntada por buffer. La estructura stat es:
struct stat { short st_dev; short st_ino; short st_mode short st_nlink; int st_uid; int st_gid; int st_rdev; long st_size; long st_atime; long st_mtime; long st_ctime; }; fstat(fich, &info); // // // // // // // // // // // unidad o dispositivo nmero inodo (UNIX) modo archivo nmero enlaces (DOS,1) id de usuario (UNIX) id de grupo (slo UNIX) dispositivo UNIX tamao archivo en bytes hora ltimo acceso hora ltima (UNIX) hora creacin
fnmerge
#include <dir.h>
void fnmerge(char *camino, const char *unidad, const char *dir, const char *nombref, const char *ext);
Crea un nombre de camino completo (letra, unidad, camino directorio, nombre de archivo y extensin del archivo). En Microsoft, la funcin equivalente es _makepath.
fnmerge(camino,C:,\\aux,resultado,.dat); // nombre de caminoC:\aux\resultado.dat
#include <io.h>
int fnsplit(const char *camino, char *unidad, char *dir, char *fnombre, char *ext);
Separa un nombre de camino completo en sus componentes: letra, unidad, camino, nombre y extensin del archivo.
f = fnsplit(c, unidad, dir, arch, ext);
#include <io.h>
Bloquea un nmero de bytes n del archivo h (manejador) con desplazamiento se utiliza para comparticin de archivos (orden SHARE de MSDOS). En Visual C++, la funcin equivalente es locking.
#include <sys\stat.h> res lock(h, 0L,256);
fstat
651
#include <dir.h>
Crea un nico nombre de archivo modificando una plantilla dada como argumento, plantilla toma la forma basexxxxxx, donde base es el nombre que se proporciona y x los caracteres a modificar.
char modelo = tcbxxxxxx; mktemp(modelo);
#include <stdio.h>
rename
#include <stdio.h>
652
unlock
#include <conio.h>
Desbloquea una seccin del archivo h que ha sido bloqueada con lock.
unlock(m,OL,256); // desbloquea 256 bytes
La clase bcd permite manipular nmeros almacenados en notacin decimal codificado a binario (BCD) y proporciona hasta 17 dgitos decimales de precisin, y un rango de 1 10-125 a 1 10125.
F.12.
FUNCIONES MATEMTICAS
El C original de K&R fue diseado, inicialmente, como un lenguaje de programacin de sistemas, su uso ha sido muy escaso en el campo del clculo cientfico. Sin embargo, desde la normalizacin de ANSI C y su extensa biblioteca matemtica, C se ha convertido en un fuerte rival del lenguaje cientfico por excelencia, FORTRAN. C soporta operaciones de coma flotante e incluye tambin un rico conjunto de funciones matemticas. Borland C++ ha ampliado las propiedades de ANSI C estndar. Los archivos de cabecera que contienen funciones matemticas son: bcd.h, complex.h, float.h, math.h, stdlib.h. Las funciones de Borland C++ no incluidas en ANSI C son: cabs, _clear87, _control87,
_fpreset, hypot, _lrotl, _rotr, _matherr, matherrmax, min, poly, pow10, random, randomize, _rotl, _rotr, _status87.
versin compleja
int abs (int x); double abs(complex x);
Adems de estas funciones, Borland C++ soporta dos clases especficas importantes: complex y bcd, se encuentran en los archivos complex.h y bcd.h, respectivamente.
Clase complex
acos
Borland C++ incluye una estructura complex en el archivo de cabecera math.h, cuyos miembros son la parte real e imaginaria de un nmero complejo z y que se define as:
struct complex { double x; double y; }
La funcin acos() devuelve el arco coseno de x, cuyo valor debe estar en el rango 1 a 1. El resultado es un valor (ngulo) entre 0 y radianes.
angulo = acos(0.5); // el ngulo devuelto es /3
#include <complex.h>
653
Calcula el arco tangente de y/x. El resultado es un ngulo de valor comprendido entre y radianes.
angulo = atan2(y, x);
versin compleja
double asin(double x);
Calcula el valor absoluto de un nmero complejo almacenado en una estructura de tipo complex.
struct complex z; double complejo; z.y = 3.5 z.y = 2.4 complejo = cabs(z); printf(valor absoluto %lf\n, complejo);
Calcula el arco seno del argumento x; el valor de x debe estar comprendido entre 1 y 1. La funcin asin() devuelve un valor entre /2 y , el valor de x debe ser en radianes.
Z = asin(0.7543);
Funciones relacionadas: fabs, hypot, matherr, sqrt. Funciones relacionadas: matherr, sin.
ceil atan versin real #include <math.h>
versin compleja
double atan(double x);
Calcula el arco tangente de x. El rango x es 1 a 1. La funcin atan() devuelve un valor en el rango de /2 a /2.
#include <complex.h> complex atan(complex x); angulo = atan(1.0); // ngulo es Pi/4 (45 grados)
#include <float.h>
654
_control87
#include <float.h>
La funcin div() calcula el cociente entero y el resto de x por y. La funcin devuelve una estructura div_t definida en stdlib.h como
typedef struct { int quot; int rem; } div_t;
Obtiene y establece la palabra de control de coma flotante. Cuando se utiliza un coprocesador matemtico 8087, _control87 establece su palabra de control.
estado = control87(PC24,MCW_IC); // precisin 24 bits
// cociente // resto
Calcula el coseno del argumento x. El argumento x se especifica en radianes y devuelve un valor en el rango de 1 a 1.
coseno_x = cos(1.6543);
fabs, fabsl double fabs(double x); long double fabs(long double x);
#include <math.h>
Calcula el coseno hiperblico de la variable x. Si el argumento pasado a cosh() es demasiado grande, se produce un error de rango.
x = 1.00 printf(x = %f.\n\n,x); y = cosh(x); printf(coseno hiperblico x = %f.\n\n, y);
#include <math.h>
655
#include <math.h>
#include <math.h>
Calcula la hipotenusa de un tringulo rectngulo cuyos lados son x e y. Una llamada a hypot equivale a lo siguiente:
sqrt(x * x, y * y);
Reinicializa el paquete matemtico de coma flotante. Debe utilizarse despus de las llamadas a las funciones system(), exec(), span() sobre mquinas con coprocesadores matemticos.
_fpreset(); // inicializa paquete de coma flotante *t
La funcin frexp descompone el valor x en una mantisa (m) y en un exponente n, tal que el valor absoluto de m es mayor o igual a 0,5 y menor que 1,0 y x + m*2n. La mantisa se obtiene por la funcin, y el exponente se almacena en la variable apuntada por exp.frexpl descompone un valor long double.
656
ldesp, ldespl
#include <math.h>
double ldesp(double x, int exp); long double ldexpl(long double x, int exp);
stderr, la variable global errno toma el valor EDOM y devuelve el valor HUGE_VAL. Si x es 0, la funcin imprime un mensaje de error SING en stderr, devuelve el valor HUGE_VAL y fija errno a ERANGE.
hdouble x, y; x = 10; y = log(x); y = log10(x);
#inxlude <stdlib.h>
Calcula el cociente y el resto de la divisin x/y. La funcin ldiv devuelve una estructura de tipo ldiv_t que comprende el cociente y el resto.
typedef struct { long quot; long rem; } ldiv_t; long x = 5258625, y = 341654; ldiv_t resultado; resultado = ldiv(x, y); printf(el cociente y el resto es %ld, %ld,\n, resultado.quot, resultado.rem);
Se utiliza _lrotl para rotar a la izquierda los bits de una variable entera larga sin signo x. La rotacin de un bit a la izquierda, una posicin, significa que el bit ms a la izquierda sale fuera y se inserta en su posicin el siguiente bit de mayor peso, y los restantes bits se desplazan una posicin a la izquierda.
unsigned long x = 0x0fac45491; printf(x desplazado 4 veces es, _lrotl (x, 4);
Rota a la derecha los bits de x. Rotacin a derecha de un bit significa salir fuera el bit de menor peso y los restantes se desplazan una posicin a la derecha.
val_r = _lrotr(x, 4);
log, log10
#include <math.h>
Calcula el logaritmo natural (neperiano) y el logaritmo en base 10 de x. Si x es negativo, ambas funciones devuelven un error de dominio DOMAIN en
657
Esta funcin manipula errores matemticos. Las funciones matemticas llaman a la rutina adecuada matherr cuando se detecta un error. Se puede desarrollar su propia versin de matherr para personalizar su tratamiento de errores. Para profundizar en esta funcin, consultar su referencia en Library Reference de Borland C++ (pgs. 352-353). Funciones relacionadas: Las funciones matemticas.
max (tipo) max(a, b); #include <conio.h>
polar
#include <complex.h>
Devuelve el mayor de dos valores. Ambos argumentos y la declaracin de la funcin deben ser del mismo tipo.
double dbl1, dbl2, dblmax; dblmax = max(dbl1, dbl2);
Se utiliza poly para evaluar un polinomio en x, de grado n y cuyos coeficientes son los correspondientes al array c. La expresin utilizada para evaluar el polinomio es:
c[n]xn+c[n-1]n-1+...+c[2](x2+c[1](x+c[0]
// polinomio: 3x**2 + 2x + 1// double c[] = {-10.0,2,c);
Devuelve el menor de dos valores. Ambos argumentos y la declaracin de la funcin deben ser del mismo tipo.
int i1, i2, minent; minent = min(i1, i2);
int rand(void);
double modf(double x, double *partent); long double modfl(long double x, long double *partent);
La funcin modf divide un nmero de coma flotante en dos partes, entera y decimal. La parte entera de x se almacena en la posicin a cuya direccin apunta partent, y la parte decimal es devuelta por la funcin.
pardecimal = modf(36.95, &parte_entera(; // parte entera 36, parte decimal .95
Genera un nmero pseudoaleatorio en el rango de 0 a RAND_MAX; esta constante simblica est definida en <stdlib.h> y su valor es 215-1. Para inicializar el generador de nmeros pseudoaleatorios se debe utilizar randomize. Para obtener un nmero en el rango de 0 a (n-1) hay que utilizar random.
// visualizar 10 nmeros aleatorios // for(i = 0; 1 < 10; i++) printf(%6d\, rand());
658
random
#include <stdlib.h>
void randomize(void);
Inicializa (genera una semilla) el generador de nmeros pseudoaleatorios con una semilla aleatoria que es funcin de la hora actual. Esta funcin impide que se repitan las mismas secuencias de nmeros aleatorios en diferentes ejecuciones.
randomize();
Devuelve la parte real de un nmero complejo x o convierte un nmero BCD a float, double o long double.
complex z = complex(x, y) cout << parte real: << real(z) << \n;
659
#include <math.h>
tanh
F.13.
Las rutinas de manipulacin de buffers son una forma general de las rutinas de manipulacin de cadenas que operan sobre stas en C. Son tiles para trabajar con reas de memoria sobre la base de carcter a carcter. Un buffer es un array de caracteres similar a una cadena de caracteres. Sin embargo, al contrario que las cadenas, los buffers no terminan normalmente con un carcter nulo (\0). Por consiguiente, las rutinas de manipulacin de buffers siempre toman un argumento longitud o cuenta. Las rutinas de manipulacin requieren que el archivo de cabecera <mem.h> se incluya en su programa.
memccpy
Funciones relacionadas: _clear87, _control87. Copia n bytes desde s a dest hasta que n bytes han sido copiados o c se copia a dest.
tan #include <math.h> #include <complex.h> res = memccpy(buf_dest, bufen, c, 81);
memchr
660
memmove
void
Mueve n bytes de un buffer (f) a otro (dest). Funciones relacionadas: memccpy, memcpy, movedata.
memset #include <string.h>
Compara n bytes de un buffer (b1) con los de otro buffer (b2). Devuelve un valor:
< 0 si b1 < b2 = 0 si b1 = b2 > 0 si b1 > b2 resultado = memcmp(buf1, buf2, sizeof(buf1));
Mueve n bytes desde ss a ds, donde ss es el segmento fuente, so es el desplazamiento fuente, ds es el segmento destino, do es el desplazamiento destino y n es el nmero de bytes que hay que mover.
movedata(seg1, off, seg2, dest_off, 4096);
int memicmp (const void *b1, const void *b2, size_t n);
Compara un nmero de bytes de un buffer (b1) con otro (b2) sin hacer caso del tamao de las letras en los dos buffers.
if(memicmp(buf1, buf2, 15) == 0) puts(Los buffers son iguales en los 15 primeros bytes \n);
661
setmem
#include <mem.h>
#include <conio.h>
Fija un bloque de long bytes en el buffer dest al carcter c. setmem es til para inicializar buffers.
setmem(buffer, 60, t);
Copia un nmero par de bytes de una posicin a otra, intercambiando al mismo tiempo cada par de bytes adyacentes.
swab(mnpq, resultado, 4); // resultado es nmpq
Borra la lnea completa que contiene el cursor y desplaza hacia arriba las lneas que haya debajo.
delline();
Funciones relacionadas: clreol, clrscr. Funciones relacionadas: Slo est disponible en sistemas UNIX.
gettext #include <conio.h>
F.14.
Las funciones de presentacin de texto permiten definir coordenadas de una ventana de texto en la pantalla y manipular texto. Con estas funciones se puede posicionar texto en cualquier parte de la pantalla, seleccionar atributos de texto (tales como subrayado, vdeo inverso, parpadeo, colores de fondo y primer plano), as como actuar sobre ventanas de texto. Estas funciones se encuentran esencialmente en el archivo de cabecera conio.h.
clreol void clreol(void); #include <conio.h>
int gettext(int izda, int arriba, int derecha, int abajo, void *textbuf);
Copia el contenido de un rea rectangular de la pantalla al buffer cuya direccin se da en el argumento textbuf. Todas las coordenadas son absolutas.
if(!gettext(1,1,30,20, pan_grabada)) puts(color);
Devuelve informacin relativa a las coordenadas de la ventana actual, posicin del cursor dentro de la ventana, atributo del texto, las dimensiones
662
Inserta una lnea en blanco en la ventana de texto actual en la posicin del cursor, desplazando el resto de las lneas situadas debajo.
insline();
#include <conio.h>
Mueve el cursor a una posicin especificada (columna x, fila y) dentro de la ventana de texto actual.
gotoxy(15, 4);
iont movetext(int izda, int arriba, int dcha, int abajo, int nuevoizda, int nuevoarriba);
Copia el contenido de una zona rectangular de la pantalla (en modo texto) a otro rectngulo en la pantalla de las mismas dimensiones.
if (!movetext(1, 1, 30, 20, 40, 40)) puts(victoria);
#include <conio.h>
#include <conio.h>
Reinicializa los atributos de texto al valor que tenan antes de que arranque el programa.
normvideo();
#include <conio.h>
663
puttext
#include <conio.h>
#include <conio.h>
int puttext(int izda, int arriba, int dcha, int abajo, void *textbuf);
#include <conio.h>
#include <conio.h>
Establece el color del primer plano del texto visualizado por cprintf y cputs. El argumento puede tomar un valor entre 0 BLACK (negro) y 15 WHITE (blanco).
textcolor(15);t
Cambia la forma del cursor en modo texto. El argumento tiene que ser una de las constantes.
_NOCURSOR _SOLIDCURSOR _NORMALCURSOR
setcursortype(_SOLIDCURSOR);
#include <conio.h>
Fija el atributo de texto a atrib. Se utiliza para controlar la apariencia del texto en la pantalla.
textattr(YELLOW + (RED << 4)); textattr(10110100);
ltimo modo de texto. Monocromo 40 columnas. Color 40 columnas. Monocromo 80 columnas. Color 80 columnas. Monocromo 80 columnas. EGA 43 filas o VGA 50 filas.
textmode(C40);
664
wherex wherey
#include <conio.h>
window
#include <conio.h>
void window(int izda, int arriba, int dcha, int abajo); int wherex(void); int wherey(void);
Define una regin rectangular de la pantalla como la ventana de texto actual esquina superior izquierda (izda, arriba) y esquina inferior derecha (dcha, abajo).
window(15, 5, 54, 14); // ventana de 40 x 10 con origen en (15, 5)
Determina la coordenada x (wherex) y la coordenada y (wherey) de la posicin del cursor en la ventana actual.
xpos = where(x); ypos = where(y);