elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ¿Por qué no funciona correctamente este programa? Ficheros inside
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Por qué no funciona correctamente este programa? Ficheros inside  (Leído 2,926 veces)
NathanD

Desconectado Desconectado

Mensajes: 48


Ver Perfil
¿Por qué no funciona correctamente este programa? Ficheros inside
« en: 25 Febrero 2013, 18:38 pm »

Tengo que hacer un programa que coja un fichero de texto y lo divida en otros varios archivos, de extensión .001, .002, etc. En cuántas partes quiere dividirlo, lo introduce el usuario. Mi programa funciona a veces sí, a veces no...

Os dejo el bucle principal del código:

Código:

cantidad_por_fich = fread( buffer, 1, sizeof(buffer), fichero_orig);
cantidad_por_fich /= num_partes;

for(i=0; i < num_partes; i++)
{
fichero_orig= fopen(fich_nombre, "r");
strcpy(fich_dest_nombre, fich_nombre);
sprintf(buffer_nombre, ".00%i", i);
strcat(fich_dest_nombre, buffer_nombre);

fichero_dest = fopen(fich_dest_nombre, "w");
while( ! feof(fichero_orig) )
{
fseek(fichero_orig, pos, SEEK_CUR);
fread( buffer, 1, sizeof(buffer), fichero_orig);

fwrite( buffer, 1, cantidad_por_fich, fichero_dest);
pos += num_partes;
}
fclose(fichero_orig);
}


« Última modificación: 25 Febrero 2013, 19:20 pm por NathanD » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: ¿Por qué no funciona correctamente este programa? Ficheros inside
« Respuesta #1 en: 25 Febrero 2013, 19:13 pm »

En el calculo de las partes no consideras si el numero de caracteres en el archivo no es múltiplo del tamaño de cada parte, en ese escenario perderías la ultima.

No necesitas de tres llamadas a función para generar el nombre, en su lugar puedes utilizar sprintf de esta forma:
Código
  1. sprintf(fich_dest_nombre, "%s.%03d", fich_nombre, i);

El nombre del archivo generado se almacena en el array "fich_dest_nombre" pero tu llamas a fopen usando el array "fitx_dest_izena", aquí no se si es un error del programa o de traducción. Caso similar con "fitxategi_orig".

Mejor publica el código fuente del programa (reducido al mínimo, por supuesto).

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
NathanD

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Re: ¿Por qué no funciona correctamente este programa? Ficheros inside
« Respuesta #2 en: 25 Febrero 2013, 19:19 pm »

En el calculo de las partes no consideras si el numero de caracteres en el archivo no es múltiplo del tamaño de cada parte, en ese escenario perderías la ultima.

No necesitas de tres llamadas a función para generar el nombre, en su lugar puedes utilizar sprintf de esta forma:
Código
  1. sprintf(fich_dest_nombre, "%s.%03d", fich_nombre, i);

El nombre del archivo generado se almacena en el array "fich_dest_nombre" pero tu llamas a fopen usando el array "fitx_dest_izena", aquí no se si es un error del programa o de traducción. Caso similar con "fitxategi_orig".

Mejor publica el código fuente del programa (reducido al mínimo, por supuesto).

Un saludo
Ah sí, se me ha ido la cabeza con la traducción del euskera al castellano, jajaja.
En línea

NathanD

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Re: ¿Por qué no funciona correctamente este programa? Ficheros inside
« Respuesta #3 en: 25 Febrero 2013, 20:20 pm »

En el calculo de las partes no consideras si el numero de caracteres en el archivo no es múltiplo del tamaño de cada parte, en ese escenario perderías la ultima.

No necesitas de tres llamadas a función para generar el nombre, en su lugar puedes utilizar sprintf de esta forma:
Código
  1. sprintf(fich_dest_nombre, "%s.%03d", fich_nombre, i);

El nombre del archivo generado se almacena en el array "fich_dest_nombre" pero tu llamas a fopen usando el array "fitx_dest_izena", aquí no se si es un error del programa o de traducción. Caso similar con "fitxategi_orig".

Mejor publica el código fuente del programa (reducido al mínimo, por supuesto).

Un saludo
¿Entonces se trata de que sea múltiplo o no? Entonces, debería primero ver los caracteres que hay en el fichero, y ofrecer al usuario la posibilidad de dividir el archivo en cantidades que sean divisoras del número de caracteres, ¿no?
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: ¿Por qué no funciona correctamente este programa? Ficheros inside
« Respuesta #4 en: 25 Febrero 2013, 20:30 pm »

Aunque ya te conteste en el otro foro, por si te sirve ahí va eso:

Cita de: NathanD
Buenas, bueno pues después del anterior problema se me presenta éste. Quiero dividir un fichero en varias partes, por ejemplo:

