/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Dividir un fichero en otros varios ficheros

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
NathanD



Registrado: 03 Oct 2012
Mensajes: 18

MensajePublicado: 25/02/2013 6:15 am
Título: Dividir un fichero en otros varios ficheros

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.

Donde estoy atascado es en dividir el contenido del primer fichero en los demás. Quiero decir, no sé cómo hacer para dividir, por ejemplo, la primera mitad en el primer fichero, y la segunda en el segundo.

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


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

         fichero_dest = fopen(fich_dest_nombre, "w");
         while( ! feof(fichero_orig) )
         {
            cantidad= fread( buffer, 1, sizeof(buffer), fichero_orig);
            
            fwrite( buffer, 1, cantidad, fichero_dest);
         }
         fclose(fichero_orig);
      }


He probado varias cosas, pero nada.

Gracias de antemano y saludos.
Volver arriba
leosan



Registrado: 19 Abr 2012
Mensajes: 730
Ubicación: GRAN CANARIA

MensajePublicado: 25/02/2013 11:18 am
Título: Re: Dividir un fichero en otros varios ficheros

NathanD escribió:
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.

Cita:

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:

/* Copiador de ficheros a trozos en C*/

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

  int main()  {
  FILE *fichOrg, *fichDest; /* Los dos ficheros */
  char *buffer; /* El buffer para guardar lo que leo */
  char nombreOrg[80], /* Los nombres de los ficheros */
  nombreDest[80],nombreDest1[80],partes[80];
  long longitud; /* Tamaño del fichero */
  long cantidad; /* El número de bytes leídos */
  int i,num_partes=4;
    /* Accedo al fichero de origen */
    printf("Introduzca el nombre del fichero Origen: ");
    scanf("%s",nombreOrg);
    if ((fichOrg = fopen(nombreOrg, "rb")) == NULL)  {
      printf("No existe el fichero origen!\n");
      exit(1);
    }
    /* Y ahora al de destino */
    printf("Introduzca el nombre del fichero Destino: ");
    scanf("%s",nombreDest);
    strcpy(nombreDest1, nombreDest);

    if ((fichDest = fopen(nombreDest, "wb")) == NULL)  {
      printf("No se ha podido crear el fichero destino!\n");
      exit(2);
    }
    /* Miro la longitud del fichero de origen */
    fseek(fichOrg, 0, SEEK_END);
    longitud = ftell(fichOrg);
    fseek(fichOrg, 0, SEEK_SET);
    if ((fichDest = fopen(nombreDest, "wb")) == NULL)  {
      printf("No se ha podido crear el fichero destino!\n");
      exit(2);
    }
    /* Reservo espacio para leer todo */
    buffer = (char *) malloc (longitud);
    if (buffer == NULL)  {
      printf("No se ha podido reservar tanto espacio!\n");
      exit(3);
    }

    for(i=0; i <num_partes; i++) {
      sprintf(partes, "00%i_", i);
      strcat(partes,nombreDest1 );
      if ((fichDest = fopen(partes, "wb")) == NULL)  {
        printf("No se ha podido crear el fichero destino!\n");
        exit(4);
      }
      /* Leo una parte de los datos a la vez */
      fseek(fichOrg, i*longitud/num_partes, SEEK_SET);
      cantidad = fread( buffer, 1, longitud/num_partes, fichOrg);
      /* Escribo tantos como haya leído */
      fwrite(buffer, 1, cantidad, fichDest);
      if (cantidad != longitud/num_partes)
        printf("Cuidado: no se han leido (ni copiado) todos los datos\n");
      strcpy(nombreDest1, nombreDest);
    }
    /* Cierro los ficheros */
    fclose(fichOrg);
    fclose(fichDest);
    return 0;
}


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.Wink

Saluditos!. .....

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


Ultima edición por leosan el 25/02/2013 2:41 pm; editado 1 vez
Volver arriba
NathanD



Registrado: 03 Oct 2012
Mensajes: 18

MensajePublicado: 25/02/2013 2:02 pm
Título:

Muchas gracias por todo leosan Very Happy Very Happy Very Happy
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com