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
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 RelacionadosProblema
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; (*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
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