fichero.txt -> fichero.txt.001, fichero.txt.002, fichero.txt.003, etc.

Supongo que habrás querido decir

fichero.txt -> fichero.001.txt, fichero.002.txt, fichero.003.txt, etc.

ya que en caso contrario pierdes el "tipo" de fichero.

Citar
Donde estoy atascado es en dividir el contenido del primer fichero
........................

El bucle principal del código que he hecho es éste, que en lugar de dividir el primer fichero, copia todo el contenido.
........................................

Bueno, yo no soy experto ni en C ni en ficheros ni en nada, pero este código hace lo que pretendes:

Código
  1. /* Copiador de ficheros a trozos en C*/
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7.  int main()  {
  8.  FILE *fichOrg, *fichDest; /* Los dos ficheros */
  9.  char *buffer; /* El buffer para guardar lo que leo */
  10.  char nombreOrg[80], /* Los nombres de los ficheros */
  11.  nombreDest[80],nombreDest1[80],partes[80];
  12.  long longitud; /* Tamaño del fichero */
  13.  long cantidad; /* El número de bytes leídos */
  14.  int i,num_partes=4;
  15.    /* Accedo al fichero de origen */
  16.    printf("Introduzca el nombre del fichero Origen: ");
  17.    scanf("%s",nombreOrg);
  18.    if ((fichOrg = fopen(nombreOrg, "rb")) == NULL)  {
  19.      printf("No existe el fichero origen!\n");
  20.      exit(1);
  21.    }
  22.    /* Y ahora al de destino */
  23.    printf("Introduzca el nombre del fichero Destino: ");
  24.    scanf("%s",nombreDest);
  25.    strcpy(nombreDest1, nombreDest);
  26.  
  27.    if ((fichDest = fopen(nombreDest, "wb")) == NULL)  {
  28.      printf("No se ha podido crear el fichero destino!\n");
  29.      exit(2);
  30.    }
  31.    /* Miro la longitud del fichero de origen */
  32.    fseek(fichOrg, 0, SEEK_END);
  33.    longitud = ftell(fichOrg);
  34.    fseek(fichOrg, 0, SEEK_SET);
  35.    if ((fichDest = fopen(nombreDest, "wb")) == NULL)  {
  36.      printf("No se ha podido crear el fichero destino!\n");
  37.      exit(2);
  38.    }
  39.    /* Reservo espacio para leer todo */
  40.    buffer = (char *) malloc (longitud);
  41.    if (buffer == NULL)  {
  42.      printf("No se ha podido reservar tanto espacio!\n");
  43.      exit(3);
  44.    }
  45.  
  46.    for(i=0; i <num_partes; i++) {
  47.      sprintf(partes, "00%i_", i);
  48.      strcat(partes,nombreDest1 );
  49.      if ((fichDest = fopen(partes, "wb")) == NULL)  {
  50.        printf("No se ha podido crear el fichero destino!\n");
  51.        exit(4);
  52.      }
  53.      /* Leo una parte de los datos a la vez */
  54.      fseek(fichOrg, i*longitud/num_partes, SEEK_SET);
  55.      cantidad = fread( buffer, 1, longitud/num_partes, fichOrg);
  56.      /* Escribo tantos como haya leído */
  57.      fwrite(buffer, 1, cantidad, fichDest);
  58.      if (cantidad != longitud/num_partes)
  59.        printf("Cuidado: no se han leido (ni copiado) todos los datos\n");
  60.      strcpy(nombreDest1, nombreDest);
  61.    }
  62.    /* Cierro los ficheros */
  63.    fclose(fichOrg);
  64.    fclose(fichDest);
  65.    return 0;
  66. }
  67.  

El secreto está, además de como crear las partes, en "situarse" en una posición y leer hasta ahí para posteriormente escribir y volver al punto dónde nos quedamos y volver a repetir el proceso. O sea, mírate bien la instrucción fseek que ya te había mencionado en el otro tema  ;-)

Saluditos!.

P.D: ¿Me puedes pasar vía "mp" la página de los emoticones?. Gracias.
:laugh:
En línea

NathanD

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Re: ¿Por qué no funciona correctamente este programa? Ficheros inside
« Respuesta #5 en: 25 Febrero 2013, 22:58 pm »

Ya sé por qué no funcionaba mi código, no era más que un error tonto... En cada vuelta del bucle, a la posición del primer carácter que se debía copiar, le sumaba la variable equivocada. Le estaba sumando el número de partes en las que se iba a dividir el fichero, en lugar de la cantidad de caracteres que se debían de copiar a cada ciclo. Es decir, en lugar de
Código:
pos += num_partes;

Tenía que poner
Código:
pos += cantidad_por_fich

Muchas gracias a todos por vuestra atención, de veras, vuestra dedicación es impagable  ;) ;)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines