Seraphinux
“Lloramos por el lamento de un pájaro pero no por la sangre de un pez, benditos aquellos que tienen voz.”

Archive for the ‘Lenguaje C’ Category

C: Leer archivos grandes (>4GB)

Friday, October 17th, 2008

Hace un rato estaba platicando con un amigo del trabajo y me comento que hizo un programa en C que tenia que leer archivos demasiado grandes (del orden de los GB) y que al momento de ejecutarlo simplemente el programa decia “ahorita no, pasa mañana” XDDD

Asi que me dije a mi mismo: -”mi mismo entonces ¿como le hacen los programas para leer videos de hasta 10GB?“- Asi que me dispuse a hacer mi programa y efectivamente el programa usual para leer archivos tronaba:


#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
  int i = 0;

  char nomFichero[4] = "dvd";
  FILE *source;
  char ch;

  unsigned int leer[100000];

  source = fopen(nomFichero, "rb");

  if(!source)
  {
    printf("Error: El archivo no existe o no pudo ser abierto.");
    printf("\n");
    return -1;
  }

  fread( leer, sizeof(unsigned int), 100000, source );

  for(i = 0; i < 10000; i ++)
  {
    printf("%d", leer[i]);
  }

  printf("\n");

  if(!fclose(source))
      printf( "Fichero cerrado\n" );
   else
   {
      printf( "Error: fichero NO CERRADO\n" );
      return -1;
   }
}

Asi que me dije -”A ching** ¿a caso es cosa del demonio?“- El punto es que me puse a investigar y encontre que este problema surge por la limitación que tienen las máquinas de 32 bits de manejar hasta 4GB de memoria (o algo asi). Asi que probe mi programa en una maquina de 64 bits y paso exactamente lo mismo… no mas no queria.

Segui investigando y encontré que el error surge cuando fopen intenta leer el ultimo byte del archivo, hablando de tamaños de GB obviamente se iba a tardar, por tanto para este tipo de cosas era mejor usar otra función llamada fopen64, la probe y efectivamente funciono; por cierto fopen64 esta incluida en la libreria “stdio.h” el codigo quedo finalmente asi:


#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
  int i = 0;

  char nomFichero[4] = "dvd";
  FILE *source;
  char ch;

  unsigned int leer[100000];

  source = fopen64(nomFichero, "rb");

  if(!source)
  {
    printf("Error: El archivo no existe o no pudo ser abierto.");
    printf("\n");
    return -1;
  }

  fread( leer, sizeof(unsigned int), 100000, source );

  for(i = 0; i < 10000; i ++)
  {
    printf("%d", leer[i]);
  }

  printf("\n");

  if(!fclose(source))
      printf( "Fichero cerrado\n" );
   else
   {
      printf( "Error: fichero NO CERRADO\n" );
      return -1;
   }
}

Asi funciono perfectamente bien, por cierto no solo existen fopen64; tenemos a nuestra disposición: fopen64(), freopen64(), fseeko64(), ftello64(), fgetpos64(), fsetpos64(), etc.

Espero les sea de utilidad :D

Posts Relacionados

C: isNumerico, isAlpha, etc… para cadenas

Friday, October 17th, 2008

Problema

Necesitas comprobar que todos los elementos de un array sean de un tipo determinado (AlphaNumerico, Numerico, etc…)

Solucion


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int
isNumeric(const char *val)
{
  int i = 0, s = 0;

  for(i = 0; i < strlen(val); i++)
    if(isdigit(val[i]) == 0)
      s = -1;

  return s;
}

int
isAlpha(const char *val)
{
  int i = 0, s = 0;

  for(i = 0; i < strlen(val); i++)
    if(isalnum(val[i]) == 0)
      s = -1;

  return s;
}

int
main(int argc, char *argv[])
{
  char datos_num[11] = "0123456789";
  char datos_alpha[11] = "0ABCDEFGHI";
  char datos_mal[11] = "0A;Z56T:-?¿";

  //Salida: Es numerico: 0
  printf("Es numerico: %d", isNumeric(datos_num));
  //Salida: Es numerico: -1
  printf("Es numerico: %d", isNumeric(datos_alpha));
  //Salida: Es numerico: -1
  printf("Es numerico: %d", isNumeric(datos_mal));

  //Salida: Es alpha: 0
  printf("Es alpha: %d", isAlpha(datos_num));
  //Salida: Es alpha: 0
  printf("Es alpha: %d", isAlpha(datos_alpha));
  //Salida: Es alpha: -1
  printf("Es alpha: %d", isAlpha(datos_mal));

  return 0;
}

Nota

Como fácilmente te podras dar cuenta solo extendimos la funcionalidad de las funciones “ctype.h” de caracteres a cadenas. Por tanto puede tambien extender la funcionalidad de funciones tales como: isascii, iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspace, isupper, isxdigit, toascii.

Posts Relacionados

C: Funcion trim, ltrim y rtrim

Thursday, October 16th, 2008

Problema

Necesitas eliminar todos los espacios en blanco a la izquierda o a la derecha o en ambos lados de un char array.

Solución


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char
*rtrim(char *str)
{
  char *endStr = 0;
  endStr = str + strlen(str) - 1;

  while( (endStr >= str) &amp;amp;&amp;amp; (*endStr == ' '))
    *endStr-- = '\0';

  return str;
}

char
*ltrim(char *str)
{
  char *startStr = 0;

  startStr = str;

  while(*startStr == ' ')
    startStr++;

  return startStr;
}

char
*trim(char *str)
{
  return ltrim(rtrim(ltrim(str)));
}

int
main(int argc, char *argv[])
{
  char str[] = "     seraphinux     ";

  //      SALIDA: Original: |     seraphinux     |
  printf("        Original: |%s|\n", str);

//SALIDA: Despues de ltrim: |seraphinux     |
  printf("Despues de ltrim: |%s|\n", ltrim(str));

//SALIDA: Despues de rtrim: |     seraphinux|
  printf("Despues de rtrim: |%s|\n", rtrim(str));

//SALIDA: Despues de trim:  |seraphinux|
  printf("Despues de trim:  |%s|\n", trim(str));

  exit(0);

}
Posts Relacionados

C: Funcion Substring

Tuesday, October 14th, 2008

Problema

Necesitas extraer una subcadena de un char array.

Solución


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char
*substring(size_t start,
           size_t end,
       const char *cad,
             char *subcad,
           size_t size)
{
   int count = end - start;

   if ( count >= --size )
   {
      count = size;
   }

   sprintf(subcad, "%.*s", count, cad + start);

   return subcad;
}

int
main(int argc, char *argv[])
{
  char cadOrigen[11] = "seraphinux";
  char cadDestino[7];

  substring(       0,
                   6,
           cadOrigen,
          cadDestino,
   sizeof cadDestino);  

  // Salida: Seraph
  printf("%s \n", cadDestino);

  return 0;
}
Posts Relacionados